Android开发艺术探索知识回顾——第2章 IPC机制

 

第2章 IPC机制

本章主要讲解 Android 中的 IPC 机制。首先介绍 Android 中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android 中的序列化机制和 Binder,然后详细介绍 Bundle文件共享、AIDLMessengerContentProvider Socket 等进程间通信的方式。

为了更好地使用 AIDL 来进行进程间通信,本章还引入了 Binder 连接池的概念。最后,本章讲解各种进程间通信方式的优缺点和适用场景。通过本章,可以让读者对 Android 中的 IPC 机制和多进程开发模式有深入的理解。

 

2.1 Android IPC 简介

IPC 是 Inter-Process Communication 的缩写,含义为进程间通信或者跨进程通信,是指两个进程之间进行数据交换的过程。说起进程间通信,我们首先要理解什么是进程,什么是线程,进程和线程是截然不同的概念。

按照操作系统中的描述,线程是CPU调度的最小单元,同时线程是一种有限的系统资源。而进程一般指一个执行单元,在PC和移动设备上指一个程序或者一个应用。一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系。最简单的情况下,一个进程中可以只有一个线程,即主线程,在Android里面主线程也叫UI线程,在UI线程里才能操作界面元素。

很多时候,一个进程中需要执行大量耗时的任务,如果这些任务放在主线程中去执行就会造成界面无法响应,严重影响用户体验,这种情况在 PC 系统和移动系统中都存在,在Android中有一个特殊的名字叫做ANR (Application Not Responding) 即应用无响应。解决这个问题就需要用到线程,把一些耗时的任务放在线程中即可。

IPC 不是 Android 中所独有的,任何一个操作系统都需要有相应的 IPC 机制,比如 Windows 上可以通过剪贴板、管道和邮槽等来进行进程间通信;Linux 上可以通过命名管道、共享内容、信号量等来进行进程间通信。可以看到不同的操作系统平台有着不同的进程间通信方式,对于 Android 来说,它是一种基于 Linux 内核的移动操作系统,它的进程间通信方式并不能完全继承自 Linux,相反,它有自己的进程间通信方式。

在 Android 中最有特色的进程间通信方式就是 Binder 了,通过 Binder 可以轻松地实现进程间通信。除了 Binder,Android 还支持 Socket,通过 Socket 也可以实现任意两个终端之间的通信,当然同一个设备上的两个进程通过 Socket 通信自然也是可以的。

说到 IPC 的使用场景就必须提到多进程,只有面对多进程这种场景下,才需要考虑进程间通信。这个是很好理解的,如果只有一个进程在运行,又何谈多进程呢?多进程的情况分为两种。

第一种情况是:一个应用因为某些原因自身需要釆用多进程模式来实现,至于原因,可能有很多,比如有些模块由于特殊原因需要运行在单独的进程中,又或者为了加大一个应用可使用的内存,所以需要通过多进程来获取多份内存空间。Android对单个应用所使用的最大内存做了限制,早期的一些版本可能是16MB,不同设备有不同的大小。

另一种情况是:当前应用需要向其他应用获取数据,由于是两个应用,所以必须采用跨进程的方式,来获取所需的数据,甚至我们通过系统提供的 Contentprovider 去查询数据的时候,其实也是一种进程间通信,只不过通信细节被系统内部屏蔽了,我们无法感知而已。

后续章节会详细介绍 Contentprovider 的底层实现,这里就先不做详细介绍了。总之,不管由于何种原因,我们采用了多进程的设计方法,那么应用中就必须妥善地处理进程间通信的各种问题。

 

2.2 Android中的多进程模式

在正式介绍进程间通信之前,我们必须先要理解 Android 中的多进程模式。通过给四大组件指定 android:process 属性,我们可以轻易地开启多进程模式,这看起来很简单,但是实际使用过程中却暗藏杀机,多进程远远没有我们想的那么简单,有时候我们通过多进程得到的好处甚至都不足以弥补使用多进程所带来的代码层面的负面影响。下面会详细分析这些问题。

 

2.2.1开启多进程模式

正常情况下,在 Android 中多进程是指一个应用中存在多个进程的情况,因此这里不讨论两个应用之间的多进程情况。首先,在Android中使用多进程只有一种方法,那就是给四 大组件 (Activity、Service、Receiver、ContentProvider) AndroidMenifest 中指定 android:process 属性,除此之外没有其他办法,也就是说我们无法给一个线程或者一个实体类指定其运行时所在的进程。

其实还有另一种非常规的多进程方法,那就是通过 JNI 在 native 层去 fork 一个新的进程,但是这种方法属于特殊情况,也不是常用的创建多进程的方式,因此我们暂时不考虑这种方式。下面是一个示例,描述了如何在Android中创建多进程:

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章