Android跨进程通信之Proxy与Stub(三)
16lz
2021-01-23
目录
Android跨进程通信之小例子(一)
Android跨进程通信之非AIDL(二)
Android跨进程通信之Proxy与Stub(三)
Android跨进程通信之AIDL(四)
什么是Proxy和Stub模式
在Android跨进程通信之非AIDL(二)这篇文章里,通信的过程大概就是这样的
非AIDLproxy-stub其中
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这篇文章里的代码我们只需做一点修改
@Overridepublic 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(); } }
更多相关文章
- Android彻底组件化—代码和资源隔离
- 获取Android的Java源代码并在Eclipse中关联查看的最新方法
- Android webkit image的加载过程解析(二)
- 在代码中实现android:tint效果
- 【Android 开发】: Android 消息处理机制之二: Message 中 obtai
- pandaboard ES学习之旅——4 Android源代码下载与编译
- Android跨进程通信之AIDL