IPC 机制学习笔记
2018-12-04 本文已影响0人
Eren丶耶格尔
Android IPC 简介
IPC 是 Inter-Process Communication 的缩写,含义为进程间通信或者跨进程通信
什么是进程和线程:
按照操作系统中的描述
- 线程:线程是 CPU 调度的最小单元,同时线程是一种有限的系统资源
- 进程:进程一般指一个执行单元,在 PC 和移动设备上指一个程序或者一个应用
进程与线程之间的关系:
一个进程可以包含多个线程,因此进程和线程是包含与被包含的关系
使用多进程的情况
- 一个应用因为某些原因自身需要采用多进程模式来实现
- 当前应用需要向其他应用获取数据或者调用方法
Android 中的多进程模式
如何开启多进程
在 Android 中使用多进程只有一种方法,那就是给四大组件在 AndroidMenifest 中指定 android:process 属性,除此之外没有其他办法
多进程模式的运行机制
当然,多进程绝非只是仅仅指定一个 android:process 属性那么简单
Android 为每一个应用分配了一个独立的虚拟机,或者说为每个进程都分配一个独立的虚拟机,不同的虚拟机在内存分配上有不同的地址空间,这就导致在不同的虚拟机中访问同一个类的对象会产生多份副本
一般来说,使用多进程会造成如下几方面的问题:
- 静态成员和单例模式完全失效
- 线程同步机制完全失效
- SharedPreferences 的可靠性下降
- Application 会多次创建
Binder(重点)
什么是 Binder
- 直观来说,Binder 是 Android 的一个类,它实现了 IBinder 接口
- 从 IPC 角度来说,Binder 是 Android 中的一种跨进程通信方式
- Binder 还可以理解为一种虚拟的物理设备,它的设备驱动是 /dev/binder,该通信方式在 Linux 中没有
- 从 Android FrameWork 角度来说,Binder 是 ServiceManager 连接各种 Manager(ActivityManager、WindowManager,等等)和相应 Mananger 的桥梁
- 从 Android 应用层来说,Binder 是客户端和服务端进行通信的媒介,当 bindService 的时候,服务端会返回一个包含了服务端业务调用的 Binder 对象,通过这个 Binder 对象,客户端就可以获取服务端提供的服务或者数据,这里的服务包括普通服务和基于 AIDL 的服务
Binder 的工作原理图
Binder 的工作机制Android 中的 IPC 方式
1.使用 Bundle
2.使用文件共享
3.使用 Messenger
Messenger 是一种轻量级的 IPC 方案,它的底层实现是 AIDL
Messenger 的工作原理图
Messenger 的工作原理.png4.使用 AIDL
待续...
5.使用 ContentProvider
待续...
6.使用 Socket
待续...
Binder 线程池
待续...
选用合适的 IPC 方式
名称 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Bundle | 简单易用 | 只能传输 Bundle 支持的数据类型 | 四大组件的进程间通信 |
文件分享 | 简单易用 | 不适合高并发场景,并且无法做到进程间的即时通信 | 无并发访问情形,交换简单的数据实时性不高的场景 |
AIDL | 功能强大,支持一对多并发通信,支持实时通信 | 使用稍复杂,需要处理好线程同步 | 一对多并发通信,支持 RPC 远程调用 |
Messenger | 功能一般,支持一对多串行通信,支持实时通信 | 不能很好处理高并发情形,不支持 RPC,数据通过 Message 进行传输,因此只能传输 Bundle 支持的数据类型 | 低并发的一对多即时通信,无 RPC 需求,或者无须要返回结果的 RPC 需求 |
ContentProvider | 在数据源访问方面功能强大,支持一对多并发数据共享,可通过 Call 方法扩展其他操作 | 可以理解为受约束的 AIDL,主要提供数据源的 CRUD 操作 | 一对多的进程间的数据共享 |
Socket | 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 | 实现细节稍微有点烦琐,不支持直接的 RPC | 网络数据交换 |