Android 中 Service 的生命周期
在 Android 中 Service 与 Activity 类似,Service 也有自己的生命周期,在不同的时刻,系统会调用对应的 Service 生命周期函数,不过与 Activity 声明周期相比,Service 的生命周期更加简单,如下图:
Service 作为 Android 四大组件之一,应用非常广泛。和 Activity 一样,Service 也有一系列的生命周期回调函数,我们可以用来监测 Service 状态变化,并且在适当的时候执行适当的工作。
一、生命周期状态
生命周期方法说明
onCreate() :
首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。
onStartCommand() :
当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。
onDestroy() :
当服务不再使用且将被销毁时,系统将调用此方法。
onBind() :
当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法。
onUnbind() :
当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。
onRebind() :
当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。
二、生命周期方法
在Service的生命周期里,常用的方法有:
手动调用的方法 :
startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务
自动调用的方法 :
onCreate() 创建服务
onStartCommand() 开始服务
onDestroy() 销毁服务
onBind() 绑定服务
onUnbind() 解绑服务
三、生命周期调用
1. 启动Service服务
单次:startService() —> onCreate() —> onStartCommand()
多次:startService() —> onCreate() —> onStartCommand() —> onStartCommand()
2. 停止Service服务
stopService() —> onDestroy()
3. 绑定Service服务
bindService() —> onCreate() —> onBind()
4. 解绑Service服务
unbindService() —> onUnbind() —> onDestroy()
5. 启动绑定Service服务
startService() —> onCreate() —> onStartCommand() —> bindService() —> onBind()
6. 解绑停止Service服务
unbindService() —> onUnbind() —> stopService() —> onDestroy()
7. 解绑绑定Service服务
unbindService() —> onUnbind(ture) —> bindService() —> onRebind()
四、总结
(1) 被启动的服务的生命周期
如果一个 Service 被某个 Activity 调用 Context.startService() 方法启动,那么不管是否有 Activity 使用 bindService() 绑定或 unbindService() 解除绑定到该 Service,该 Service 都在后台运行。如果个 Service 被 startService() 方法多次启动,那么 onCreate() 只会调用一次,onStart() 将会被调用多次(对应调用 startService() 的次数),并且系统只会创建 Service 的一个实例。该 Service 将会一直在后台运行,而不管对应程序的 Activity 是否在运行,直到被调用 stopService(),或自身的 stopSelf() 方法。当然如果系统资源不足,android 系统也可能结束服务。
(2) 被绑定的服务的生命周期
如果一个 Service 被某个 Activity 调用 Context.bindService() 方法绑定启动,不管调用 bindService() 调用几次,onCreate 方法都只会调用一次,同时 onStart() 方法始终不会被调用。当连接建立之后,Service 将会一直运行,除非调用 Context.unbindService() 断开连接或者之前调用 bindService() 的 Context 不存在了(如 Activity 被 finish 的时候),系统将会自动停止 Service,对应 onDestroy 将被调用。
(3) 被启动又被绑定的服务的生命周期
如果一个 Service 又被启动又被绑定,则该 Service 将会一直在后台运行。并且不管如何调用,onCreate 始终只会调用一次,对应 startService 调用多少次,Service 的 onStart 便会调用多少次。调用 unbindService 将不会停止 Service,而必须调用 stopService 或 Service 的 stopSelf 来停止服务。
(4) 当服务被停止时清除服务
当一个 Service 被终止(1、调用 stopService;2、调用 stopSelf;3、不再有绑定的连接(没有被启动))时,onDestroy 方法将会被调用,在这里你应当做一些清除工作,如停止在 Service 中创建并运行的线程。