宏观上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放入集合中
网友评论