面试过程中经常会遇到一些试题或者面试官问你startService 和 bindService 的区别,今天我们就来分析分析这两种启动service方式的差异
通过startService 启动service
Service会经历 onCreate –> onStart
stopService的时候直接onDestroy
如果是 调用者 直接退出而没有调用stopService的话,Service会一直在后台运行。
下次调用者再起来仍然可以stopService。
通过bindService 启动service
Service只会运行onCreate, 这个时候 调用者和Service绑定在一起
调用者退出了,Srevice就会调用onUnbind–>onDestroyed
所谓绑定在一起就共存亡了。
注意:Service的onCreate的方法只会被调用一次,
就是你无论多少次的startService又 bindService,Service只被创建一次。
如果先是bind了,那么start的时候就直接运行Service的onStart方法,
如果先是start,那么bind的时候就直接运行onBind方法。如果你先bind上了,就stop不掉了,
只能先UnbindService, 再StopService,所以是先start还是先bind行为是有区别的。
startService()和bindService()两种模式是完全独立的。你可以绑定一个已经通过startService()方法启动的服务。例如:一个后台播放音乐服务可以通过startService(intend)对象来播放音乐。可能用户在播放过程中要执行一些操作比如获取歌曲的一些信息,此时activity可以通过调用bindServices()方法与Service建立连接。这种情况下,stopServices()方法实际上不会停止服务,直到最后一次绑定关闭。
如果没有程序停止它或者它自己停止,service将一直运行。在这种模式下,service开始于调用Context.startService() ,停止于Context.stopService(). service可以通过调用Android Service 生命周期() 或 Service.stopSelfResult()停止自己。不管调用多少次startService() ,只需要调用一次 stopService() 就可以停止service。
可以通过接口被外部程序调用。外部程序建立到service的连接,通过连接来操作service。建立连接调开始于Context.bindService(), 结束于Context.unbindService(). 多个客户端可以绑定到同一个service,如果service没有启动, bindService() 可以选择启动它。
这2种模式不是完全分离的。你可以可以绑定到一个通过startService()启动的服务。如一个intent想要播放音乐,通过startService() 方法启动后台播放音乐的service。然后,也许用户想要操作播放器或者获取当前正在播放的乐曲的信息,一个activity就会通过bindService()建立一个到此service的连接. 这种情况下 stopService() 在全部的连接关闭后才会真正停止service。
Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。
服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。
这两个方法都可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,
即使调用者退出了,服务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。
如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,
但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。
如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,
接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,
接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,
多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。
如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()–>onDestroy()方法.
转载地址
http://mp.weixin.qq.com/s?__biz=MzAwOTUyNzI3Ng==&mid=2652070998&idx=1&sn=674a537dccd5e1eae7ece04c658d3ef4&scene=23&srcid=0508sQr1DQiQIFsywhUQlI8k#rd
面试过程中经常会遇到一些试题或者面试官问你startService 和 bindService 的区别,今天我们就来分析分析这两种启动service方式的差异通过startService 启动service Service会经历 onCreate –> onStart stopService的时候直接onDestroy 如果是 调用者 直接退出而没有调用stopService的话,Servic
学习完Activity的启动流程后,接着学习Service的启动流程和
绑定
流程。
1.Service的启动流程
和Activity一样,Service的启动过程我们可以看成两个部分:
ContextImpl到AMS的调用过程(从应用程序进程到System
Server
进程)
ActivityThread启动Service (从System
Server
进程回到应用程序进程)
1.1 Context...
前面已经对Service的s
tar
t
Server
方式启动一个服务了解过了,现在来看一下Service的另一种启动方式→
bind
Server
bind
Server
使用场景
1、在同个app之间调用(即是同一个进程中)
2、在不同app之间调用(即是跨进程间通信)
同个app间调用(只有一次启动该服务)
Bind
erActicityA
public class
Bind
erActi
在Activity中使用
bind
Service
绑定
Service时,会调用ContextWrapper的
bind
Service方法
http://
android
xref.com/9.0.0_r3/xref/frameworks/base/core/java/
android
/content/ContextWrapper.java
@Override
public boolean
bind
Servi...
文章目录一、梳理Java中NIO代码二、Netty服务端代码1、new NioEventLoopGroup()2、group3、channel4、Nio
Server
SocketChannel.class5、childHandler6、
bind
一、梳理Java中NIO代码
Java中的NIO其本质是网络层面定义中的多路复用IO模型(一定要和NIO模型区分开)。NIO代码主要分为下列几步:
初始
Server
SocketChannel
初始化Selector,
完成Selector和Channel的绑
问题1:首先
bind
server
启动服务,可以
绑定
服务 ,
然后s
tar
t
server
,可以启动服务,
此时再次调用
bind
server
启动服务,都不执行
server
里面的方法了
具体原因不知道,临时解决方法 1,把s
tar
t
server
启动的服务停止stop
server
; 2,第一次
bind
server
启动的服务结束后,应该主动un
bind
server
,然后再停止stopse
frameworks/base/services/core/java/com/
android
/
server
/am/
- ActivityManagerService.java
- ActiveServices.java
- ServiceRecord.java
- Pr...
百度google大家多说的是任务管理器 kill掉adb 或者重启adb
server
,但我任务管理器就没有adb ,猜测是某个程序占用了adb端口。于是按此思路查找。
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
发现6540占用了 5037端
面试的时候被问到这样一个问题,
绑定
server
之后如果不解绑,程序会Crash吗?我擦,蒙逼了,回去之后试了试,不会异常,但是会泄漏1.异常一:先看一下报的异常吧12-09 21:03:31.596 5771-5771/com.oblivion.changeactivity I/System.out: oncreate
12-09 21:03:31.596 5771-5771/com.oblivio