Messenger是信使的意思,将Messenger用于Service可以实现不同进程间的通信(IPC)
来看一下Messenger在此用到的主要方法:
1、构造方法 Messenger(Handler handler),其中的handler用于处理消息
2、Messenger.getBinder()返回一个Binder对象
3、Message.replyTo,这是message的一个成员变量,它可以指明一个Messenger对象,Messenger就像要飞往特定地方送信的信鸽,Message的replyTo指明了它要去的方向
4、Messenger.send(Message)发送信息
先来编写服务器端的代码,先写一个MyService(继承Service),里面有两个Messenger,一个用于收信一个用于送信
Messenger send_messenger;
Messenger receive_messenger = new Messenger(new Handler() {
public void handleMessage(Message msg) {
Bundle data = msg.getData();
String s = data.getString("message");
Toast.makeText(getApplicationContext(), "收到来自客户端的消息:"+s, Toast.LENGTH_SHORT).show();
send_messenger = msg.replyTo;
if(demo_1_messenger!=null) {
Message m = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("message", "你好呀,刚刚接收到了你的消息:"+s+"\n我觉得我有必要回复你一下,这样显得我比较有礼貌嘿!");
m.setData(bundle);
try {
demo_1_messenger.send(m);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
}
重写onBind方法:
@Override
public IBinder onBind(Intent arg0) {
return receive_messenger.getBinder();
}
第二步:写客户端代码,客户端中也是有两个Messenger,一个用于收信一个用于送信
Messenger receiveMessenger = new Messenger(new Handler() {
public void handleMessage(Message msg) {
String s = msg.getData().getString("message");
};
});
然后可以把接收到的信息显示出来(略)
跟用IBinder实现一样,还是需要有一个ServiceConnection对象
ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceDisconnected(ComponentName arg0) {
// TODO Auto-generated method stub
}
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
// TODO Auto-generated method stub
receiveMessenger = new Messenger(arg1);
}
};
这里把IBinder类转换成了Messenger类,接着就用上面的方法处理onBind方法返回来的信息。
下面的代码是用于向服务器端发送信息:
Message msg = Message.obtain();
msg.what = 1;
msg.replyTo = clientMessenger;
Bundle bundle = new Bundle();
String s = et.getText().toString(); //获取EditText控件中的text,然后发送给服务器端
if(s!=null) {
bundle.putString("message", s);
msg.setData(bundle);
try {
serverMessenger.send(msg);
} catch (RemoteException e) {
e.printStackTrace();
}
}
绑定和解绑的步骤还是和以前一样。