Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍 (3)

然后再原来的工程,将配置文件中的MessengerService的exported属性设置为true,否则外界将无法调用此Service。

<service android:name=".messager.MessengerService" android:exported="true" android:process=":remote" />

此时,工程结构如下:

Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍

运行IpcClient工程,点击按钮,首先在Android Monitor中切换到cn.codingblock.ipc:remote进程查看log如下:

.../cn.codingblock.ipc:remote I/MessengerHandler: handleMessage: MSG_FROM_CLIENT:client bind messenger succeed!(from ipc_client)

然后将进程切换到cn.codingblock.ipcclient中log如下:

.../cn.codingblock.ipcclient I/MessengerActivity: handleMessage: MSG_FROM_SERVICE:ok,I will reply you soon! 5、Messenger可以传输的数据类型包括:

简单来说,Messenger可以传输Message可承载的数据类型,而Message中能使用的载体有:what、arg1、arg2、Bundle和replyTo,其实Message中还有一个Object类型的载体,这个载体在同一个进程中非常使用,但是在Android2.2之前object字段不支持跨进程传输,在2.2之后也仅支持系统提供的实现Parcelable接口的对象。所以总结起来,Messenger在跨进程时可传递的类型如下:

Bundle类型

Messenger类型

小结

本篇介绍了四种比较简单的跨进程通信方式,这四种实现起来相对方便,但功能也非常有限,在后续的博文中将介绍AIDL和Socket的使用。下面的表格为以上四种跨进程通信方式的比较:

名称 优点 缺点 场景
Bundle   使用简单   1、只能传输Bundle支持的类型 2、不支持RPC   四大组件间的通信  
文件共享   使用简单   1、不适合并发 2、做不到即时通信   无并发访问、不要求实时通信的场景  
ContentProvider   1、在数据源访问方面功能强大 2、支持一对多 3、可通过call方法扩展其他操作   受约束的AIDL、主要提供数据的CRUD操作   一对多的进程间数据共享  
Messenger   1、支持一对多串行通信 2、支持实时通信   1、只能串行通信 2、只能传输Bundle支持的类型 3、不支持RPC   低并发一对多即时通信、无RPC需求  

最后想说的是,本系列文章为博主对Android知识进行再次梳理,查缺补漏的学习过程,一方面是对自己遗忘的东西加以复习重新掌握,另一方面相信在重新学习的过程中定会有巨大的新收获,如果你也有跟我同样的想法,不妨关注我一起学习,互相探讨,共同进步!

参考文献:

《Android开发艺术探索》

源码地址:本系列文章所对应的全部源码已同步至github,感兴趣的同学可以下载查看,结合代码看文章会更好。源码传送门

本文作者:CodingBlock 文章链接:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpfdzz.html