后台服务、前台服务的启动方式,以及前台服务在安卓8以后的差异。

后台服务、前台服务的启动方式,以及前台服务在安卓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,也就是说需要有一个有效的通道。

所以就要创建一个有效的通道:

有效的通道的作用就是用来显示在通知中心的菜单中,并且可以让用户自主选择打开或者关闭接收这个通知。

前台服务以绑定的方式启动,可参照后台服务方式。


你可能感兴趣的:(后台服务、前台服务的启动方式,以及前台服务在安卓8以后的差异。)