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来传递。