Android夸进程通信机制系列:
Android夸进程通信机制一:多进程简介
Android夸进程通信机制二:Parcel 与 Parcelable
Android夸进程通信机制三:Messenger与Message
Android夸进程通信机制四:使用 Bundle进行进程间通信
Android夸进程通信机制五:使用文件共享进行进程间通信
Android夸进程通信机制六:使用ContentProvider进行进程间通信
Android夸进程通信机制七:使用 Socket进行进程间通信
Android夸进程通信机制八:使用 AIDL进行进程间通信
Android夸进程通信机制九:AIDL深入了解
...
一. 什么是多进程?
多进程就是多个进程的意思,那么什么是进程呢?
当一个Android应用在开始运行时,系统会为它创建一个进程,一个应用默认只有一个进程,这个进程(主进程)的名称就是应用的包名。
进程的特点:
- 进程是系统资源和分配的基本单位,而我们常见的线程是调度的基本单位。
- 每个进程都有自己独立的资源和内存空间
- 其它进程不能任意访问当前进程的内存和资源
- 系统给每个进程分配的内存会有限制
Android是支持多进程的,当我们需要时,可以利用多进程了,那么什么场景时候多进程呢
类似音乐类、跑步健身类、手机管家类等长时间需要在后台运行的应用,也就是常驻后台任务的应用。
这些应用的特点就是,当用户切到别的应用,或者关掉手机屏幕的时候,应用本身的核心模块还在正常运行,提供服务。如果因为手机内存过低,或者是进程重要性降低,导致应用被杀掉,后台服务停止,对于这些应用来说,就是灭顶之灾。合理利用多进程,将核心后台服务模块和其他UI模块进行分离,保证应用能更稳定的提供服务,从而提升用户体验。
二. 创建多进程
Android多进程创建很简单,只需要在AndroidManifest.xml的声明四大组件的标签中增加”android:process”属性即可。命名之后,就成了一个单独的进程。
process分私有进程和全局进程:
- 私有进程的名称前面有冒号,例如:
<service android:name="yb.demo.myProcesses.MusicService"
android:process=":musicservice"/>
- 全局进程的名称前面没有冒号,例如:
<service android:name="yb.demo.myProcesses.MusicService"
android:process="yb.demo.myProcesses.musicservice"/>
为了节省系统内存,在退出该Activity的时候可以将其杀掉(如果没有人为杀掉该进程,在程序完全退出时该进程会被系统杀掉)。
三. 多进程间的通信
IPC:InterProcess Communication,即进程间通信。
我们知道,同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。那么进程间是如何进行通信的呢?
Android中,有多种方法可以实现进程间的通信,这里先放一个未完成的思维导图,后面细学的时候会完善此图。
Android跨进程通信方式.png
-
AIDL(Android Interface Definition Language,Android接口定义语言)
大部分应用程序不应该使用AIDL去创建一个绑定服务,因为它需要多线程能力,并可能导致一个更复杂的实现。 -
Content Provider
ContentProvider为存储和获取数据提供统一的接口,它可以在不同的应用程序之间共享数据,本身就是适合进程间通信的 -
Socket
Socket 也称为“套接字”,是网络通信中的概念,两个进程可以通过 Socket 来实现信息的传输,Socket 本身可以支持传输任意字节流的。 -
Bundle (A mapping from String values to various Parcelable types)
Bundle和Map类型有异曲同工之妙,同时实现了Parcelable接口,那么显然,它支持进程间通讯,常常与Messenger结合使用。 -
文件
通过文件共享的方式实现。 -
Messenger
利用Handler实现,常常与Bundle结合使用。(适用于多进程、单线程,不需要考虑线程安全),其底层基于AIDL。 -
Binder
Binder是一种基于Client-Server通信模式的通信方式,传输过程只需要一次拷贝,可以为发送方添加UID/PID身份,支持实名Binder和匿名Binder,安全性高。
IPC的实现方式这里只做简单的介绍,后面会议专题的方式对各种方式进行深入的研究。
四、结语
IPC的方式多种多样,各有优势,至于要选择哪一种方式,需要根据实际情况,判断优劣,适当选择。
方式 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Messenger | 功能一般,支持一对多并发通信,支持实时通信 | 不能很好处理高并发情形,不支持RPC,数据通过Message进行传输,因此支持Bundle支持的数据类型 | 低并发一对多的即时通讯,无RPC需求,或无需返回结果的RPC需求 |
Bundle | 简单易用 | 只能传输Bundle支持的数据类型 | 四大组件间的进程间通信 |
文件共享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的即时通信 | 无并发访问情形,交互简单的数据,实时性不高的场景 |
Content Provider | 在数据源访问方面功能强大,支持一对多并发数据共享,可以通过call方法扩展其他操作 | 可理解为受约束的AIDL,主要提供数据源的CRUD操作 | 一对多进程间的数据共享 |
Socket | 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 | 实现细节稍微有点繁琐,不支持直接的RPC | 网络数据交换 |
AIDL | 功能强大,支持一对多串行通信,支持实时通信 | 使用稍为复杂,需要处理好现场同步 | 一对多通信,并且有RPC需求的场景 |
网友评论