Android之Servie生命周期探索
Service的生命周期
1.Service生命周期的回调方法
onCreate():首次创建Service;
onStartCommand():当另一组件调用startService()启动Service;
onDestroy():当Service不再使用且将要销毁;
onBind():当另一组件调用bindService()与Service绑定时,系统将调用此方法;
onUnbind():当另一组件调用unbindService()与Service解除绑定时系统将调用此方法;
onRebind():当旧的组件与Service解绑后另一新组件与Service绑定,onUnbind()返回true时,系统将调用此方法;
2.非绑定模式
第一次调用startService()时候执行的方法依次为onCreate()、onStartCommand()、onStart(),当Service关闭的时候调用onDestroy();
调用Context的startService()方法,相应的服务就会启动起来,并回调 onStartCommand()方法。如果这个服务之前还没有创建过,onCreate()方法会先于onStartCommand()方法执行。服务启动了之后会一直保持运行状态,直到stopService()或 stopSelf()方法被调用。
虽然每调用一次startService()方法,onStartCommand()就会执行 一次,但实际上每个服务都只会存在一个实例。所以不管你调用了多少次 startService()方法,只需调用一次 stopService()或 stopSelf()方法,服务就会停止下来了。
3.绑定模式
第一次调用bindService(),执行的方法依次为onCreate()、onBind(),解除绑定的时候会执行onUnbind()、onDestroy()。
调用 Context 的bindService()来获取一个服务的持久连接,这时就会回调服务中的onBind()方法。类似地,如果这个服务之前还没有创建过,onCreate()方法会先于 onBind()方法执行。之后,调用方可以获取到 onBind()方法里返回的 IBinder 对象的实例,这样就能自由地和服务进行通信了。只要调用方和服务之间的连接没有断开,服务就会一直保持运行状态。
调用startService()后又去调用 stopService()方法,这时服务中的 onDestroy()方法就会执行,表示服务已经销毁了。
调用bindService()方法后,又去调用unbindService()方法,onDestroy()方法也会执行,这两种情况都很好理解。
Service创建到销毁生命周期过程
Start服务
其他组件调用startService()创建然后保持运行,必须通过调用stopSelf()自行终止。其他组件也可以通过调用stopService()终止这类服务。服务终止后系统会把它销毁。
如果一个Service被startService()方法多次启动,onCreate()方法也只调用一次,onStart()方法将会被多次调用,系统只会创建一个Service实例,所以stopService只需要调用一次就可以停止服务。该Service将会一直在后台运行不管对应程序的Activity是否在运行,直到调用stopService(),或者自身调用stopSelf()。
如果系统资源不足,Android系统也可能结束服务。
Bind服务
调用bindService()创建,然后客户通过一个IBinder接口与服务进行通信,客户端可以通过unbindService()来关闭连接。多个客户端可以绑定在同一个服务上,当所有的客户端都解除绑定后,系统会销毁服务(Bind服务不需要自行终止)。
如果一个Service被某个Activity调用Context.bindService方法绑定启动,不管调用bindService几次,onCreate()方法都只会调用一次,同时onStart()方法始终不会被调用。当连接建立之后,Service将会一直运行,除非调用Context.unbindService()断开连接或者之前调用bindService()的Context不存在了,系统将会自动停止Service,对应onDestroy()将被调用。
可以绑定到一个已经用startService()启动的服务上,这种情况stopService()或stopSelf()不会真的终止服务,除非所有的客户端都解除了绑定。
onStartCommand()返回值介绍
START_STICKY
如果Service进程被Kill,保留Service的状态为开始状态,但不保留递送的Intent对象。随后系统会尝试重新创建Service,由于服务为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法,如果在此期间没有任何启动命令被传递到Service,那么参数Intent将为null;
START_NOT_STICKY
非黏性,使用这个返回值如果在执行完onStartCommand后Service被异常Kill,系统不会自动重启该服务;
START_REDELIVER_INTENT
重传Intent使用这个返回值,如果在执行完onStartCommand()后Service被异常Kill,系统会自动重启该服务,将该Intent的值传入。
START_STICKY_COMPATIBILITY
START_STICKY的兼容版本,不保证服务被Kill后一定能重启;
onCreate()方法和onStartCommand()到底有什么区别?
Service的onCreate()和onStartCommand()方法的区别跟Activity的onCreate()和onStart()方法区别差不多。
onCreate()方法是在Service第一次创建的时候调用的,onStartCommand()在每次启动服务的时候都会调用,由于是第一次点击 Start Service按钮,Service此时还未创建过,所以两个方法都会执行,之后如果你再连续多点击几次 Start Service按钮,就只有 onStartCommand()方法可以得到执行了。
onRebind(Intent)在什么情况下执行
在onUnbind()方法返回true的情况下会执行。