在android IPC中有介绍到一个可以跨进程的通信方法Messenger,翻译为信使,这很贴切它就是扮演这个角色用的,可以在不同的进程间传递信息,也就是Message对象。在Message对象中可以放入我们需要传递的数据,Messenger是一种轻量级的IPC方案,它的底层实现的是AIDL,我们可以通过该类的构造方法就明白了,不清楚AIDL的同学可以自行去翻看这类的资料。Messenger通常用在服务端进程和客户端进程通信中,这里服务端是android中常见的Service而客户端可以理解为Activity。
Messenger的使用很简单,由于它一次处理一个请求,因此在服务端我们不需要考虑线程同步问题,这也是因为服务端不存在并发执行的情形。使用Messenger有如下几个步骤分为服务端和客户端:
- 服务端
先看服务端:
上图中是一个普通的Service,在其中我们使用Messenger来接受并恢复客户端发来的信息。客户端需要使用
bindService
方法 来绑定服务。因此在service的onBind方法中需要返回一个IBinder对象,此对象从Messenger中获取。在此我们可以看出Messenger就相当于做桥梁一样负责传输信息。
- 客户端
客户端很简单,就和普通使用bindService一样,在onServiceConnection的时候向服务器发送一条信息,并且由于这里设置了服务端会恢复给客户端因此,在message.replyTo=replay;
方法 将传过去的信息告诉服务端用什么来回复我。replay对象 是存在于客户端的Messenger对象,在该对象的Handler中我们就可以获取服务端传回来的信息。
到这里可能会说,并没有实现跨进程啊,我想说的是这里我们的Service使用的是在清单文件中指定的process属性。当启动它的时候 我们可以看到后台有两个进程的存在。当然啦 它也能用在同进程的应用中。