hai_android头像
关注
Messenger:Android 最轻量的 IPC 方式封面图

Messenger:Android 最轻量的 IPC 方式

一句话理解: Messenger 就是给 Handler 套了一个跨进程的壳。服务端用 Handler 创建 Messenger,客户端绑定后通过 Messenger.send(Message) 发消息,服务端再通过 msg.replyTo.send(...) 把结果回传。

最大优点: 不需要写 .aidl 文件,也不需要手写 Stub/Proxy 三件套,是 Android 里最轻量的 IPC 方案。


一、适用场景

场景 是否适合 Messenger
只需要"发消息",不需要"调方法" ✅ 非常适合
需要同步等待返回值(阻塞调用) ❌ 不适合,Messenger 是纯异步的
数据传输量大、频率高 ❌ 不适合,Binder 传输有 1MB 限制
快速实现双向通信 ✅ 非常适合,自带 replyTo 机制

二、服务端实现

服务端的核心思路:创建一个运行在子线程的 Handler,再用它构造 Messenger,最后把 MessengerBinder 暴露给客户端。

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

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--