defaultServiceManager(); 为什么指向BpServiceManager ,后者如何关联binder仍需要整理

来源:互联网 发布:最新网络歌曲2017 编辑:程序博客网 时间:2024/06/08 19:53

接着binder机制

对于客户端来说,反正拿到接口再说,再找实现类或者代理类,然后调用即可。

客户端都是Ixxx=yyy对吧

这样调用Ixxx里面方法就可以啦


sp<IServiceManager> sm = defaultServiceManager();

跟踪源码,找到真正的指向IServiceManager

frameworks\native\libs\binder\IServiceManager.cpp


getContextObject-----getStrongProxyForHandle




Automutex作用可以看作java中单例模式里面synchronized,互斥锁。

单例模式嘛。

可以看出真正实现是ProcessState::self()->getContextObject(NULL));




最终返回的是result 也就是b,也就是new BpBinder(handle);

而ServiceManager持有的handle就是0。

接着interface_cast转为IServiceManager接口

本质调用的是asInterface,这个在安卓IInterface.cpp中实现



返回一个 new Bp##INTERFACE(IBinder obj)

这里是模板,也就是说返回一个BpServiceManager




好吧。总结一下。IServiceManager =>>BpBinder=>>BpServiceManager


那也就是说以后调用IServiceManager->addService就是BpServiceManager->addService


看看如何添加的吧



BpServiceManager本身没有继承IBinder,所以不具有通信能力,但是他remote()持有一个binder,利用这个就可以发送数据

也就是transact()发送Parcel数据。代理发数据即可----在客户端看来。是不是ATM直接按钮就可以取钱不在乎原理实现,只是给我

一个代理满足即可




0 0
原创粉丝点击