远程绑定Service使用Messenger通讯

来源:互联网 发布:编程专用笔记本 编辑:程序博客网 时间:2024/05/17 17:57

1. 先在远程service里面new一个自己的Messenger :messenger = new Messenger(handler);


2. 在这个handler里面处理接收到的消息


3. 在onBind中把这个Messenger的binder返给客户端: return messenger.getBinder();


4. 客户端拿到这个Messenger就可以给service发送消息了:messenger.send(message);

@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmessenger = new Messenger(service);}

5. 为了双向通信,客户端再new 一个Messenger : messengerClient = new Messenger(handler);   并且在发送消息时把这个messenger作为参数传给service:

message.replyTo = messengerClient;


6. 同样的,客户端在这个handler里面处理接收到的消息


7. 远程service在handleMessage中拿到这个messengerClient  就可以向客户端发送消息:Messenger mes = msg.replyTo;



package com.example.messengerserver;import android.app.Service;/**   * @Description: TODO() * @author dml   * @date 2015-4-28 下午2:50:52 */public class RemoteService extends Service {private Messenger messenger;private Handler handler = new Handler(){public void handleMessage(android.os.Message msg) {if(msg.what==2){Bundle bundle = (Bundle) msg.obj;String s = bundle.getString("two");Log.d("dml", "接到客户端的消息 : " + s);Messenger mes = msg.replyTo;Message msgT = Message.obtain();msgT.what = 3;//msgT.obj = "service返回消息啦";try {mes.send(msgT);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}};};@Overridepublic IBinder onBind(Intent intent) {// TODO Auto-generated method stubLog.d("dml", "service onBind...");return messenger.getBinder();}@Overridepublic void onCreate() {// TODO Auto-generated method stubsuper.onCreate();Log.d("dml", "service onCreate...");messenger = new Messenger(handler);}}


package com.example.messengerclient;import android.app.Activity;import android.content.ComponentName;import android.content.Context;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.Handler;import android.os.IBinder;import android.os.Message;import android.os.Messenger;import android.os.RemoteException;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;public class MainActivity extends Activity {private Button btn1,btn2;private ServiceConnection conn;private Messenger messenger;private Messenger messengerClient;private Handler handler;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);handler = new Handler(){@Overridepublic void handleMessage(Message msg) {// TODO Auto-generated method stubsuper.handleMessage(msg);if(msg.what==3){//String s = msg.obj.toString();Log.d("dml", "服务返回的消息 : ");}}};messengerClient = new Messenger(handler);btn1 = (Button)findViewById(R.id.button1);btn2 = (Button)findViewById(R.id.button2); conn = new ServiceConnection() {@Overridepublic void onServiceDisconnected(ComponentName name) {// TODO Auto-generated method stubmessenger = null;}@Overridepublic void onServiceConnected(ComponentName name, IBinder service) {// TODO Auto-generated method stubmessenger = new Messenger(service);}};btn1.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubbindService(new Intent("myservice"), conn, Context.BIND_AUTO_CREATE);}});btn2.setOnClickListener(new OnClickListener() {@Overridepublic void onClick(View v) {// TODO Auto-generated method stubMessage message = Message.obtain();message.what = 2;message.replyTo = messengerClient;Bundle bundle = new Bundle();bundle.putString("two", "to server");message.obj = bundle;try {messenger.send(message);} catch (RemoteException e) {// TODO Auto-generated catch blocke.printStackTrace();}}});}@Overrideprotected void onDestroy() {// TODO Auto-generated method stubsuper.onDestroy();unbindService(conn);}}


0 0
原创粉丝点击