Messenger作为跨进程编程的方式之一,相对于AIDL,是比较简单的,接下来我来一步步记录,如何编写一个Messenger实例。
- 既然是跨进程,肯定是需要client 和 server 。而且两边都需要一个Messenger的对象,使用Handler来作为Messenger的参数来处理信息。Server端的messenger是用于处理Client端的请求信息,Client端的messenger用于处理Server端的回复信息,具体新建messenger的模版代码如下,里面的处理逻辑就不详述:
private Messenger mMessenger = new Messenger(new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
}
});
- Client端需要拿到Server端的Messenger,调用 messenger.send()给Server端发送信息,如何做呢? 刚好我们当我们bind Service的时候,会返回一个IBinder 给Client端, 所以,Client端代码如下:
private Messenger mServerMessenger;
private ServiceConnection mServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
mServerMessenger = new Messenger(iBinder);
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
}
};
那么Server端的返回IBinder的方法就是如下:
@Override
public IBinder onBind(Intent intent) {
return mServerMessenger.getBinder();
}
- Client端发送信息,此时会涉及到几个类的使用,Message、Handler、Bundle等。且在发送消息的同时,需要指定 Server端返回的数据,找Client端的某个messenger来处理。具体代码如下:
Message message = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("server",“发送的消息");
message.setData(bundle);
message.replyTo = messenger; ///指定返回的数据找messenger来处理
try {
mServerMessenger.send(message); ///使用Server端的messenger发送
} catch (RemoteException e) {
e.printStackTrace();
}
- Server端回复信息,当得到Client端请求信息后,不需要拿到客户端的messenger来返回消息,而是直接使用获得的客户端的message,调用方法 message.replyTo.send()方法来回复信息。具体代码:
Message message = Message.obtain();
Bundle bundle = new Bundle();
bundle.putString("server",replyString);
message.setData(bundle);
try {
msg.replyTo.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
- 此时消息已经回复过去了,第三步中我们指定的messenger会来处理回复的数据。
到此使用Messenger来跨进程通讯就完成了。
网友评论