Android知识Android开发程序员

Android跨进程通信之Proxy与Stub(三)

2017-03-08  本文已影响986人  Android开发哥

目录

Android跨进程通信之小例子(一)
Android跨进程通信之非AIDL(二)
Android跨进程通信之Proxy与Stub(三)
Android跨进程通信之AIDL(四)

什么是Proxy和Stub模式

Android跨进程通信之非AIDL(二)这篇文章里,通信的过程大概就是这样的

非AIDL

其中transactonTransact里面都有code的参数,呼叫方transact的时候给定一个code称为编码的过程。而onTransact取出code处理对应事件称为译码的过程。
我们可以通过在呼叫方这边添加一个Proxy对象,完成编码过程;在被呼叫方添加Stub对象,完成解码的过程。

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());
    }
}

我们可以直接通过这个代理类去完成编码并且发送消息的工作,并且把playpause方法接口暴露即可。

调用代码

对于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();
        }
    }
上一篇 下一篇

猜你喜欢

热点阅读