[Android进程间通信-3]bindService原理

1,167 阅读2分钟

原理概述

    简单来说,发起bindservice的APP进程会传入ServiceConnection对象,然后通过AIDL方式 ,AMS会调用IServiceConnection中的connect方法传入目标服务的IBinder,connect方法中会调用serviceConnection回调将IBInder对象回传给APP进程。

    对于系统进程,通过AMS中的ActiveServices对象,判断服务是否启动,启动则直接通过IServiceConnection回调告知APP进程结果,并将绑定的binder回传过去。如果服务启动了,但是没有绑定,那么会先绑定服务,获取到IBinder,然后再通过IServiceConnection将IBInder回传过去。最后是针对没启动的服务,会先将服务启动,然后再回传IBinder。

ServiceConnection原理-3.png

详细流程

    下方是流程详细图。

ServiceConnection原理-1 (2).png

APP进程中的对象
  • ContextImpl

主要暴露接口给APP进程,由APP通过bindService方法传入ServiceConnection接口,通过该接口回调IBinder对象。同时,通过AIDL,将对应的IServiceConnection对象传给AMS,通知对应服务进行bind处理。

  • LoadedApk

存活在APP进程,主要用于管理 ServiceDispatcher ,缓存传入的ServiceConncetion对象和ServiceDispatcher的映射关系。选择出IServiceConnection给ContextImpl。

  • ServiceDispatcher

主要用于缓存IServiceConnection和ServiceConnection的映射关系。

  • InnerConnection

App进程核心类,主要用于等待IServiceConnection接口被系统进程调用,connect方法被调用后,通过ServiceConnection告知APP进程,返回IBinder对象。

系统进程中的对象
  • ActivityManagerService

在此处相当于一个对App进程的代理类,对服务的核心处理在ActiveServices中。

  • ActiveServices

该类本质是用于管理服务的生命周期以及启动服务,对于bindservice来说,

  1. 主要是判断目标service是否允许被APP进程bind,比如权限问题。
  2. 判断目标服务是否已经启动
  3. 判断目标服务是否已经绑定了该进程,是的话就直接返回IBInder。如果没绑定那么先进行绑定,再返回IBinder
  4. 最后服务没启动的话,就直接启动服务进程,最后返回其IBinder。
  • ServiceRecord

系统进程服务甚多,ServiceRecord主要用于记录服务,intent,APP进程和IServiceConnection的映射关系。

结构如下:

ServiceConnection原理-2.png

服务Service所在的进程
  • ActivityThread

一个APP最开始的核心类,主要用于启动目标服务所在的APP进程。启动后通过AIDL告知AMS。AMS再对服务做处理回调IServiceConnection。