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細節