IPC—一张图解释Messenger的设计思想

Posted 從前以後

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IPC—一张图解释Messenger的设计思想相关的知识,希望对你有一定的参考价值。

Aidl和Messanger是android 中常用的IPC方式。首先,Aidl内部是基于Binder的,而Messenger内部又是基于Aidl的。但是messenger和Aidl还是有所区别的。
学习Aidl的时候常会看到:
“Using AIDL is necessary only if you allow clients from different applications to access your service for IPC and want to handle multithreading in your service.”
而学习Messenger的时候:
“if you want to perform IPC, but do not need to handle multithreading, implement your interface using a Messenger.”
从这两句话可以看出Messenger和Aidl的最大区别在于多线程处理方面,事实上正是如此。
首先是Aidl的执行过程。

上图中ct代表客户端线程,bt代表BinderDriver线程。
首先是ct通过transact发送数据给BinderDriver,然后由bt线程去执行server端的方法。如果此时客户端有多个线程,那么BinderDriver 就会产生bt2,bt3…等等线程来执行Server端方法。此时线程是不同步的。
而Messenger恰恰就解决了线程同步的问题,那么是怎么解决的呢?


bt线程在执行的时候,调用handler.sendmessage方法发送消息到server端的MessageQueue中,然后server端的ActivityThread就去循环执行MessageQueue中的方法。尽管会有bt1,bt2…由于bt线程只是负责发送消息到server端的MessageQueue中,而server端的ActivityThread负责逐一取出MessageQueue中的消息来逐一执行。因此,多线程模型就编程单线程模型了。

以上是关于IPC—一张图解释Messenger的设计思想的主要内容,如果未能解决你的问题,请参考以下文章

Android IPC之Messenger浅谈

Android Service IPC通信之Messenger机制

Messenger Service可以用于跨应用IPC吗?

Messenger实现进程间通信(IPC)

❤️ Android IPC 之 Messenger使用 ❤️

❤️ Android IPC 之 Messenger使用 ❤️