Service笔记本

参考链接:https://www.jianshu.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

你可能感兴趣的:(Service笔记本)