在Android中,为了避免一个进程对其他进程的干扰,进程之间是相互独立的。
Android进程间通信采用了Binder而不是Linux已有的方式,主要是有这么两点考虑:性能和安全。在移动设备上对性能要求是比较严苛的。Linux传统的进程间通信比如管道、socket等等进程间通信是需要复制两次数据,而Binder则只需要一次。所以Binder在性能上是优于传统进程通信的。传统的Linux进程通信是不包含通信双方的身份验证的,这样会导致一些安全性问题。而Binder机制自带身份验证,从而有效的提高了安全性。
Binder的架构
是基于CS架构的,有四个主要组成部分。
Client。客户端进程。
Server。服务端进程。
ServiceManager。提供注册、查询和返回代理服务对象的功能。
Binder驱动。主要负责建立进程间的Binder连接,进程间的数据交互等等底层操作。
Binder机制主要的流程
服务端通过Binder驱动在ServiceManager中注册我们的服务。
客户端通过Binder驱动查询在ServiceManager中注册的服务。
ServiceManager通过Binder驱动返回服务端的代理对象。
客户端拿到服务端的代理对象后即可进行进程间通信。
[图片上传失败...(image-cf2354-1699884153980)]
跨进程通信的核心原理
Binder在Android中的具体实现
1.AIDL(Android Interface Define Language)
2.2.MessengerMessenger的底层使用的也是AIDL的原理,它是对AIDL的封装,便于我们使用
其他跨进程通信方式
1.Bundle方式
3.ContentProvider
4.文件共享
5.Socket
方式 | 优点 | 缺点 | 场景 |
---|---|---|---|
Bundle | 简单方便 | 传输的数据类型有限,仅支持能够被序列化的对象 | 四大组件件通信 |
文件共享 | 简单方便 | 不适合高并发场景,不能即时通信 | 无并发的场景 |
AIDL | 内部采用的是Binder线程池,效率高,可以一对多并发, | 即时通信 使用稍显繁琐,线程同步问题要处理 | 能够一对多跨进程通信 |
Messenger | 效率一般,内部采用Handler,支持一对多串行通信, | 即时通信 因为串行,所以不能处理高并发场景,通过Message传输数据 | 低并发的一对多通信 |
ContentProvider | 数据访问功能强大, | call方法可以扩展跨进程通信 虽然call可以支持跨进程通信,但是主要是CRUD操作 | 一对多的进程间数据共享 |
Socket | 功能强大, | 可以通过网络传输字节流,支持一对多并发 使用复杂 | 网络的数据交换 |