美文网首页
Android AIDL Binder Messenger

Android AIDL Binder Messenger

作者: twohuoone | 来源:发表于2017-03-21 09:57 被阅读50次

    那么,什么叫基于消息的进程间通信方式呢?看个图理解下:

    可以看到,我们可以在客户端发送一个Message给服务端,在服务端的handler中会接收到客户端的消息,然后进行对应的处理,处理完成后,再将结果等数据封装成Message,发送给客户端,客户端的handler中会接收到处理的结果。

           介入正题,跨进程通讯可以通过Binder来实现,在android中最容易实现的跨进程通讯可以通过两个独立的app来实现,一个作为Server一个作为client;

    首先,在Server中创建一个Service,然后重点来了,在onBind方法中返回的IBinder我们可以用两个东西来替换从而实现跨进程通讯:1.Messenger 2.AIDL文件;

    如果使用Messenger,在onBind方法中我们使用Messenger.getBinder()方法,

    通过上述代码,可以发现最终的MessengerImpl类继承IMessenger.Stub,所以归根到底都是ADIL的实现机制。

    然后来讲一下AIDL的实现方法,Binder的连接形式是以Server和Client在两端,Binder在中间充当一个中间者,为了两端各自的安全,Binder提供给两端的是Proxy,其中用到了Proxy设计模式,而且这个代理中只有空的方法,

    举个例子:

    Client端想获取Server端的add()方法返回的数据,就会告诉Binder需要add()返回数据,进程之间通信的数据都会经过运行在内核空间里面的驱动,驱动在数据流过的时候做了一点手脚,它并不会给Client进程返回一个真正的object对象,而是返回一个看起来跟object一模一样的代理对象objectProxy,这个objectProxy也有一个add方法,但是这个add方法没有Server进程里面object对象的add方法那个能力;objectProxy的add只是一个傀儡,它唯一做的事情就是把参数包装然后交给驱动,最终通过Binder向Server提交获取add方法的请求,然后获取到数据最终返回给Client。

    然后现在我们深入了解下AIDL和Binder的工作方式,因为表达能力有限,这边我会引用鸿神的原话,当然你们也可以直接看他的博客,今后尽量不做搬运工:http://blog.csdn.net/lmj623565791/article/details/38461079

    以上是我自己学习以后的认识,源码在鸿神博客中也有,如有问题可以留言,那是相当欢迎;

    相关文章

      网友评论

          本文标题:Android AIDL Binder Messenger

          本文链接:https://www.haomeiwen.com/subject/oemwnttx.html