1 Messenger类图
2发送消息时序图
3 使用实例
参考:https://blog.csdn.net/amd123456789/article/details/68948938
3.1客户端
package com.example.uidp3457.testmessenger; import android.content.ComponentName; import android.content.ServiceConnection; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.os.Messenger; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; public class MyActivity extends AppCompatActivity { private static final String TAG = "MyActivity"; public static final int MSG_FROM_SERVER = 1; public static final int MSG_FROM_CLIENT = 2; private Messenger mService; //创建 Messenger 对象,并绑定 Handler private Messenger mGetReplyMessenger = new Messenger(new MessengerHandler()); private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_FROM_SERVER: //接受来自 客户端 的消息 // Log.d(TAG, "receive msg from server: " + msg.getData().get("reply")); break; default: super.handleMessage(msg); } } } private ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) { mService = new Messenger(binder); // 创建 Messenger, 通过它向服务端发送消息 Message msg = Message.obtain(null, MSG_FROM_CLIENT); Bundle data = new Bundle(); data.putString("msg", "hello, this is client"); msg.setData(data); msg.replyTo = mGetReplyMessenger; //将客户端的 Messenger 传给 服务端 try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_my); } }
3.2服务端
package com.example.uidp3457.testmessenger; import android.app.Service; import android.content.Intent; 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; public class MyService extends Service { private static final String TAG = "MyService"; private static class MessengerHandler extends Handler { @Override public void handleMessage(Message msg) { switch (msg.what) { case MyActivity.MSG_FROM_CLIENT: //接受来自客户端的消息 Log.d(TAG, "receive msg from client:" + msg.getData().getString("msg")); Messenger client = msg.replyTo; Message replyMsg = Message.obtain(null, MyActivity.MSG_FROM_SERVER); Bundle bundle = new Bundle(); bundle.putString("reply", "I server have receive your msg"); replyMsg.setData(bundle); try { client.send(replyMsg);//根据客户端传送的Messenger回复消息客户端 } catch (RemoteException e) { e.printStackTrace(); } break; default: super.handleMessage(msg); } } } //创建 Messenger,并绑定对应 Handler, 用于处理 Client 发过来的消息 private final Messenger mMessenger = new Messenger(new MessengerHandler()); public MyService() { } @Override public IBinder onBind(Intent intent) { return mMessenger.getBinder(); //返回 Binder 对象给 Client } }
3.3 修改AndroidManifest.xml 让MyActivity和MyService运行在不同进程
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.uidp3457.testmessenger"> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MyActivity" android:process=":client"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service android:name=".MyService" android:process=":server" android:enabled="true" android:exported="true"></service> </application> </manifest>