🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
Binder是为了解决跨进程通信。 关于Binder的文章实在是太多了,每篇文章都能从Java层讲到C++层,App开发人员其实是没必要了解这么多内容的。我们看对App开发有用的几个点: 1)首先,Binder分为Client和Server两个进程。 > **注意**,Client和Server是相对的。谁发消息,谁就是Client,谁接收消息,谁就是Server。 举个例子,两个进程A和B之间使用Binder通信,进程A发消息给进程B,那么这时候A是Binder Client,B是Binder Server;进程B发消息给进程A,那么这时候B是Binder Client,A是Binder Server——其实这么说虽然简单了,但还是不太严谨,我们先这么理解着。 2)其次,我们看下面这个图(摘自田维术的博客),基本说明白了Binder的组成解构: ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170516223325025-1448613892.png) 图中的IPC就是进程间通信的意思。 图中的ServiceManager,负责把Binder Server注册到一个容器中。 有人把ServiceManager比喻成电话局,存储着每个住宅的座机电话,还是很恰当的。张三给李四打电话,拨打电话号码,会先转接到电话局,电话局的接线员查到这个电话号码的地址,因为李四的电话号码之前在电话局注册过,所以就能拨通;没注册,就会提示该号码不存在。 对照着Android Binder机制,对着上面这图,张三就是Binder Client,李四就是Binder Server,电话局就是ServiceManager,电话局的接线员在这个过程中做了很多事情,对应着图中的Binder驱动 3)接下来我们看Binder通信的过程,还是摘自田维术博客的一张图: ![](http://images2015.cnblogs.com/blog/13430/201705/13430-20170516223354650-984999229.png) > **注**:图中的SM也就是ServiceManager。 我们看到,Client想要直接调用Server的add方法,是不可以的,因为它们在不同的进程中,这时候就需要Binder来帮忙了。 * 首先是Server在SM这个容器中注册。 * 其次,Client想要调用Server的add方法,就需要先获取Server对象, 但是SM不会把真正的Server对象返回给Client,而是把Server的一个代理对象返回给Client,也就是Proxy。 * 然后,Client调用Proxy的add方法,SM会帮他去调用Server的add方法,并把结果返回给Client。 以上这3步,Binder驱动出了很多力,但我们不需要知道Binder驱动的底层实现,涉及到C++的代码了——把有限的时间去做更有意义的事情。 App开发人员对Binder的掌握,这些内容就足够了。 **总结**: 学习Binder,是为了更好的理解AIDL,基于AIDL模型,进而了解四大组件的原理。 理解了Binder,再看AMS和四大组件的关系,就像是Binder的两个进程Server和Client通信。