宏观上Binder机制

Binder机制分析
Binder机制小案例(进程通信)
进程A

创建aidl文件,编译生成对应的java文件

进程A创建一个Service

注册
进程B
创建和进程A一模一样的aidl文件,包括实际的包路径

进程B开启服务
带着问题读源码
onBind的返回值是怎么到onServiceConnected的IBinder参数的?
Context mBase Context的实现类是ContextImpl
bindService()—》mBase.bindService(service, conn, flags)--》bindServiceCommon(service, conn, flags, Process.myUserHandle())

这里调用的是ActivityManagerProxy的bindService(),ActivityManagerProxy是proxy

ActivityManagerNative类的getDefault()方法

还是进程B,得到系统的IBinder引用,就可以调用到系统进程的方法了

转换成Proxy,还是进程B

这里还是进程B,直到调用transact(),这里mRemote是系统返回的IBinder引用

进入系统进程,transact是Binder类里面的方法,实现了IBinder接口,ActivityManagerNative 继承了Binder类调用ActivityManagerNative的onTransact()

系统进程的onTransact(),根据BIND_SERVICE_TRANSACTION定位到这里,这里bindService()的参数全是进程B的信息

还在系统进程,ActivityManagerNative的实现类ActivityManagerService的bindService()

ActiveServices类的bindServiceLocked()方法

bindServiceLocked()方法后面的代码,flags值是Context.BIND_AUTO_CREATE

bringUpServiceLocked()方法关键代码,创建Service

realStartServiceLocked()方法关键代码,创建Service

发送创建Service消息

handleCreateService()创建了,并调用了Service生命周期,把Service放入集合中
进程A和Service已经有了,接下来就剩绑定了

ActiveServices的bindServiceLocked()方法里绑定Service

绑定服务,r.app.thread是进程A

按理说这里的mRemote.transact是跨进程到进程B,但是mRemote是系统的Binder,这里有疑问???以后补充

到这里就知道con回调了