这篇文章主要通过一个小程序来示范一下用Messenger在进程间传递消息的过程。

功能简介服务端功能

在服务端进程中创建一个Service处理客户端请求。当收到客户端的消息以后,打印客户端消息。然后返回一个消息回执到客户端。

客户端功能

在客户端进程初始化时候,绑定对应的服务端。给服务端发送消息,发消息类型为Message对象。然后等待服务端返回并观察日志输出。当收到服务端的回执消息后打印对应的回执消息,整个功能结束。

流程图

在使用Messanger传递消息时候,对应的流程图可以参考下图:

MES使用Redis吗 mes client_MES使用Redis吗

客户端具体实现首先在xml中注册对应的客户端文件
<activity android:name=".client.MessengerActivity">
   <intent-filter>
       <action android:name="android.intent.action.MAIN" />

       <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
</activity>
新建Messenger和Handler,用来处理服务端的返回值
//接受服务端消息使用
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;
       }
   }
}
新建Messenger和ServiceConnection用来连接服务端
//给服务端发消息使用
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) {

   }
};
在onCreate()中绑定服务端
@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);
}
onDestory()时解绑服务端
@Override
protected void onDestroy() {
   super.onDestroy();
   unbindService(serviceConnection);
}
服务端具体实现在xml中注册服务
<service
   android:name=".service.MessengerService"
   android:process=":remote" />
新建Handler用来处理客户端消息
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;
   }
}
在onBind()中获取客户端的信息
private final Messenger messenger = new Messenger(new MessageHandler());

@Nullable
@Override
public IBinder onBind(Intent intent) {
   return messenger.getBinder();
}

经过上述步骤以后,一个简单的借助Messanger通讯的小Deom就实现了。应用中有什么较为复杂的应用也可以在这个Demo的基础上继续演变。如果在运行中发现什么问题,可以查看GitHub源码。