Android 平台四大组件之一,主要用来执行一些不与用户交互的长期运行的一些操作。
Service 的声明
- 需要在 AndroidManifest.xml 文件中 application 节点中的 service 节点申明
- apk 安装之后,PMS 从清单文件中解析 service 节点,并生成对应的数据结构
Service 的分类
后台服务
- 对用户而言是不可感知的,如后台文件下载
- 启动服务: startService()
1 2 3 4 5 6 7 8
// Context.startService() -> ContextImpl.startServiceCommon() -[IPC 到 SystemServer 进程]-> // AMS.startService() -> ActiveServices.startServiceLocked() -> // [retreiveServiceLocked(): ServiceLookupResult ->] AMS.startServiceInnerLocked() -> // bringUpServiceLocked(): String // case1已经启动: -> sendServiceArgsLocked() -> ActivityThread.ApplicationThread.shcheduleServiceArgs() -> // ActivityThread.handleServiceArgs() -> Service.onStartCommand() // case2未启动: -> ActivityThread.ApplicationThread.scheduleCreateService() -> // ActivityThread.handleCreateService() -> Service.onCreate()
- 停止服务:stopService()
1 2 3 4
// Context.stopService() -> ContextImpl.stopServiceCommon() -[IPC 到 SystemServer 进程]-> // AMS.stopService() -> ActiveServices.stopServiceLocked() -> // ActivityThread.ApplicationThread.scheduleStopService() -> ActivityThread.handleStopService() -> // Service.onDestroy()
- 生命周期:onCreate() -> onStartCommand() -> onDestroy()
前台服务
- 对用户而言是可以感知的,比如音乐播放
- 启动服务 startForegroundService()
1
// Context.startForegroundService() -> ContextImpl.startServiceCommon() -> 同后台服务
- 停止服务:stopService()
1
// 流程同后台服务
- 生命周期:同后台服务
bind 服务
- 主要提供 c/s 接口,允许组件与 Service 进行交互或者跨进程通讯
- 绑定服务:bindService()
1 2 3 4 5 6 7 8 9 10
// Context.bindService() -> // LoadedApk.getServiceDispatcher(): IServiceConnection -> LoadedApk.ServiceDispatcher.getIServiceConnection() // ServiceDispatcher.InnerConnection // ContextImpl.bindServiceCommon() -[IPC 到 SystemServer]> AMS.bindService() -> // ActiveServices.bindServiceLocked() -> retreiveServiceLocked() -> bringUpServiceLocked() -> // case1 Service 已经创建:sendServiceArgsLocked() -> ActivityThread.ApplicationThread.scheduleServiceArgs() -> // case2 Service 未创建:realStartServiceLocked() -> ActivityThread.ApplicationThread.scheduleCreateService() -> // ActivityThread.handleCreateService() -> Service.onCreate() // requestServiceBindingLocked() -> ActivityThread.ApplicationThread.scheduleBindService() -> // ActivityThread.handleBindService() -> Service.onBind()
- 解除绑定:unbindService()
1 2 3 4 5 6
// Context.unbindService() -> ContextImpl.unbindService() -[IPC 到 SystemServer]-> // AMS.unbindService() -> ActiveServices.unbindServiceLocked() -> removeConnectionLocked() -> // ActivityThread.ApplicationThread.scheduleUnbindService() -> ActivityThread.handleUnbindService() -> // Service.onUnbind() -> // ActiveServices.bringDownServiceIfNeededLocked() -> bringDownServiceLocked() -...-> scheduleStopService() -> // ActivityThread.handleStopService() -> Service.onDestroy()
- bind 服务的 3 种方式
- 扩展 Binder : 同一个进程内提供服务
- 使用 Messenger : IPC,单线程
- 使用 aidl : IPC,多线程