目錄
Android跨進(jìn)程通信之小例子(一)
Android跨進(jìn)程通信之非AIDL(二)
Android跨進(jìn)程通信之Proxy與Stub(三)
Android跨進(jìn)程通信之AIDL(四)
什么是Proxy和Stub模式
在Android跨進(jìn)程通信之非AIDL(二)這篇文章里,通信的過程大概就是這樣的
非AIDL
其中
transact
和onTransact
里面都有code
的參數(shù),呼叫方transact
的時(shí)候給定一個(gè)code
稱為編碼
的過程。而onTransact
取出code
處理對(duì)應(yīng)事件稱為譯碼
的過程迁沫。
我們可以通過在呼叫方這邊添加一個(gè)Proxy對(duì)象婆瓜,完成編碼過程榜苫;在被呼叫方添加Stub對(duì)象近迁,完成解碼的過程代嗤。
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());
}
}
我們可以直接通過這個(gè)代理類去完成編碼并且發(fā)送消息的工作,并且把
play
和pause
方法接口暴露即可炕淮。
調(diào)用代碼
對(duì)于Android跨進(jìn)程(APP)通信(二) - 非AIDL這篇文章里的代碼我們只需做一點(diǎn)修改
@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();
}
}