【朝花夕拾】跨进程通信,你只知道AIDL,就OUT了
对应清单文件中的注册
1 <service 2 android:name=".MessengerService "3 android:exported="true"/>
这里需要注意的是第三行,该Service需要提供给其它应用调用,需要将该属性值设置为true。
2、客户端代码实现

3、运行
运行时先启动服务端,再启动客户端,可以看到如下log信息:
1 15185-15185/com.example.messageserver D/Messenger-Demo: receive msg from Client:Hello,Server! How are you ? 2 14269-14269/com.example.messageclient D/Messenger-Demo: receive msg from Server:Hello Client! I am fine, thank you
这样客户端和服务端就完成了一次互相通信。从代码上来看,就能感受到,相比于直接使用AIDL方式,Messenger简洁方便了很多。
四、Messenger的使用步骤
通过前面的Demo直观感受了Messenger的使用,其交互流程大致为一下六步:
对照Demo和上图,应该能够轻松理解Messenger的交互流程了。这里需要注意的是,实际上给Server端的Handler发送消息的Messenger,是结合服务端返回的IBinder实例来生成的服务端远程代理;给客户端Handler发送消息的Messenger也是第4步中发送给服务端的客户端本地Messenger, 可以理解为是自己的Messenger给自己的Handler在发送消息。
五、Messenger和AIDL的联系与区别
前面我们说过Messager的底层还是实现的AIDL,这是它们的联系。它们的区别是:
(1)Messenger使用起来比AIDL简洁方便。
(2)AIDL的客户端接口会同时向服务端发送多个请求,服务端需要应用多线程处理。而Messenger会将所有请求排入队列(Handler对应的MessageQueue),让服务器一次处理一个调用,不用处理多线程问题。大多数情况下,服务端不需要执行多线程处理此时选择Messenger方式更合适,而如果客户端的请求要求服务端执行多线程处理,就应该使用AIDL来实现,选择哪一种,还是需要根据实际情况来选择。
结语
由于笔者水平有限,文章中如果有描述不准确或者不妥当的地方,还请读者不吝赐教,非常感谢!https://www.cnblogs.com/andy-songwei/p/11774836.html