这篇文章主要通过一个小程序来示范一下用Messenger在进程间传递消息的过程。
在服务端进程中创建一个Service处理客户端请求。当收到客户端的消息以后,打印客户端消息。然后返回一个消息回执到客户端。
在客户端进程初始化时候,绑定对应的服务端。给服务端发送消息,发消息类型为Message对象。然后等待服务端返回并观察日志输出。当收到服务端的回执消息后打印对应的回执消息,整个功能结束。
在使用Messanger传递消息时候,对应的流程图可以参考下图:
<activity android:name=".client.MessengerActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
//接受服务端消息使用
private Messenger getReplyMessenger = new Messenger(new MessengerHandler());
//处理服务端的返回值
private static class MessengerHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
//打印服务端返回的信息
case MyContaints.MSG_FORM_SERVICE:
Log.d(TAG, "客户端收到服务端消息:" + msg.getData().getString(MyContaints.SERVICE_MESSAGE_KEY));
break;
default:
super.handleMessage(msg);
break;
}
}
}
//给服务端发消息使用
private Messenger messenger;
//用来监听服务端连接成功和失败的监听
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//初始化Messenger对象
messenger = new Messenger(service);
//构造Message并给必要的参数赋值
Message message = getMessage();
try {
//发送消息
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@NonNull
//构造要发送的消息,服务端会对这条消息进行处理
private Message getMessage() {
Message message = Message.obtain();
message.what = MyContaints.MSG_FORM_CLIENT;
Bundle bundle = new Bundle();
bundle.putString(MyContaints.CLIENT_MESSAGE_KEY, "这里来自客户端的一条消息");
message.setData(bundle);
//设置接收返回的Messenger
message.replyTo = getReplyMessenger;
return message;
}
// 当里链接断开时候回回调这个方法
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
bindService();
}
private void bindService() {
Intent intent = new Intent(this, MessengerService.class);
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE);
}
@Override
protected void onDestroy() {
super.onDestroy();
unbindService(serviceConnection);
}
<service
android:name=".service.MessengerService"
android:process=":remote" />
private static class MessageHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MyContaints.MSG_FORM_CLIENT:
//收到消息后打印出这个消息
Log.d(TAG, "收到来自客户端的消息:" + msg.getData().getString(MyContaints.CLIENT_MESSAGE_KEY));
replyClient(msg);
break;
default:
super.handleMessage(msg);
break;
}
}
private void replyClient(Message msg) {
//获取客户端的Messenger
Messenger messenger = msg.replyTo;
//给要传递的信息赋值
Message message = getMessage();
try {
//发送消息到客户端
messenger.send(message);
} catch (RemoteException e) {
e.printStackTrace();
}
}
@NonNull
private Message getMessage() {
Message message = Message.obtain(null, MyContaints.MSG_FORM_SERVICE);
Bundle bundle = new Bundle();
bundle.putString(MyContaints.SERVICE_MESSAGE_KEY, "这里是服务端的回复");
message.setData(bundle);
return message;
}
}
private final Messenger messenger = new Messenger(new MessageHandler());
@Nullable
@Override
public IBinder onBind(Intent intent) {
return messenger.getBinder();
}
经过上述步骤以后,一个简单的借助Messanger通讯的小Deom就实现了。应用中有什么较为复杂的应用也可以在这个Demo的基础上继续演变。如果在运行中发现什么问题,可以查看GitHub源码。