Android11_IPC方式之Messenger

通过Messenger可以在不同的进程中传递Messenger对象;

Message放入我们需要传递的数据;就可以轻松实现数据的进程间传递;

Messenger是轻量级的IPC方案;底层实现是AIDL;

Messenger对AIDL做了封装,使得我们可以简便地进行进程间通信;

由于其一次处理一个请求,因此在服务端不需要考虑线程同步的问题;

因为服务端中不存在并发执行的情形;

1、服务端

创建一个Service来处理客户端的连接请求,同时创建一个Handler并通过它来创建一个Messenger对象;

然后在Service的onBind方法中返回这个Messenger对象底层的Binder即可;

2、客户端

首先要绑定服务端Service,绑定成功后用服务端返回的IBinder对象创建一个Messenger,通过这个Messenger对象就可向服务端发送消息了;

发消息的类型是Message对象,如果需要服务端能够回应客户端,那么也需要创建一个Handler并创建一个新的Messenger,

并把这个Messenger对象通过Message的replyTo参数传递给服务端;服务端通过这个replyTo参数就可以回应客户端。

===================================================

服务端代码:

 1 package com.example.messengertest_server;
 2 
 3 import android.app.Service;
 4 import android.content.Intent;
 5 import android.os.Bundle;
 6 import android.os.Handler;
 7 import android.os.IBinder;
 8 import android.os.Message;
 9 import android.os.Messenger;
10 import android.os.RemoteException;
11 import android.util.Log;
12 
13 public class MessengerService extends Service {
14     private static final String TAG = "Service";
15     private static final int MSG_OPCODE_1 = 1;
16 
17     //定义一个继承自Handler的类
18     private static class MsgHandler extends  Handler {
19         @Override
20         public void handleMessage(Message msg){
21             super.handleMessage(msg);
22             switch(msg.what){
23                 case MSG_OPCODE_1:
24                     //取出客户端的内容
25                     Bundle bundle = msg.getData();  //取出bundle
26                     String clientmsgstr = bundle.getString("client");  //解析bundle
27                     Log.d(TAG,"Service handle msg with client string:"+clientmsgstr); //打印
28 
29                     //新建一个Message,回复客户端
30                      Message replymsg = Message.obtain();  //创建消息
31                      replymsg.what = MSG_OPCODE_1;
32                      Bundle replybundle = new Bundle(); //创建bundle
33                      replybundle.putString("service","我很好");//往bundle中存放数据
34                      replymsg.setData(replybundle);//往消息中存放bundle
35 
36                     //对收到的msg进行回复
37                      try{
38                          msg.replyTo.send(replymsg); //msg.replyTo是客户端携带过来的Messenger对象
39                      }catch(RemoteException e){
40                          e.printStackTrace();
41                      }
42                      break;
43                 default:
44                     break;
45             }
46         }
47     }
48 
49     private MsgHandler mHandler = new MsgHandler();
50     private Messenger mMessenger = new Messenger(mHandler);//创建一个Messenger,将Handler作为参数
51 
52 
53     @Override
54     public IBinder onBind(Intent intent){
55         return mMessenger.getBinder();
56     }
57 
58     @Override
59     public void onCreate(){
60         super.onCreate();
61         Log.d(TAG, "onCreate: ");
62         if(mMessenger == null){
63             mMessenger = new Messenger(mHandler);
64         }
65     }
66 
67     @Override
68     public void onDestroy(){
69         super.onDestroy();
70     }
71 
72 }

===================================================

客户端代码:

  1 package com.example.messengertest_client;
  2 
  3 import androidx.appcompat.app.AppCompatActivity;
  4 import android.content.ComponentName;
  5 import android.content.Context;
  6 import android.content.Intent;
  7 import android.content.ServiceConnection;
  8 import android.os.Bundle;
  9 import android.os.Handler;
 10 import android.os.IBinder;
 11 import android.os.Message;
 12 import android.os.Messenger;
 13 import android.os.RemoteException;
 14 import android.util.Log;
 15 import android.view.View;
 16 
 17 public class MainActivity extends AppCompatActivity implements View.OnClickListener{
 18     private static final String TAG = "Client";
 19     private static final int MSG_OPCODE_1 = 1;
 20 
 21     private boolean connected;  //用一个变量记录是否连接
 22 
 23     @Override
 24     protected void onCreate(Bundle savedInstanceState) {
 25         super.onCreate(savedInstanceState);
 26         setContentView(R.layout.activity_main);
 27         findViewById(R.id.btn_connect).setOnClickListener(this);
 28         findViewById(R.id.btn_unconnect).setOnClickListener(this);
 29     }
 30 
 31     @Override
 32     protected void onDestroy(){
 33         super.onDestroy();
 34         if(connected){
 35             unbindService(mConnection);
 36         }
 37 
 38     }
 39 
 40     //处理点击操作
 41     public void onClick(View view){
 42         switch (view.getId()){
 43             case R.id.btn_connect:
 44                 Log.d(TAG,"Click btn_connect");
 45                 Intent intent = new Intent();
 46                 intent.setPackage("com.example.messengertest_server");
 47                 intent.setAction("com.example.messengertest_server.MSGSERVICE");
 48                 bindService(intent,mConnection, Context.BIND_AUTO_CREATE);
 49                 break;
 50             case R.id.btn_unconnect:
 51                 Log.d(TAG,"Click btn_unconnect");
 52                 unbindService(mConnection);
 53                 break;
 54             default:
 55                 break;
 56         }
 57     }
 58 
 59     //ServiceConnection中的函数会被回调
 60     private ServiceConnection mConnection = new ServiceConnection() {
 61         @Override
 62         public void onServiceConnected(ComponentName name, IBinder service) {
 63             Log.d(TAG,"onServiceConnected Enter");
 64             connected = true;
 65             //建立连接后,给服务端发消息
 66             Messenger sendmessenger = new Messenger(service);
 67 
 68             Message sendmessage = Message.obtain();
 69             Bundle bundle = new Bundle();
 70             bundle.putString("client", "你好吗?");
 71             sendmessage.setData(bundle);
 72             sendmessage.what = MSG_OPCODE_1;
 73             sendmessage.replyTo = mMessenger;
 74 
 75             //利用messenger的send方法发送消息给服务端
 76             try{
 77                 sendmessenger.send(sendmessage);
 78             }catch (RemoteException e){
 79                e.printStackTrace();
 80             }
 81         }
 82 
 83         @Override
 84         public void onServiceDisconnected(ComponentName name) {
 85             Log.d(TAG,"onServiceDisconnected Enter");
 86             connected = false;
 87         }
 88     };
 89 
 90     //定义一个继承自Handler的类
 91     private static class MsgHandler extends Handler {
 92         @Override
 93         public void handleMessage(Message msg){
 94             super.handleMessage(msg);
 95             Log.d(TAG,"Handle Message Enter");
 96 
 97             //处理来自服务端回复的消息
 98             if(MSG_OPCODE_1 == msg.what)
 99             {
100                 Bundle bundle = msg.getData();
101                 String replymsg = bundle.getString("service");
102                 Log.d(TAG,"Get service reply "+replymsg);
103             }
104         }
105     }
106 
107     private MsgHandler mHandler = new MsgHandler();
108     private Messenger mMessenger = new Messenger(mHandler);//创建一个Messenger,将Handler作为参数
109 
110 }
原文地址:https://www.cnblogs.com/grooovvve/p/12484284.html