Posts Service
Post
Cancel

Service

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,多线程
This post is licensed under CC BY 4.0 by the author.