进程间通信(IPC机制)精炼详解

时间:2024-04-09 21:35:15

一、前期基础知识储备

IPC定义:IPC是intent-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通信的方式的优缺点,开发者可以根据自己的实际情况,选择最合适的IPC通信方式。

 

总结(看文章的正确方式,就是看总结):引用一个问题:这种跨进程的通信(包括AIDL)在商业上应用的多吗,一般在什么场合下会用到?

答:定制Android设备或项目比较大的时候。例如:电视、手表等设备 一般都有一个桌面程序,但里面的小功能太多,例如:听歌、相册、节目表等等,很多,如果把所有的功能都写在一个程序,每次加载都把东西一股脑的加载到内存里占用就太大了,后台内存不够要回收的时候就有可能把桌面的主程序收走了,这肯定不是理想的效果,所以遇到比较大的项目的时候,需要将每个小模块抽取成一个独立进程的小应用,但这些模块之间也需要互相通知,所以要用到跨进程通讯,这样做就不用一次性的加载到内存里,如果内存不够的时候可以先把不可见或者空闲的应用先回收。