之前的这篇博文排版有问题。。重新写一下。。当复习了==
上次说到Binder的BpBinder是客户端的Proxy,这回我们看看BpBinder是如何具体地与Binder设备交互。
接着上次提到的main()函数
MediaPlayerService::instantiate() { defaultServiceManager()->addService(String16("media.player"),new MediaPlayerService()); }
这里是添加一个服务了,已知defaultServiceManager是一个BpServiceManager对象,即和BpBinder有关。
virtual status_t addService(const String16& name, const sp<IBinder>& service){ .... status_t err=remote()->transact(ADD_SERVICE_TRANSACTION, data, &reply); }
remote()指向的就是BpBinder,终于出现了,这里是让BpBinder去传输数据吗?
其实这个函数最终是由IPCThreadState来调用,IPCThreadState是每个线程特有的一个对象,每个IPCThreadState对象都有一个mIn,mOut,分别用来接收Binder数据和发送Binder数据,这里听起来是不是很合理?用每个线程都存在的一个对象来实现线程之间的交互,包括和Binder的交互。
发送和接收的具体函数呢,就是read()和write()来实现的。
其中,接收到的数据采用switch(case)的方式,对不同类型的命令来进行不同的处理。
看到书中还有很多关于Binder的内容,但是自己一直都消化不来。。包括BBinder,ServiceManager,AIDL这些,可能以后如果有涉及到系统的编程会更懂一些吧!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于