目录
Android跨进程通信之小例子(一)
Android跨进程通信之非AIDL(二)
Android跨进程通信之Proxy与Stub(三)
Android跨进程通信之AIDL(四)
什么是Proxy和Stub模式
在Android跨进程通信之非AIDL(二)这篇文章里,通信的过程大概就是这样的
其中
transact
和onTransact
里面都有code
的参数,呼叫方transact
的时候给定一个code
称为编码
的过程。而onTransact
取出code
处理对应事件称为译码
的过程。
我们可以通过在呼叫方这边添加一个Proxy对象,完成编码过程;在被呼叫方添加Stub对象,完成解码的过程。
使用Proxy和Stub改造之前的代码
BinderProxy代码
public class BinderProxy {
private IBinder mBinder;
private Parcel data = Parcel.obtain();
private Parcel reply = Parcel.obtain();
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public BinderProxy(IBinder binder) {
if (binder == null) {
throw new RuntimeException("Binder shoule not be null");
}
this.mBinder = binder;
}
public void play() throws RemoteException {
data.writeString("Activity request to play music at " + sdf.format(new Date()));
mBinder.transact(0, data, reply, 0);
Log.i("TAG", reply.readString());
}
public void pause() throws RemoteException {
data.writeString("Activity request to pause music at " + sdf.format(new Date()));
mBinder.transact(1, data, reply, 0);
Log.i("TAG", reply.readString());
}
}
我们可以直接通过这个代理类去完成编码并且发送消息的工作,并且把
play
和pause
方法接口暴露即可。
调用代码
对于Android跨进程(APP)通信(二) - 非AIDL这篇文章里的代码我们只需做一点修改
@Override
public void onServiceConnected(ComponentName name,IBinder service) {
mBinderProxy = new BinderProxy(service);
}
public void play(View v) {
if (!isBinded()) {
return;
}
try {
mBinderProxy.play();
} catch (RemoteException e) {
e.printStackTrace();
}
}
public void pause(View v) {
try {
mBinderProxy.pause();
} catch (RemoteException e) {
e.printStackTrace();
}
}