知识点:
- service的生命周期
- 应用场景
一、service的生命周期
1.1 startService执行的生命周期是 :
onCreate→onStartCommand→onDestroy
多次执行startService 只会回调onStartCommand
1.2 bindService执行的生命周期是:
onCreate→onBind→onUnbind→onDestroy
如果在onBind中处理了对应的binder,则会执行对应ServiceConnection中的onServiceConnected(),但是onServiceDisconnected() 在连接正常关闭的情况下是不会被调用的, 该方法只在Service 被破坏了或者被杀死的时候调用. 例如, 系统资源不足, 要关闭一些Services, 刚好连接绑定的 Service 是被关闭者之一, 这个时候onServiceDisconnected() 就会被调用。
(ps:bindservice的启动还要根据第三个参数来判断,这里采用默认值)
1.3 混合使用
startService()->binderService()
onCreate→onStartCommand→onBind→onUnbind→onDestroy
bindService()->startService
onCreate→onBind→onStartCommand→onUnbind→onDestroy
注意: 混合使用场景,不论先后调用顺序,都无法直接调用stopService()去停止任务,必须先通过unBindService解绑
直接调用unBindService: 只回调onUnbind()
调用过stopService再调用unBindService: 回调onUnbind()+onDestory
1.4多进程场景
两个进程分别调用startService启动一个服务,然后其中一个调用stopService
onCreate->onStartCommand->onStartCommand->onDestory
两个进程分别调用binService,其中一个调用unBindService
onCreate->onBind->onBind->onUnbind
两个进程分别调用binService,两个都调用unBindService
onCreate->onBind->onBind->onUnbind->onUnbind->onDestory
混合使用与1.3类似,不过从上面也能看出,必须要全部绑定过的进程都调用unBindService之后服务才能真正触发onDestory
二、 应用场景
2.1 startService
该类型一般只用来把一些与前台无关的工作放到后台中,前台不在意这些工作,但是应用退出不会自动销毁服务
2.2 bindService
该类型一般是前台把一些比较耗时或者需要一直工作并且需要反馈信息给回前台的时候使用,比如后台播放,但是前台需要知道进度,不过应用退出也自动销毁服务
2.3 startService和bindService混合使用
该类型一般是需要把后台任务信息反馈给前台,并且退出应用也不关闭后台服务,就是则行了startService和bindService之后,在退出应用只做unBindService不做stopSerivice的时候,比如后台下载任务
总结
service启动模式以及生命周期在面试当中会经常被问题,而且熟悉生命周期的回调也有助于我们在日常开发中使用service会得心应手,aidl用起来也很简单啦