后台服务、前台服务的启动方式,以及前台服务在安卓8以后的差异。
创建意图 intent = Intent( contex, xxxService.class )
1、启动:startService ( intent )
主要生命周期:onCreate -》onStartCommand -》onDestroy。
如果服务已经处在启动状态,则直接执行onStartCommand。
停止服务:stopService( intent ) , 也可以在服务中调用stopSelf()
2、以绑定的方式启动:bindService( intent,serviceConnection, flag)
生命周期:
如果通过直接绑定的方式:onCreate -》 onBind -》 onUnbind -》 onDestroy。
如果通过先自行启动再绑定的方式:onCreate -》 onStartCommand -》onBind -》 onUnbind -》 onDestroy。
使用绑定方式启动后的服务,需要通过 unbindService ( serviceConnection ) 来停止服务,生命周期会走 onUnbind -》 onDestroy。
bindService参数介绍:
a、intent同上
b、flag:int类型,通常传入Context.BIND_AUTO_CREATE,表示服务如果没有启动过,则在绑定服务之前会先自动启动服务。
其他的值
* Context.BIND_AUTO_CREATE
* Context.BIND_DEBUG_UNBIND
* BIND_NOT_FOREGROUND
* BIND_ABOVE_CLIENT
* BIND_ALLOW_OOM_MANAGEMENT
* BIND_WAIVE_PRIORITY
* BIND_IMPORTANT
* BIND_ADJUST_WITH_ACTIVITY
c、serviceConnection:ServiceConnection接口的实现,需要重写两个方法
用于绑定的服务
疑惑:
1:在服务解绑执行onBind时,onServiceDisconnected没有执行。
2:在重复绑定时,如果没有重新创建serviceConnection时,onServiceConnected不会执行。
绑定服务的应用:
通过绑定,可以把多个活动绑定到同一个服务,就可以在同一个服务中执行获取数据操作或者耗时操作。
3、前台服务
注意:在编译版本 >= 28时,需要在清单文件中申请权限
与后台服务的区别:
1、前台服务的优先级较高,不易被系统杀死。
2、用户感知不到后台服务的存在,而前台服务因为需要搭配一个通知显示到通知栏,所以能够被用户感知。
开启一个前台服务:
1、首先像启动后台服务那样:startService ( intent ),先启动一个服务。
2、然后在服务的onCreate方法中调用用startForeground( flag, notification )
停止服务的方式与后台服务一样,
参数介绍:
flag:int型,代表这个服务的id,不能为0
notification:Notification对象,用于显示到通知栏。
以上便可以启动一个启动服务了。
但如果编译版本是28以后的话会报以下错误:
原因是8.0以后系统通知的channelId必须是一个有效的id,也就是说需要有一个有效的通道。
所以就要创建一个有效的通道:
有效的通道的作用就是用来显示在通知中心的菜单中,并且可以让用户自主选择打开或者关闭接收这个通知。
前台服务以绑定的方式启动,可参照后台服务方式。