Service是由framework层的ActivityServiceManager管理的生命周期长、运行于后台的服务性组件。Service本身是运行在当前应用进程的主线程中,但是可以在Service中开辟子线程以实现音乐播放、数据库交互、文件操作等耗时操作(因为绝大多数情况下Service没有前台界面)。需要在manifest文件中声明Service
manifest中的部分参数配置说明
- android:exported 是否允许被包名不同的应用调用。设为false时表示只能被当前应用或同一用户ID的应用启动或绑定
- adnroid:name 服务相对于整个应用包的路径,可以填写完整路径,也可以只写Service的相对路径
启动方式
Service有两种启动方式,分别通过startService方法和bindService方法启动
-
startService
通过这种方法启动的Service,在启动它的应用退出后,仍然会继续运行,除非服务自身调用stopSelf()或者外部接口调用stopService()方法才能停止服务;当服务停止时,系统会销毁服务 -
bindService
通过这种方法启动的Service,是与启动他的应用绑定在一起的,即应用退出时,该服务也退出;如果要停止服务,需要调用unBindService()方法> 通过startService启动的服务可以被绑定,即通过bindService()方法与Activity绑定。此时如果需要关闭Service,需要先调用方法unBindService()然后stopService(),否则Service是不会被关闭的
生命周期
服务的生命周期
服务的生命周期根据启动方式的不同而略有差异。如同Activity生命周期一样,在生命周期每个阶段,分别会发出不同的回调方法;与Activity不同之处是Service的回调方法中不需要实现基类的方法(super)
-
通过onStartService()启动
- 不论调用几次startService(),Service中onCreate()方法只调用一次,但是每次都会调用onStartCommand()
- 当调用stopService() / stopSelf()时,如果此时Service未与任何组件绑定,会直接调用onDestroy()方法销毁服务
-
通过onBindService()绑定
- 不论调用几次bindService(),Service中onCreate()方法只调用一次,但是每次都会调用onBind()
- 当调用unBindService()时,系统会回调一个onUnbind()回调方法,然后再销毁服务
-
先通过onStartService()启动,再通过onBindService()绑定
- 不论调用几次startService(),Service中onCreate()方法只调用一次,但是每次都会调用onStartCommand()
- 当终止Service时,需要先unbindService(),再stopService()。如果先调用stopService()将不会停止Service
附加参数
onStartCommand() 提供一个返回值,告诉系统在onStartCommand()方法调用结束后Service被kill时如何重启Service。返回值有如下几种
- START_STICKY 如果Service被kill,那么系统会在随后试图重新启动Service,但是不会继续使用前次传入的Intent对象
- START_NOT_STICKY 如果Service被kill,系统不会试图重新启动Service
- START_REDELIVER_INTENT 类似于START_STICKY,但是会重新传入Intent对象
- START_STICKY_COMPATIBILITY START_STICKY的兼容版本,当START_STICKY不好使时可以试一下这个参数
Foreground Service
使用Foreground Service,使Service在内存回收中获得更高优先级,比后台Service更不容易被系统kill
通过在Service的onStartCommand()回调方法中调用startForeground()方法,可以让Service在前台运行
通过调用stopForeground()方法,可以让Service停止前台运行,但是Service本身不会被停止
Remote Service
当Service需要被其他应用调用时,该Service相对于其他应用而言是一个Remote Service(远程服务)。此时服务与应用分别处于不同的进程中,需要跨进程通信(IPC)。Android中采用AIDL(Android Interface Defination Language)协议进行跨进程通信
参考资料
Android中Service类onStartCommand
Android Service的生命周期
Android中Service的使用详解和注意点
Android中Service(服务)详解
使用startForeground让android服务前台运行
网友评论