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中的消息来逐一执行。因此,多线程模型就编程单线程模型了。