那么,什么叫基于消息的进程间通信方式呢?看个图理解下:
可以看到,我们可以在客户端发送一个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;
以上是我自己学习以后的认识,源码在鸿神博客中也有,如有问题可以留言,那是相当欢迎;
网友评论