1. 先在远程service里面new一个自己的Messenger :messenger = new Messenger(handler);
2. 在这个handler里面处理接收到的消息
3. 在onBind中把这个Messenger的binder返给客户端: return messenger.getBinder();
4. 客户端拿到这个Messenger就可以给service发送消息了:messenger.send(message);
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
messenger = 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 block
e.printStackTrace();
}
}
};
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
Log.d("dml", "service onBind...");
return messenger.getBinder();
}
@Override
public void onCreate() {
// TODO Auto-generated method stub
super.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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
handler = new Handler(){
@Override
public void handleMessage(Message msg) {
// TODO Auto-generated method stub
super.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() {
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
messenger = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
messenger = new Messenger(service);
}
};
btn1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
bindService(new Intent("myservice"), conn, Context.BIND_AUTO_CREATE);
}
});
btn2.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Message 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 block
e.printStackTrace();
}
}
});
}
@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
unbindService(conn);
}
}