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细节