平时一说进程间通信,你们都会想到AIDL,其实messenger和AIDL做用同样,均可以进行进程间通信。它是基于消息的进程间通讯,就像子线程和UI线程发送消息那样,是否是很简单,还不用去写AIDL文件,是否是有点小爽。哈哈。android
此外,还支持记录客户端对象的Messenger,而后能够实现一对多的通讯;甚至做为一个转接处,任意两个进程都能经过服务端进行通讯。多线程
与 AIDL 比较:工具
当您须要执行 IPC 时,为您的接口使用 Messenger 要比使用 AIDL 实现更加简单,由于 Messenger 会将全部服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。测试
对于大多数应用,服务不须要执行多线程处理,所以使用 Messenger 可以让服务一次处理一个调用。若是您的服务必须执行多线程处理,则应使用 AIDL 来定义接口。spa
接下来看下怎么写:线程
服务端:对象
1.建立一个handler对象,并实现hanlemessage方法,用于接收来自客户端的消息,并做处理接口
2.建立一个messenger(送信人),封装handler队列
3.messenger建立一个IBinder对象,经过onBind返回给客户端进程
客户端:
1.在activity中绑定服务
2.建立ServiceConnection并在其中使用 IBinder 将 Messenger实例化
3.使用Messenger向服务端发送消息
4.解绑服务
5.服务端中在 handleMessage() 方法中接收每一个 Message
这样,客户端并无调用服务的“方法”。而客户端传递的“消息”(Message 对象)是服务在其 Handler 中接收的。
上面实现的仅仅是单向通讯,即客户端给服务端发送消息,若是我须要服务端给客户端发送消息又该怎样作呢?
其实,这也是很容易实现的,下面就让咱们接着上面的步骤来实现双向通讯吧
1.在客户端中建立一个Handler对象,用于处理服务端发过来的消息
2.建立一个客户端本身的messenger对象,并封装handler。
3.将客户端的Messenger对象赋给待发送的Message对象的replyTo字段
4.在服务端的Handler处理Message时将客户端的Messenger解析出来,并使用客户端的Messenger对象给客户端发送消息
这样就实现了客户端和服务端的双向通讯了。
注意:注:Service在声明时必须对外开放,即android:exported="true";另外,我在开发完APP都会用一些APP在线自动化测试工具进行测试:www.ineice.com