Android进阶知识(六):IPC方式及其适用场景

Android进阶知识(六):IPC方式及其适用场景

  这一篇将简单的介绍关于Android中的IPC方式,但对于这些方式如何实现的不做详细介绍,读者可以看《Android艺术开发探索》或者查看相应博客。笔者想要做一只知识帮运的快乐肥柴,而不是代码帮运的无聊肥柴。
Android进阶知识(六):IPC方式及其适用场景

一、Android中的IPC方式

  Android中IPC的方式有很多:通过Intent中附加extras来传递信息、通过共享文件的方式来共享数据、采用Binder方式来跨进程通信、ContentProvider天生支持跨进程访问、通过网络通信Socket也可以实现IPC。

  1. 使用Bundle

  四大组件中的三大组件(Activity、Service、Receiver)都是支持在Intent中传递Bundle数据的,由于Bundle实现了Parcelable接口,所以其可以方便地在不同的进程间传输。
  基于这一点,当一个进程中启动了另一个进程的Activity/Service/Receiver,那么就可以在Bundle中附加需要传输给远程进程的信息并通过Intent发出去。当然传输的数据必须能够被序列化。

  1. 使用文件共享

  共享文件是一种不错的进程间通信方式,两个进程通过读/写同一个文件来交换数据。但是由于Android系统基于Linux,使得其并发读/写文件可以没有限制地进行,这也就出现了并发读/写的问题。文件共享的优点在于共享数据对文件格式没有具体要求
  一个特殊的例子为SharedPreferences,其本质也是属于文件的一种,但是由于系统对它的读/写有一定的缓存策略,系统对它的读/写就变得不可靠了。尤其对于高并发的读写访问,大概率上数据会被丢失,因此并不建议在进程间使用。
Android进阶知识(六):IPC方式及其适用场景

  1. 使用Messenger

  Messenger是一种轻量级的IPC方案,其底层实现是AIDL。通过Messenger可以在不同进程中传递Message对象,在Message中放入需要传递的数据,就可以轻松地实现数据的进程间传递。
  Messenger的使用方法简单,其对AIDL进行了封装。此外它一次处理一个请求,因此在服务端不需要考虑线程同步问题,因为服务端不存在并发执行的情况
  至于Messenger的使用,具体可以参考博客:Android进阶10:进程通信之Messenger使用与解析
  Messenger的工作原理图如下图所示。
Android进阶知识(六):IPC方式及其适用场景

  1. 使用AIDL

  AIDL是IPC进程间通信方式的一种,AIDL和Messenger的区别:

  • Messenger不适用大量并发请求:Messenger以串行的方式处理客户端发送的雄消息,如果大量的消息同时发送到服务端,服务端依旧一个个处理。
  • Messenger主要是为了传递消息:对于需要跨进程调用服务端的方法,不适用。
  • Messenger的底层实现为AIDL
  • AIDL适用于大量并发的请求,以及涉及到服务端方法调用的情景
      AIDL的具体使用方法,可以参看《Android艺术开发探索》或者博客:AIDL使用解析(该博客内容依旧是参照《Android艺术开发探索》一书)。
  1. 使用ContentProvider

  ContentProvider是Android中提供的专门用于不同应用间进行数据共享的方式,从这一点来看,其天生就适合进程间通信。和Messenger一样,ContentProvider的底层实现同样是Binder
Android进阶知识(六):IPC方式及其适用场景
  值得一提的是,实现ContenProvider需要实现六个抽象方法:onCreate、query、update、insert、delete和getType。根据Binder的工作原理,这六个方法运行在ContentProvider的进程中,除了onCreate由系统回调并运行在主线程中,其他五个方法均由外界回调并运行在Binder线程池中。(对于ContentProvider的使用及其使用难点参照《Android艺术开发探索》,hhhh)

  1. 使用Socket

  Socket也称为“套接字”,是网络通信中的概念,其分为流式套接字和用户数据报套接字两种,分别对应于网络的传输控制层中的TCP和UDP协议。
  使用Socket不仅仅能实现进程间的通信,还可以实现设备间的通信。前提是这些设备之间的IP地址相互可见。(具体使用方法也不多介绍)
Android进阶知识(六):IPC方式及其适用场景

二、IPC的适用场景

  对于不同IPC方式的优缺点和适用场景,在实际开发中根据不同的场景选择合适的IPC方式可以轻松完成多进程通信。如下表为不同IPC方式的优缺点和适用场景。

名称 优点 缺点 适用场景
Bundle 简单易用 只能传输Bundle支持的数据 四大组件间的进程间通信
文件共享 简单易用 不适合高并发场景,并且无法做到进程间的即使通信 无并发访问情形,交换简单的数据实时性不高的场景
AIDL 功能强大,支持一对多并发通信,支持实时通信 使用稍复杂,需要处理好线程同步 一对多通信且有RPC需求
Messenger 功能一般,支持一对多串行通信,支持实时通信 不能很好处理高并发情形,不支持RPC,数据通过Message进行传输,因此只能传输Bundle支持的数据类型 低并发的一对多即时通信,无RPC需求,或者无须返回结果的RPC需求
ContentProvider 在数据源访问方面功能强大,支持一对多并发数据共享,可通过Call方法扩展其他操作 可以理解为受约束的AIDL,主要提供数据源的CRUD操作 一对多的进程间的数据共享
Socket 功能强大,可以通过网络传输字节流,支持一对多并发实时通信 实现细节稍微有点繁琐,不支持直接的RPC 网络数据交换

参考资料:《Android开发艺术探索》