Android进程间通信:Messenger(图解)

826 阅读2分钟

Messenger是一种轻量级的IPC方案,它对AIDL做了封装,使得我们可以更简便的进行进程间通信

手绘原理图一张~

Messenger跨进程通信2.jpg

Manifest文件

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.messengertest">

    <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/Theme.MessengerTest">
        <service
                android:name=".MessengerService"
                android:enabled="true"
                android:exported="true"
                android:process=":remote">

        </service>

        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

创建Service

package com.example.messengertest;

import android.app.Service;
import android.content.Intent;
import android.os.*;
import android.util.Log;

import androidx.annotation.NonNull;

/**
 * Messenger服务端 负责接收消息 处理消息
 * 运行在 com.example.messengertest:remote 进程中
 */
public class MessengerService extends Service {

    private static final String TAG = "Ethan";
    // 用Handler做参数创建的Messenger兼具发送和接收功能
    private final static Messenger mMessenger = new Messenger(new MessengerHandler());

    @Override
    public IBinder onBind(Intent intent) {
        // 可以在这里做一些权限的验证
        return mMessenger.getBinder();
    }

    public static class MessengerHandler extends Handler {

        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case MyConstants.MSG_FROM_CLIENT:
                    Log.i(TAG, "服务端收到了消息,消息内容是:" + msg.getData().getString("msg"));

                    // 通过msg.replyTo字段可以获取到发送方指定的接收器的引用
                    Messenger replyTo = msg.replyTo;
                    Message message = Message.obtain(null, MyConstants.MSG_FROM_SERVER);
                    Bundle bundle = new Bundle();
                    bundle.putString("reply", "谢谢,你的消息我已收到~");
                    message.setData(bundle);
                    try {
                        replyTo.send(message);
                    } catch (RemoteException e) {
                        e.printStackTrace();
                    }

                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
}

MainActivity

package com.example.messengertest;

import android.content.*;
import android.os.*;
import android.util.Log;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;

/**
 * MainActivity运行在 com.example.messengertest 进程中
 */
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "Ethan";
    private final Messenger mGetReplyMessenger = new Messenger(new MessengerHandler());
    private Messenger mMessenger;

    ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            // 客户端获取到服务端的Messenger的IBinder 用IBinder做参数创建的Messenger只能向指定服务端发送消息
            mMessenger = new Messenger(service);
            Message message = Message.obtain(null, MyConstants.MSG_FROM_CLIENT);
            Bundle bundle = new Bundle();
            bundle.putString("msg", "早上好亲爱的Messenger服务器~");
            message.setData(bundle);
            // 指定如果有回应 令mGetReplyMessenger作为接收器来接收回应
            message.replyTo = mGetReplyMessenger;

            Message messageToSelf=Message.obtain(null,MyConstants.MSG_FROM_CLIENT);
            Bundle bundle1 = new Bundle();
            bundle1.putString("msg", "自己给自己发的");
            messageToSelf.setData(bundle1);
            try {
                mMessenger.send(message);
                mGetReplyMessenger.send(messageToSelf);
            } catch (RemoteException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.e(TAG, "网络开小差了...");
        }
    };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Intent intent = new Intent(this, MessengerService.class);
        bindService(intent, mServiceConnection, BIND_AUTO_CREATE);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(mServiceConnection);
    }

    /**
     * 用于接收服务端的响应消息
     */
    static class MessengerHandler extends Handler {
        @Override
        public void handleMessage(@NonNull Message msg) {
            switch (msg.what) {
                case MyConstants.MSG_FROM_SERVER:
                    Log.i(TAG, "发送方收到了服务端的回复,回复内容是:" + msg.getData().getString("reply"));
                    break;
                case MyConstants.MSG_FROM_CLIENT:
                    Log.i(TAG, "发送方收到了消息:" + msg.getData().getString("msg"));
                    break;
                default:
                    super.handleMessage(msg);
            }
        }
    }
}

运行截图 image.png