Pich Blog

关注移动开发,大数据,云计算,软件架构!

9.使用Messenger实现IPC

概述

信使,通过他可以在不同的进程中传递Message对象。而Message中可以放入需要传递的数据,内部也是通过AIDL实现。可以通过他的构造方法看到。

他封装了AIDL,所以使用起来很简单。一般使用步骤如下,并且分为服务端和客户端。

使用流程

服务端

创建一个service来处理客户端的连接请求,通过穿入一个Handler,在通过Handler创建一个Messenger,然后在onBind中返回Messenger对象里面的Binder。

客户端

肯定是要绑定服务端的service,而不能直接启动,通过绑定成功的IBinder对象创建一个Messenger,通过Messenger就可以像服务端发送消息了,消息的类型为Message。

如果需要服务端能够响应客户端,就需要和服务度一样创建一个Handler,通过Handler创建一个Messenger,并将Message的replyTo参数设置为该Messenger。服务端通过replyTo返回客户端。

例子:服务端无需回应客户端

先实现服务端,在service中创建一个Handler,然后根据Handler创建一个Messenger,在onBinder返回Messenger的binder:

然后注册

客户端:先创建一个ServiceConnection,在这里可以发送消息,然后在bindService。

Message传递数据的载体只有what,arg1,arg2,Bundle,replyTo。obj在同进程很实用,但是在跨进程是,2.2以前该字段不支持跨进程,2.2以后也只能是系统提供的实现了Parecelable接口的才能通过该字段传递,也就是说自定义的字段是没法传递的。

例子:服务端需回应客户端

这就很简单,在上面的例子上改一下就行了。服务端只需要拿到客户端的信使然后回复一个消息:

客户端为了能接收到服务端传递过来的消息,也需要创建一个Messenger和Handler。

然后将要发送的消息上面的replyTo字段设置刚刚创建的信使:

Messenger的工作原理如下:

简单理解为客户端通过bind是返回的service创建的信使发送消息到服务端,接着服务端就可以在他的Handler里面收到消息,做出处理,然后通过消息上的replyTo字段拿到客户端的信使,然后发送回复的消息,客户端又可以在他的handler里拿到服务端回复的消息,这样完成了一个消息的发送和恢复。

通过上面的例子我们发现Messenger只能传递数据,不能调用方法,并且还是以串行的方式处理客户端发来的数据,如果有大量的消息,他也只能一个一个的处理,对于并发就不太适合了。那下面就来使用AIDL试试。

点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注