Android IPC总结

了解Android进程间通信,首先要了解如下几个内容:

  • 对象序列化
    通过Serializable或者Parcelable进行对象的序列化。Serializable是java中的序列化接口,大量的I/O操作开销较大,Parcelable是Android平台提供的序列化方法,效率高但使用复杂。在将对象序列化存储或者通过网络传输建议使用Serializable,较简单;内存序列化则推荐使用Parcelable;
  • binder
    binder是Android主要的跨进程通信方式,aidl、Messenger等其本质上都是使用的binder;binder采用C/S架构,通过内存映射实现一次拷贝同步数据,具有较高的效率。

下面总结一下主要的几种快进程通信方式

Bundle

Bundle实现了Parcelable接口,可以在进程之间传递。常用与在activity、Service、Receiver之间,通过intent传递数据。使用方法很简单,只能传递bundle支出的数据类型。

文件共享

文件共享的原理很简单:通过对同一个文件的读写,实现进程间通信的目的,但需要处理并发读写的问题,适用于对数据同步要求不高的场景;

Messenger

Messenger实际是对AIDL的封装,分为客户端与服务端。通过消息队列处理消息,不存在并发执行的情况,这种特点适合相应的应用场景。下面简单描述下它的使用方法:

  • service
  1. 定义一个Handle处理从client传递过来的message
  2. 通过Handle可以new一个service的messenger,serverMessenger = new Messenger(serverHandler);
  3. service需要重写public IBinder onBind(Intent intent),通过serverMessenger.getBinder(),返回IBinder
  • client
  1. 绑定service,绑定时需要new一个ServiceConnection传入,并在onServiceConnected中获取service的messenger(通过IBinder创建);
  2. 定义一个Handle处理从service传递过来的message;
  3. 通过handle可以new一个client的messenger,并将该messenger通过messenger传递,messageToServer.replyTo = clientMessenger;
  • 通信流程
    client绑定service,在onServiceConnected通过IBinder创建service的messenger,创建message,并将自己的messenger通过replyto当道message上send。service获取message后也活得了client的messenger,service通过handle处理message,可以通过client的messenger发送消息给client。

AIDL

功能强大,支持一对多并发通信,但使用稍复杂。主要适用于有远程调用需求的IPC。相关内容细节很多,这里简单概括一下流程。

  • 服务端
    创建AIDL文件,定义相关接口,SDK会自动根据AIDL文件生成对应的Binder类;在client绑定Service的时候,将实现这个AIDL的Binder传递给client;
  • 客户端
    绑定Service,绑定成功后,将服务端返回的Binder对象转成AIDL接口,调用服务端暴露的即可。

ContentProvider

ContentProvider用在不同进程间数据共享,它底层也是binder,是进行了封装,专门用于不同应用间数据共享的。可用于一对多的进程间数据共享,主要提供数据源的CRUD操作。

Socket

socket都可以通过网络进行终端间的通信,进程间通信自然也是可以,这里不做过多介绍,主要用于网络间通信。

你可能感兴趣的:(Android IPC总结)