绑定Service 三种使用方式 之 利用Messenger实现进程双向通信

 

思路:

   (以下 提供服务端简称服务端,访问服务端简称客户端)

    1. 服务进程和客户端进程之间的通信传递的Message,所以服务端要有Handler对象来处理收到的Message对象。

     2. 客户端给服务端发送Message对象利用的Messenger对象是从服务端传过来的。同理,若服务端给客户端发送Message,使用的Messenger是从客户端传递       过来的。即,响应消息的一端要提供Messenger信使对象给对方端

     3.客户端先给服务端发送消息,服务端才能给客户端发信息作为回应。

     4.注:若实现双向通信,服务端和客户端要都具备Handler对象和Messenger对象,Handler对象处理消息,Messenger发送消息。

   

    本文通过隐式Intent来绑定服务,需要设置Intent的action值,该值要与服务端配置文件中Intent-filter中设置的action属性对应。    需要在配置文件中注册服务,并设定exported属性为true,该属性的默认值是true.false表示外部进程无法访问该服务。

   

 

 实现步骤:

1.创建Service进程,在Service中创建Handler对象,用于处理客户端发送的Message;利用该Handler对象创建Messenger对象,用于客户端给服务端发消息。

2,在onBind()方法中利用上步创建的Messenger对象创建IBinder接口对象,并作为onBind()方法的放回值传给客户端

3.在配置文件中注册服务,同时要注册一个过滤器。

4.创建客户端进程,在客户端创建实现ServiceConnection接口的子类,实现该接口的两个方法,在onServiceConnected(ComponentName arg0, IBinder arg1) {}方法中,利用服务端传过来的IBinder接口对象参数创建Messager对象,用来客户端发消息。

     至此,实现了客户端向服务端发送Message的单向通信。

5,如需要双向通信,在client端创建自己的Handler对象,利用该对象再创建client的Messenger对象。

6. client端send Message的时候,将上步创建的Messenger对象赋给Message的replyTo字段;

7. Service端处理消息的时候,获得封装在message中的client端Messenger,利用该Messenger对象,服务端就可以给客服端发message

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。