一句话理解: Messenger 就是给
Handler套了一个跨进程的壳。服务端用Handler创建Messenger,客户端绑定后通过Messenger.send(Message)发消息,服务端再通过msg.replyTo.send(...)把结果回传。最大优点: 不需要写
.aidl文件,也不需要手写 Stub/Proxy 三件套,是 Android 里最轻量的 IPC 方案。
一、适用场景
| 场景 | 是否适合 Messenger |
|---|---|
| 只需要"发消息",不需要"调方法" | ✅ 非常适合 |
| 需要同步等待返回值(阻塞调用) | ❌ 不适合,Messenger 是纯异步的 |
| 数据传输量大、频率高 | ❌ 不适合,Binder 传输有 1MB 限制 |
| 快速实现双向通信 | ✅ 非常适合,自带 replyTo 机制 |
二、服务端实现
服务端的核心思路:创建一个运行在子线程的 Handler,再用它构造 Messenger,最后把 Messenger 的 Binder 暴露给客户端。
MessengerService.java
package com.qhsoft.foodsafety.module;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.RemoteException;
import android.util.Log;
public class MessengerService extends Service {
private static final String TAG = "MessengerService";
// 定义消息类型常量,客户端和服务端必须保持一致
public static final int MSG_SAY_HELLO = 1;
public static final int MSG_ADD = 2;
private Messenger mMessenger; // 服务端的 Messenger
private HandlerThread mHandlerThread;
/**
* 内部 Handler:处理客户端发来的消息
* 运行在 HandlerThread 的子线程中,避免阻塞主线程
*/
private class ServiceHandler extends Handler {
ServiceHandler(android.os.Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_SAY_HELLO:
// 从 Message 中读取客户端传来的数据
String clientName = msg.getData().getString("name", "client");
Log.d(TAG, "收到客户端问候: " + clientName);
// msg.replyTo 是客户端留给我们的"回信地址"
Messenger replyTo = msg.replyTo;
if (replyTo != null) {
// 构造回复消息
Message reply = Message.obtain(null, MSG_SAY_HELLO);
Bundle bundle = new Bundle();
bundle.putString("reply", "Hello " + clientName +
转载自 CSDN-专业IT技术社区
原文链接:https://blog.csdn.net/hai324314/article/details/164432066




