参考链接://www.greatytc.com/p/cc25fbb5c0b3
一、Service生命周期
- onCreate():
首次创建服务时,系统将调用此方法。如果服务已在运行,则不会调用此方法,该方法只调用一次。 - onStartCommand():
当另一个组件通过调用startService()请求启动服务时,系统将调用此方法。 - onDestroy():
当服务不再使用且将被销毁时,系统将调用此方法。 - onBind():
当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法。 - onUnbind():
当另一个组件通过调用unbindService()与服务解绑时,系统将调用此方法。 - onRebind():
当旧的组件与服务解绑后,另一个新的组件与服务绑定,onUnbind()返回true时,系统将调用此方法。
二、生命周期方法
在Service的生命周期里,常用的方法有:
- 手动调用的方法:
startService() 启动服务
stopService() 关闭服务
bindService() 绑定服务
unbindService() 解绑服务 - 自动调用的方法:
onCreat() 创建服务
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()
需要注意的是:
service的onCreate只会执行一次,onBind也只会执行一次,onStartCommand可以执行多次
也就是说一旦service创建过了,而又没有被销毁的话,不管是再次调用bindService还是startService都不会再走onCreate, onBind也只会执行一次,多次调用startService会多次执行onstartCommand
有时候我们需要多次调用startService执行onstartCommand一次怎么办?
我们可以直接判断service是否正在运行,如果正在运行,就不再startService
参考链接:https://blog.csdn.net/yuzhiqiang_1993/article/details/78211385
四、onStartCommand中的falgs参数解析
flags参数的值有四个:
- START_STICKY_COMPATIBILITY
- START_STICKY
- START_NOT_STICKY
- START_REDELIVER_INTENT
START_STICKY 如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随 后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,
那么参数Intent将为null。
START_NOT_STICKY “非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
START_REDELIVER_INTENT 重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
START_STICKY_COMPATIBILITY START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
五、Android8.0 启动服务
Android8.0 有一项复杂功能;系统不允许后台应用创建后台服务
因此,Android 8.0 引入了一种全新的方法,即 Context.startForegroundService()
,以在前台启动新服务。
在系统创建服务后,应用有五秒的时间来调用该服务的 startForeground()
方法以显示新服务的用户可见通知。
如果应用在此时间限制内未调用 startForeground()
,则系统将停止服务并声明此应用为ANR