Android系统中大量使用了基于C/S架构的通信方式,例如发送短信,拨打电话,视频音频捕获,传感器等都以服务(Service)的形式提供,并由相应的Server负责管理;应用程序作为Client只需要与这些Server建立连接并发送请求便能使用这些服务;因此,开发者完全不必关心Service的实现细节,直接与Server建立连接然后使用其提供的接口即可;Client和Server一般是运行在不同的进程中的,这就涉及到进程间通信(IPC,Inter-Process Communication)
为了保证系统安全性,提高通信效率以及提供对C/S架构的支持,Android采用了一种基于共享内存的IPC机制——Binder机制.
Binder:
为了实现Binder IPC机制,Android在Linux内核挂载了一个虚拟的设备/dev/binder;Client和Server进程运行在用户空间,使用Binder机制进行进程间通信时,双方看起来是“直接”通信的,实际上通过/dev/binder的驱动程序即Binder驱动进行了数据的中转,Binder机制的本质是共享内存,共享内存区的管理完全由Binder驱动来完成,对应用层的Client和Server来说是完全透明的。(驱动是控制来访问内存的一段小应用程序,但是驱动控制的是硬件内存的读写 )
摘选网上一张图展现Binder它们关系
Server1和Server2注册在ServiceManager中,Client调用Server,首先需要通过Binder从ServiceManager获取Server的代理对象,Client调用代理对象的方法,ServiceManager会帮它调用Server1或2对应的方法
进程间通讯的实现方式:
- Intent
常规的情况下, A 应用去激活B应用中的组件的时候,这实际上就是一种IPC通信的体现, 这个时候发送是Intent 就是在做ipc通信 ,intent 也是去实现 paraceable 接口的, ipc 通信时 传递的非8 种基本数据类型都需要去实现这个接口
- AIDL: android interface defination language
进程间通信, 除了使用intent之外,还可以使用远程服务调用,一般来说操作系统每开一个应用程序就会分配一个进程,进程是之间彼此独立的,内存空间也是 满足两个进程之间 接口数据的交换
Messager做IPC通信底层同样适用的是AIDL方式;和AIDL方式不同的是,Messager是利用Handler形式处理,因此,它是线程安全的,这也表示它不支持并发处理;而AIDL方式是非线程安全的,支持并发处理;所以我们使用AIDL方式时需要保证代码的线程安全.
- BroadcastReceiver