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分私有进程和全局进程:

  • 私有进程的名称前面有冒号,例如:
  • 全局进程的名称前面没有冒号,例如:

为了节省系统内存,在退出该Activity的时候可以将其杀掉(如果没有人为杀掉该进程,在程序完全退出时该进程会被系统杀掉)。

三. 多进程间的通信

IPC:InterProcess Communication,即进程间通信。

我们知道,同一个进程的多个线程是共享该进程的所有资源,但多个进程间内存是不可见的,也就是说多个进程间内存是不共享的。那么进程间是如何进行通信的呢?

Android中,有多种方法可以实现进程间的通信,这里先放一个未完成的思维导图,后面细学的时候会完善此图。


Android夸进程通信机制一:多进程简介_第1张图片 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需求的场景

更多相关文章

  1. (一)Android事件分发机制 - View篇
  2. Android事件分发/传递机制总结
  3. Android系统启动流程(2) —— 解析Zygote进程启动过程
  4. Android中的Parcel机制 实现Bundle传递对象
  5. Android事件分发机制 详解攻略
  6. Android夸进程通信机制七:使用 Socket进行进程间通信

随机推荐

  1. 用HTML标签写常见的注册页面
  2. 内联框架和视频标签
  3. vscode之emmet语法快速生成代码
  4. vscode 前端程序员开发中常用的扩展
  5. Markdown常用语法
  6. css样式
  7. 安装vscode, chrome 使用chrome检查器
  8. css选择器与权重
  9. 伪类选择器与盒模型属性实例解析,附字体
  10. 伪类选择器、字体图标、盒模型属性、em和