在android中进行跨进程通信通常有以下几种方式:
- 使用Intent
- 使用文件共享
- 使用Messenger
- 使用AIDL
- 使用ContentProvider
其中Intent中可以携带Bundle,而Bundle实现了Parcelable接口,所以可以在不同的进程间进行传输。文件共享就是读写文件,比如常用的SharedPreferences就是以XML来存储的文件。而Messenger,AIDL,ContentProvider都是基于Binder的,所以学习并理解Binder就尤为重要。
虽然Android继承使用Linux的内核,但Linux与Android的通信机制不同。
在Linux中使用的IPC通信机制如下:
传统IPC:无名pipe, signal, trace, 有名管道
AT&T Unix 系统V:共享内存,信号灯,消息队列
BSD Unix:Socket
而在Android中,并没有使用这些,取而代之的是Binder机制。Binder机制是采用OpenBinder演化而来,在Android中使用它的原因如下:
采用C/S的通信模式。而在linux通信机制中,目前只有socket支持C/S的通信模式,但socket有其劣势,具体参看第二条。
有更好的传输性能。对比于Linux的通信机制,
socket:是一个通用接口,导致其传输效率低,开销大;
管道和消息队列:因为采用存储转发方式,所以至少需要拷贝2次数据,效率低;
共享内存:虽然在传输时没有拷贝数据,但其控制机制复杂(比如跨进程通信时,需获取对方进程的pid,得多种机制协同操作)。
安全性更高。Linux的IPC机制在本身的实现中,并没有安全措施,得依赖上层协议来进行安全控制。而Binder机制的 UID/PID是由Binder机制本身在内核空间添加身份标识,安全性高;并且Binder可以建立私有通道,这是linux的通信机制所无法实现的 (Linux访问的接入点是开放的)。
那什么是Binder呢?
- 从IPC角度来说,Binder是Android中一种跨进程通信的方式。
- 从Android FrameWork角度来说,Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁。
- 从Android应用层的角度来说, BInder是客户端和服务端进行通信的媒介。
Binder通信机制流程(整体流程)