Messenger跨进程通信架构

xiaoxiao2025-08-23  106

Framework Messenger Mechanism

Messenger基于aidl,最重要的一个aidl接口是IMessenger.aidl @framework/base/core/java/android/os/IMessenger.aidl

package android.os; import android.os.Message; /** @hide */ oneway interface IMessenger { void send(in Message msg); }

IMessenger相关的所有文件如下: @framework/base/core/java/android/os/IMessenger.aidl @framework/base/core/java/android/os/Message.aidl @framework/base/core/java/android/os/Message.java @framework/base/core/java/android/os/Messenger.aidl @framework/base/core/java/android/os/Messenger.java @framework/base/core/java/android/os/Handler.java

通信流程

服务端实现

创建Messenger对象,同时创建并获取Handler里的IMessenger.Stub对象 public final class Messenger implements Parcelable { private final IMessenger mTarget; public Messenger(Handler target) { mTarget = target.getIMessenger(); } public IBinder getBinder() { return mTarget.asBinder(); } } IMessenger.Stub内部关联Handler,接收到的Message转发到handleMessage(Message msg) public class Handler { final IMessenger getIMessenger() { synchronized (mQueue) { if (mMessenger != null) { return mMessenger; } mMessenger = new MessengerImpl(); return mMessenger; } } private final class MessengerImpl extends IMessenger.Stub { public void send(Message msg) { msg.sendingUid = Binder.getCallingUid(); Handler.this.sendMessage(msg); } } } 客户端绑定服务的时候通过Messenger#getBinder()返回IBinder对象 @Override public IBinder onBind(Intent intent) { if (mMessenger == null) { return null; } return mMessenger.getBinder(); } 客户端接收到onBind返回后,以IBinder为参数创建Messenger对象 public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); }

以上就完成了客户端向服务端发送数据的过程

客户端实现

与服务端一样创建Messenger对象并持有IMessenger对象 public final class Messenger implements Parcelable { private final IMessenger mTarget; public Messenger(Handler target) { mTarget = target.getIMessenger(); } } 客户端发送Message的时候传入Messenger对象 public final class Message implements Parcelable { public Messenger replyTo; } 服务端获取Message里的Messenger对象并发送数据到客户端 public final class Messenger implements Parcelable { private final IMessenger mTarget; public void send(Message message) throws RemoteException { mTarget.send(message); } }

以上就完成了服务端向客户端发送数据的过程

Messenger特性

双向通信异步数据处理使用Handler机制支持多客户端多线程封装了aidl细节
转载请注明原文地址: https://www.6miu.com/read-5035180.html

最新回复(0)