定义了抽象函数,如上图里的onTransact()函数,成为提供给众多子类别来实现的内部接口。我们以来表示之。

如下图所示:

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

---- 由子类来实现内部接口。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基类的主要函数是:

transact()函数 --- 用来实作IBinder的transact()函数接口。

execTransact()函数 --- 其角色与transact()函数是相同的,只是这是用来让C/C++本地程序来调用的。

onTransact()函数 --- 这是一个抽象函数,让应用子类来覆写(Override)的。上述的transact()和execTransact()两者都是调用onTransact()函数来实现反向调用(IoC, Inversion of Control)的。

init()函数 --- 这是一个本地(Native)函数,让JNI模块来实现这个函数。Binder()构造函数(Constructor)会调用这个init()本地函数。

如下图:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

图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类别的程序代码;那就很方便了。 ◆

android i 网络接口,从IBinder接口学习Proxy-Stub设计模式相关推荐

  1. android 接口实现方法,Android应用开发之Android 请求网络接口实现方法

    本文将带你了解Android应用开发之Android 请求网络接口实现方法,希望本文对大家学Android有所帮助. public   class Fragment01 extends Fragmen ...

  2. Android 服务类Service 的详细学习

    http://blog.csdn.net/vipzjyno1/article/details/26004831 Android服务类Service学习四大组建 目录(?)[+] 什么是服务 服务有什么 ...

  3. Android Framework添加自定义服务和接口

    1.扩展Framework接口 1.1.定义Java接口 在 frameworks/base/core/java目录下,根据包名创建一个子目录,比如我创建的是com/wrtsz/api/,在该目录下, ...

  4. 一篇读懂:Android手机如何通过USB接口与外设通信(附原理分析及方案选型)

    更多技术干货,欢迎扫码关注博主微信公众号:HowieXue,共同探讨软件知识经验,关注就有海量学习资料免费领哦: 目录 0背景 1.手机USB接口通信特点 1.1 使用方便 1.2 通用性强 1.3 ...

  5. 《Android平台开发之旅》学习笔记

    第三章:Android应用程序组件 3.2 Android应用程序组件 Activity 活动--形象大使 Service 服务--老黄牛 BroadcastReceiver 广播接收器 --倾听者 ...

  6. android ICS 系统启动之Logo有关学习总结

    android ICS 系统启动之Logo相关学习总结 前几天把android init 进程看了一遍,这次回过头来再把android系统启动的Logo相关学习内容做一个梳理和总结.我们知道andro ...

  7. android java ibinder_Android系统--IBinder和BpBinder

    IBinder和BpBinder 引言 总结之前学习的内容可以发现,对于ServiceManager,当想使用其服务的时候,我们首先引入了ServiceManagerProxy,再往上层可以发现是封装 ...

  8. Android Messenger跨进程通信相关学习总结

    Messenger是什么? Messenger是对AIDL的封装,AIDL又是基于Binder机制实现的,使用Messenger能使我们更简单的实现进程间通信 优势在于我们可以免于自己去定义.aidl ...

  9. 【尚观】Android游戏与应用开发最佳学习之路_转载来学习Android

    Android游戏与应用开发最佳学习路线图 为了帮助大家更好的学习Android,并快速入门特此我们为大家制定了以下学习路线图,希望能够帮助大家. 一.      路线图概括: 开博不到一周,不予上传 ...

最新文章

  1. LeetCode 175. Combine Two Tables--Database--数据库题目
  2. 670. 最大交换
  3. Js——elementFromPoint方法
  4. java通过jri 数据分析_SparkR安装部署及数据分析实例
  5. 程序发布出现: 服务器无法处理请求---无法生成临时类(result = 1)。 错误CS2001:未能找到源文件“C:\ Windows \ TEMP \ lph54vwf.0.cs”...
  6. 445port入侵详细解释
  7. 谭浩强《C语言程序设计第五版》第一章学习笔记
  8. java 代码练习题_99个java练习题及答案
  9. linux更新后不能进入系统,Ubuntu内核升级后无法进入系统的解决办法
  10. Markdown格式转换
  11. 一个HTTP打趴80%面试者
  12. Simulink如何添加模块到Library Browser
  13. 机器学习算法基础之使用python代码
  14. 树莓派使用360wifi2实现无线上网
  15. 奥赛金牌计算机博士中学老师,12岁获奥赛金牌,17岁读博的数学天才,全人教育下现状令人想不到...
  16. “神童”Tom Ding:区块链是下一代云计算和互联网的基础
  17. S7-1200的Socket通信设置
  18. java文件夹拒绝访问-java.io.FileNotFoundException: .\xx\xx (拒绝访问。)
  19. vue实现点击标题,显示隐藏兄弟元素(类似电脑打印设备显示打印设备)
  20. Concepts NREC Max-Pac 8.7.8.0 汉化版 NREC 8.78 后处理 机械叶轮加工软件 MAX PAC 8.7.8.0 版

热门文章

  1. VBA实例1 Excel人员资质及证件管理
  2. Swin Transformer: Hierarchical Vision Transformer using Shifted Windows 论文翻译 + 网络详解
  3. 【优化预测】粒子群算法优化BP神经网络预测温度matlab源码
  4. 如何用“心流”提升编码工作效率?
  5. stm32毕业设计 智能指纹识别门禁系统 - 物联网 单片机
  6. 增强型N沟道场效应管(MOSFET)的电池反接保护电路
  7. 快照(Snapshot)技术发展综述
  8. java 强引用和弱引用
  9. 翻译TIPatterns--项目(Projects)
  10. 中小企业CRM评测-客户和联系人管理_XToolsCRM