从IBinder接口学习Proxy-Stub设计模式

发布时间:2020-06-04 15:45:22 作者:myeit
来源:网络 阅读:3576

前言:

----IBinder是Android框架的通用性接口,通用性接口意味着,众人可以共享的接口。由于通用性(或共享性),框架开发者可以藉单一的通用性接口来<包容>形形***的特殊性接口;具有标准化接口的<减法设计>效果,但又不会减损特性用户或App对特殊性接口的需求。兼顾标准性和特殊性的,是框架通用性接口设计的重要指标;这是任何框架开发里,都必须面对的高度挑战性任务之一。

高老师陪您成长...

  从IBinder接口学习Proxy-Stub设计模式 


ee                                               ee

AndroidIBinder接口,学习Proxy-Stub设计模式

By  高焕堂


1. IBinder通用性接口

----大家都知道,当两个类都在同一个进程里执行时,两者之间的沟通,只要采取一般的函数调用(Function Call)就行了,既快速又方便。一旦两个类分别在不同的进程里执行时,两者之间的沟通,就不能采取一般的函数调用途径了。只好采取IPC沟通途径。Android框架的IPC沟通仰赖单一的IBinder通用性接口。如下图:

从IBinder接口学习Proxy-Stub设计模式
图1、Android框架里的IBinder通用性接口


----这种通用性接口,通常会规划一个抽像基类来实现它;而这抽像基类里则定义了抽象函数。如下图:

从IBinder接口学习Proxy-Stub设计模式

图2、由Binder基类来实现IBinder通用性接口

于是,这个抽象基类担任两项任务:

如下图所示:

从IBinder接口学习Proxy-Stub设计模式

图3、基类实现CI,并定义<I>

---- 由子类来实现内部接口<I>。Binder基类的很重要目的是支持跨进程调用Service,也就是让远程的Client可以跨进程调用某个Service。Binder基类定义于Binder.java档案里:

// Binder.java

// …….

public class Binder implements IBinder {

   // ..........

   private int mObject;

 public Binder() {

       init();

       // ...........

   }

 public final boolean transact(int code, Parcel data, Parcel reply,  int flags)

               throws RemoteException {

               // ................

               boolean r = onTransact(code, data, reply, flags);

               return r;

   }

private boolean execTransact(int code, int dataObj, int replyObj, int flags) {

       Parcel data = Parcel.obtain(dataObj);

       Parcel reply = Parcel.obtain(replyObj);

       boolean res;

       res = onTransact(code, data, reply, flags);

       // ............

       return res;

   }

  protected boolean onTransact(int code, Parcel data, Parcel reply,  int flags)

                    throws RemoteException {

       }

  private native final void init();

}

----Binder基类的主要函数是:

如下图:

从IBinder接口学习Proxy-Stub设计模式

图4、CI与<I>两个接口的合作

----这个IBinder接口是Binder基类提供给Client的接口,简称为“CI”。于是,Client端调用IBinder接口的transact()函数,透过IPC机制而调用到远方(Remote)的onTransact()函数。

从IBinder接口学习Proxy-Stub设计模式

图5、IBinder接口的主要用途:IPC通信

----其实,这个典型的通用性接口设计模式,还有很多种变化的形式。例如下图:

从IBinder接口学习Proxy-Stub设计模式

图6、通用性接口设计的变化

----虽然是一个简单的通用性接口设计模式,但是含有丰富的变化机制。例如上图的机制,就让C/C++层的模块成为架构的掌控者。然而,必须理解到:因为设计(和掌控)了IBinder通用性”接口”设计,才能充分保为了C/C++层的模块的”逻辑”控制权

例如,Android跨进程通信流程,都由底层Binder驱动模块所掌控,如下图所示:

从IBinder接口学习Proxy-Stub设计模式

 图7、底层Binder驱动模块是IPC的掌控者


2.  通用性接口与Proxy-Stub设计模式

----然而,在上图里的Activity里可能有多个函数,例如f1()和f2()等。于是,在Activity里,必须从f1()函数转而调用IBinder.transact()函数。如果我们在上述架构里面,加上一个Stub类别(如下图的BinderStub类别),它实现了Binder.onTransact()函数,如下图所示:

从IBinder接口学习Proxy-Stub设计模式

 图8、Stub类将通用性接口转为特殊性接口


----通常,在框架设计里,myProxy和myStub会是成对的,这称为Proxy-Stub模式。如下图所示:

从IBinder接口学习Proxy-Stub设计模式

 图9、Proxy类将特殊性接口转换到通用性接口


----采用Proxy-Stub设计模式将IBinder接口包装起来,让App与IBinder接口不再产生高度相依性。其将IBinder接口包装起来,转换出更好用的新接口,如下图里的IA接口:

从IBinder接口学习Proxy-Stub设计模式

图10、包装IBinder接口,转换出更好用的新接口

----Stub类将onTransact()函数隐藏起来,提供一个更具有美感、更亲切的新接口给subBinder类使用。隐藏了onTransact()函数之后,subBinder类的开发者就不必费心去了解onTransact()函数了。于是,Proxy与Stub两个类遥遥相对,并且将IPC细节知识(例如transact()和onTransact()函数之参数等)包夹起来。由于IBinder接口只提供单一函数(即transact()函数)来进行远距通信,呼叫起来比较不方便。所以Android提供aidl.exe工具来协助产出Proxy和Stub类别,以化解这个困难。只要你善于使用开发环境的工具(如Android的aidl.exe软件工具)自动产生Proxy和Stub类别的程序代码;那就很方便了


推荐阅读:
  1. 从IPlugin接口学习Proxy-Stub设计模式
  2. 从0开始学习安卓开发

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

设计模式 ibinder proxy-stub

上一篇:LIinux/windows服务器管理面板云帮手软件介绍

下一篇:Linux redhat7.0最小化安装图形界面

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》