Android服务之Messenger

2017-03-09  本文已影响43人  fengfancky

如需让服务与远程进程通信,则可使用Messenger为您的服务提供接口。利用此方法,无需使用 AIDL 便可执行进程间通信 (IPC)。

与 AIDL 比较

当您需要执行 IPC 时,为您的接口使用Messenger要比使用 AIDL 实现它更加简单,因为Messenger会将所有服务调用排入队列,而纯粹的 AIDL 接口会同时向服务发送多个请求,服务随后必须应对多线程处理。对于大多数应用,服务不需要执行多线程处理,因此使用Messenger可让服务一次处理一个调用。如果您的服务必须执行多线程处理,则应使用AIDL来定义接口。

以下是Messenger的使用方法:

1.服务实现一个Handler,由其接收来自客户端的每个调用的回调

2.Handler用于创建Messenger对象(对Handler的引用)

3.Messenger创建一个IBinder,服务通过onBind()使其返回客户端

4.客户端使用IBinderMessenger(引用服务的Handler)实例化,然后使用后者将Message对象发送给服务

5.服务在其Handler中(具体地讲,是在handleMessage()方法中)接收每个Message

客户端发送消息,服务端接收来自客服端的消息。

服务端(service.apk):

1.MessageService.class

service_code.png

2.注册

service_xml.png

客户端(client.apk):

在Activity中:

1.开启远程服务:

open_service.png

2.发送消息:

send_message.png

3.解除绑定:

unbound_service.png

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

1.在客户端也创建一个Messenger:(client.apk)

new_messenger.png

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

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

service_reply.png

到此结束。

上一篇 下一篇

猜你喜欢

热点阅读