IPC全程Inter-Process Communication,跨进程通信,指的是两个进程之间进行数据交换的过程。IPC并不是Android独有的,每一个操作系统需要有相应的IPC机制,比如Windows的剪切板、Linux的管道等。
Android中IPC方式常用的有6种:
Bundle
Bundle实现了Android特有序列化Parcelable接口,传输效率很快,更方便在Android进程中传递。Bundle或Intent在Activity,Service等四大组件中使用的最为频繁。
AIDL
Android Interface Definition Language 简称AIDL。进程间通信可使用AIDL生成可序列化参数,然后会生成服务端对象的代理类,客户端通过生成的代理类调用服务端对象的方法。适用于跨进程且是并发访问的情况。
创建.aidl文件后,AS会自动生成基于.aidl的IBinder接口,然后业务代码实现该接口,服务端向客户端公开接口,客户端远程调用公开的接口,验证AIDL通过后就可以通信了。
AIDL支持Java基本数据类型、String、charSequence、ArrayList、HashMap和实现了Parcelable的对象,其中ArrayList和HashMap里面的元素也都需要是AIDL支持的类型。
Socket
进程间通信,其中一方作为服务端,一方作为客户端,双方通过TCP或UDP进行通信。
Messager
Messager是基于AIDL的一种跨进程的通信方式。
文件共享
文件共享即一个进程将数据写入指定的文件中,然后另一个进程需要数据就去读取指定的文件。并发读写可能会导数据无法同步问题,不适合多进程之间的通信,也不适合对数据同步要求高的通信。
ContentProvider
ContentProvider作为Android的四大组件,适用于应用之间的通信。ContentProvider底层也是Binder,支持数据的增删改查,不仅适用于进程间的通信,也适用于进程内部的通信。
类型 | 优点 | 缺点 | 场景 |
---|---|---|---|
Bundle | 简单易用 | 数据类型有限 | 四大组件间的通信 |
AIDL | 支持一对多并发,支持实时通信 | 使用复杂,需要处理好数据同步问题 | 一对多且可以远程调用服务 |
Socket | 功能强大,可网络传输,支持一对多并发实时通信 | 使用繁琐 | 网络数据交换 |
Messager | 支持一对多串行,支持实时通信,功能一般 | 不支持远程调用另一个进程的服务,并发难以处理,只支持Bundle 支持的数据类型 | 无并发,串行,且不是远程调用服务 |
文件共享 | 简单 | 不适合高并发,没有办法做到实时通信 | 数据简单,实时性要求不高,没有并发 |
ContentProvider | 数据功能强大,支持一对多并发数据共享,且可以扩展 | 侧重于数据的操作 | 一对多进程之间的数据共享 |