进程间通信(IPC机制)精炼详解
⼀、前期基础知识储备
IPC定义:IPC是Inter-Process Communication的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进⾏数据交换的过程。IPC不是Android所独有的,任何⼀个操作系统都需要有相应的IPC机制,⽐如Windows上可以通过剪贴板、管道和邮槽等来进⾏进程间通信,⽽Linux上可以通过命名共享内容、信号量等来进⾏线程间通信。对于Android来说,它也有⾃⼰的进程间通信⽅式,Android建构在Linux基础上,继承了⼀部分Linux的通信⽅式,同时Android也有⾃⼰特有的通信⽅式。
⼆、Android中实现进程通信的⽅式
如前⽂所讲,Android建构在Linux基础,继承了部分Linux的进程通信⽅式也有⾃⼰的特⾊通信⽅式,所以Android中具体实现通信的⽅式有很多,⽐如可以通过在Intent中附加extra来传递信息,或者通过共享⽂件的⽅式来共享数据,还可以通过采⽤Binder⽅式(Android特⾊)来跨进程通信,另外,ContentProvider天⽣就是⽀持跨进程访问的,因此我们也可以采⽤它来进⾏IPC。此外⽹络通信也是可以实现数据传递的,所以Socket也可以⽤来实现IPC,下⾯展开来具体讲解⼀下:
(1)AIDL
1)AIDL定义——AIDL(Android 接⼝定义语⾔) 是 Android 提供的⼀种进程间通信 (IPC) 机制。我们可以利⽤它定义客户端与服务使⽤进程间通信 (IPC) 进⾏相互通信时都认可的编程接⼝。在 Android 上,⼀个进程通常⽆法访问另⼀个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。编写执⾏这⼀编组操作的代码是⼀项繁琐的⼯作,因此Android 会使⽤ AIDL 来处理。通过这种机制,我们只需要写好 aidl 接⼝⽂件,编译时系统会帮我们⽣成 Binder 接⼝。
2)AIDL ⽀持的数据类型——①Java 的基本数据类型;
②List 和 Map;③其他 AIDL ⽣成的接⼝;④实现 Parcelable 的实体
(2)Messager
Messager可以翻译为信使,顾名思义,通过它可以在不同进程中传递Message对象,在Message中放⼊我们需要传递的数据,就可以轻松实现进程间数据传递了。Messager是⼀种轻量级的IPC⽅案,它的底层实现是AIDL。
Messager的使⽤⽅法很简单,它对AIDL做了封装,使得我们可以更加简便的实现进程间通信。同时,由于它⼀次处理⼀个请求,因此在服务端我们不⽤考虑线程同步的问题,这是因为服务端中不存在并发执⾏的情形。
(3)ContentProvider
ContentProvider是Android中提供的专门⽤于不同应⽤间进⾏数据共享的⽅式,从这⼀点看,它天⽣就是和进程间通信。和Messager⼀样,ContentProvider的底层实现同样也是Binder,由此可见,Binder在Android系统中是何等的重要。虽然ContentProvider的底层实现是Binder,但是它的使⽤过程要⽐AIDL简单许多,这是因为系统已经为我们做好封装,使得我们⽆须关⼼底层细节的实现即可轻松实现IPC。
ContentProvider尽管使⽤起来⽐较简单,包括⾃⼰创建⼀个ContentProvider也不是什么难事,但是,它的细节还是相当多,⽐如CRUD 操作、防⽌SQL注⼊和权限控制等等。
(4)Socket
Socket也称为“套接字”,是⽹络通信中的概念,它分为流式套接字和⽤户数据套接字两种,分别对应于⽹络的传输控制层中的TCP和UDP协议。TCP协议是⾯向连接的协议,提供稳定的双向通信功能,TCP连接的建⽴需要经过“三次握⼿”才能完成,为了提供稳定的数据传输功能,其本⾝提供了超市重传机制,因此具有很⾼的稳定性;⽽UDP是⽆连接的,提供不稳定的单向通信功能,当然UDP也可以实现双向通信功能。
在性能上,UDP具有更好的效率,其缺点是不保证数据⼀定能够正确传输,尤其是在⽹络繁重的时候。
(5)Bundle
我们知道,四⼤组件中的三⼤组件(Activity、Service、BroadcastReceiver)都是⽀持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接⼝,所以它可以⽅便地在不同的进程间进⾏传输。基于这⼀点,当我们在⼀个进程中启动了另⼀个进程的Activity、Service和BroadcastReceiver,我们就可以在Bundle中附加我们需要传输给远程进程的信息并通过Intent发送出去。当然,我们传输的数据必须能够被序列化,⽐如基本类型、实现了Parcellable接⼝的对象、实现了Serializable接⼝的对象以及⼀些Android⽀持的特殊对象,具体内容可以看Bundle这个类。
三、选择合适的IPC⽅式进程通信方式
上⾯这张表很好的总结了⼏种IPC通信的⽅式的优缺点,开发者可以根据⾃⼰的实际情况,选择最合适的IPC通信⽅式。
总结(看⽂章的正确⽅式,就是看总结):引⽤⼀个问题:这种跨进程的通信(包括AIDL)在商业上应⽤的多吗,⼀般在什么场合下会⽤到?
答:定制Android设备或项⽬⽐较⼤的时候。例如:电视、⼿表等设备 ⼀般都有⼀个桌⾯程序,但⾥⾯的⼩功能太多,例如:听歌、相册、节⽬表等等,很多,如果把所有的功能都写在⼀个程序,每次加载都把东西⼀股脑的加载到内存⾥占⽤就太⼤了,后台内存不够要回收的时候就有可能把桌⾯的主程序收⾛了,这肯定不是理想的效果,所以遇到⽐较⼤的项⽬的时候,需要将每个⼩模块抽取成⼀个独⽴进程的⼩应⽤,但这些模块之间也需要互相通知,所以要⽤到跨进程通讯,这样做就不⽤⼀次性的加载到内存⾥,如果内存不够的时候可以先把不可见或者空闲的应⽤先回收。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论