如需让服务与远程进程通信,则可使用Messenger为您的服务提供接口。利用此方法,无需使用 AIDL 便可执行进程间通信 (IPC)。
与 AIDL 比较
当您需要执行 IPC 时,为您的接口使用Messenger要比使用 AIDL 实现它更加简单,因为Messenger会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。对于大多数应用,服务不需要执行多线程处理,因此使用Messenger可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用AIDL来定义接口。
以下是Messenger的使用方法:
1.服务实现一个Handler,由其接收来自客户端的每个调用的回调
2.Handler用于创建Messenger对象(对Handler的引用)
3.Messenger创建一个IBinder,服务通过onBind()使其返回客户端
4.客户端使用IBinder将Messenger(引用服务的Handler)实例化,然后使用后者将Message对象发送给服务
5.服务在其Handler中(具体地讲,是在handleMessage()方法中)接收每个Message。
客户端发送消息,服务端接收来自客服端的消息。
服务端(service.apk):
1.MessageService.class

2.注册

客户端(client.apk):
在Activity中:
1.开启远程服务:

2.发送消息:

3.解除绑定:

此示例并未说明服务如何对客户端作出响应。如果您想让服务作出响应,则还需要在客户端中创建一个Messenger。然后,当客户端收到onServiceConnected()回调时,会向服务发送一条Message,并在其send()方法的replyTo参数中包含客户端的Messenger。操作如下:
1.在客户端也创建一个Messenger:(client.apk)

2.当客户端收到onServiceConnected()回调时,向服务端发送一条Message,利用Message的replyTo携带客服端的Messenger:(client.apk)

3.服务端接收到客户端消息后:(service.apk)

到此结束。
网友评论