原理概述
简单来说,发起bindservice的APP进程会传入ServiceConnection对象,然后通过AIDL方式 ,AMS会调用IServiceConnection中的connect方法传入目标服务的IBinder,connect方法中会调用serviceConnection回调将IBInder对象回传给APP进程。
对于系统进程,通过AMS中的ActiveServices对象,判断服务是否启动,启动则直接通过IServiceConnection回调告知APP进程结果,并将绑定的binder回传过去。如果服务启动了,但是没有绑定,那么会先绑定服务,获取到IBinder,然后再通过IServiceConnection将IBInder回传过去。最后是针对没启动的服务,会先将服务启动,然后再回传IBinder。
详细流程
下方是流程详细图。
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来说,
- 主要是判断目标service是否允许被APP进程bind,比如权限问题。
- 判断目标服务是否已经启动
- 判断目标服务是否已经绑定了该进程,是的话就直接返回IBInder。如果没绑定那么先进行绑定,再返回IBinder
- 最后服务没启动的话,就直接启动服务进程,最后返回其IBinder。
- ServiceRecord
系统进程服务甚多,ServiceRecord主要用于记录服务,intent,APP进程和IServiceConnection的映射关系。
结构如下:
服务Service所在的进程
- ActivityThread
一个APP最开始的核心类,主要用于启动目标服务所在的APP进程。启动后通过AIDL告知AMS。AMS再对服务做处理回调IServiceConnection。