Messenger是一种轻量级的IPC方案,它对AIDL做了封装,使得我们可以更简便的进行进程间通信
手绘原理图一张~
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);
}
}
}
}
运行截图