AIDL and Messenger
自定義Binder類
圖1
代碼
服務端
public class MyBinder extends Binder
{
public int getCount()
{
return count;
}
}
private MyBinder binder = new MyBinder();
@Override
public IBinder onBind(Intent intent)
{
return binder;
}
客戶端
MyBinder binder;
private ServiceConnection conn = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name,
IBinder service)
{
binder = (BindService.MyBinder) service;
}
};
bindService(intent, conn, Service.BIND_AUTO_CREATE);
binder.getCount();
AIDL
圖2
代碼
服務端
public class MyService extends IService.Stub
{
public int getCount()
{
return count;
}
}
private MyBinder myService = new MyBinder();
@Override
public IBinder onBind(Intent intent)
{
return myService;
}
客戶端
IService mService;
private ServiceConnection conn = new ServiceConnection()
{
@Override
public void onServiceConnected(ComponentName name,
IBinder service)
{
mService = IService.Stub.asInterface(service);
}
};
bindService(intent, conn, Service.BIND_AUTO_CREATE);
mService.getCount();
Messenger
圖3
代碼
服務端
private final Handler mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
byte[] data = response.getData().getByteArray("request");
.........
response.replyTo.send(reply);
}
};
private Messenger mMessenger = new Messenger(mHandler);
public IBinder onBind(Intent intent) {
return mMessenger.getBinder();
}
客戶端
public Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
switch (msg.what) {
case END_SERVM_DONE:
break;
default:
break;
}}};
private Messenger mSvcModeMessenger = new Messenger(mHandler);
public void onServiceConnected(ComponentName, IBinder service )
{
mServiceMessenger = new Messenger(service);
}
void invokeOemRilRequestRaw(byte[] data, Message response) {
response.setData(req);
response.replyTo = mSvcModeMessenger;
mServiceMessenger.send(response);
}
總結
自定義Binder類不屬於跨進程通信,屬於同進程通信,歸根結底三種通信方式都是要用到Binder。
自定義Binder傳遞的就是同一個Binder對象的引用。
AIDL是通過底層的Binder機制進行通信
Messenger則封裝了Hander,最本質還是IBinder對象,使用起來類似線程中的Hander通信。
兩種跨進程通信本質是一樣的,都是通過Binder來傳遞。