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

article/2025/9/2 9:17:03

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

如下图所示:

3fb6d1c1c7d71b4792d30890bf29ea6f.png

图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()本地函数。

如下图:

5c201536e7a2d9393eaed143069ad35a.png

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

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

72e3360c0a830948b4f63d0a22c5eed5.png

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

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

3d8639ee3e9c07015dd00a8e30c16446.png

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

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

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

0547683a183fce520adc60a0cccf0631.png

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

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

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

2cdae80e9791118efe4a03b9ef9cfb41.png

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

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

28d510c05ff45d73a4ac179efe8844c5.png

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

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

6260d14dda79d5b526ec478916cebf65.png

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


http://chatgpt.dhexx.cn/article/GFtdH3Kn.shtml

相关文章

Android IPC 之获取服务(IBinder)

前言 IPC 系列文章: 建议按顺序阅读。 Android IPC 之Service 还可以这么理解 Android IPC 之Binder基础 Android IPC 之Binder应用 Android IPC 之AIDL应用(上) Android IPC 之AIDL应用(下) Android IPC 之Messenger 原理及应用 Android IPC 之服务端回调 Android…

android ibinder 机制,Android IBinder机制简单介绍

原理简介 我们都知道android 是通过IBinder来实现IPC(Inter Process Communication)进程间通信的。。。 借用一下: 1. Client、Server和Service Manager实现在用户空间中,Binder驱动程序实现在内核空间中 2. Binder驱动程序和Service Manager在Android平台中已经实现,开发者…

sql之嵌套查询中的带exists谓词的子查询

数据库系统概论之嵌套查询中的带exists谓词的子查询 一、exists谓词概述:exists谓词代表存在量词。带有exists谓词的子查询不返回任何数据,只产生逻辑真值“true”或逻辑假值“false”。可以利用exists来判断属性与关系表之间的属于关系,关系…

sql in和exist

前言 最近写SQL的时候要求在排除A表中所存在的B表的某些同属性值的记录。 然后就想到了in和exist,但是其实一直都没有真正的去弄懂两者不同, 于是在网上查询了一些大佬的文章,然后去实践了一番,最后做一个总结 开始啰 1&#xff…

SQL之EXISTS的理解

将外查询表的每一行,代入内查询作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。 先上表 过程:外查询Persons表,提取出数据到E…

sql中exists的常用用法

exists中子查询结果集非空,则exists子查询返回true。如果exists子查询结果集为空,则exists子查询返回false。在平常的开发工作中,经常会用到exists,那么它应该如何使用呢? 1:查询兴趣爱好为跳舞的同学姓名及…

MySQL SQL语句EXISTS

MySQL中EXITS语句用于查明表中是否存在特定的行。普遍情况下EXITS与子查询一起使用,并返回与子查询返回的结果相等或匹配的行。如果行在表中存在,则返回true,否则返回false。在MySQL中使用EXISTS是低效的,因为EXISTS对查理表中的每…

SQL语句中EXISTS的用法

SQL萌新一个,在这里记录一下自学过程中遇到的问题。 exists:强调的是,是否有返回集,不需要知道具体返回的是什么 比如这两个表: 输入查询语句: select * from customer c where not exists( select * from…

sql中 exists的用法

现有:班级表(A_CLASS) 学生表( STUDENT) 注:学生表(STUDENT)的classId关联班级表(A_CLASS)的主键ID 代码: select * from STUDENT s WHERE exists (select 1 from A_ClASS c where s.CLASS_…

SQL语句中EXISTS的详细用法大全

SQL语句中EXISTS的详细用法大全 前言一、建表1.在MySQL数据库建表语句2.在ORACLE数据库建表语句 二、在SELECT语句中使用EXISTS1.在SQL中使用EXISTS2.在SQL中使用NOT EXISTS3.在SQL中使用多个NOT EXISTS4.在SQL中使用多个EXISTS5.在SQL中使用NOT EXISTS和EXISTS 三、在DELETE语…

DNS服务器解析问题

DNS服务器解析问题 前言 重点: 本文摘选链接:https://www.ancii.com/aazeaa674/ 正文 问题 域名状态异常会导致网站不能访问吗? 刚修改过域名解析,为什么不生效呢? 如何查看解析是否生效呢? 刚在注…

dns服务器怎么设置

dns服务器怎么设置 在修改DNS之前需要先知道你的大DNS服务器地址是什么,那么怎么来查询DNS服务器地址呢?直接按住键盘上的“winR”,调出运行框。在输入框中输入“cmd”,点击“确定”或者回车。在管理员界面中输入命令:…

手机显示DNS服务器异常,手机dns服务器异常怎么设置

手机dns服务器异常怎么设置 内容精选 换一换 华为云帮助中心,为用户提供产品简介、价格说明、购买指南、用户指南、API参考、最佳实践、常见问题、视频帮助等技术文档,帮助您快速上手使用华为云服务。 本章节介绍如何通过控制台重启服务器。重启服务器时,可以批量更换云手机…

小米路由器显示DNS服务器设置错误,小米路由器dns地址怎么设置

小米路由器与日常所有的路由器一样,在默认情况下都是路由器的地址作为无线设备获取的 DNS 地址。如果你想手动修改小米路由器的DNS地址,也是可以的,下面是学习啦小编给大家整理的一些有关小米路由器dns地址设置方法,希望对大家有帮…

如何设置正确的dns服务器地址,dns服务器地址如何设置

dns服务器地址如何设置 (Windows 2000、Windows XP操作系统): 1、 开机后在桌面上选定图标"网上邻居", 点击鼠标右键, 在弹出的菜单上选择"属性"项,打开"网络和拔号连接"窗口, 如图 2、…

北京联通dns服务器位置,联通DNS服务器地址怎么设置

联通DNS服务器地址怎么设置 如电脑Win7系统,以下方法设置DNS:您右键点击电脑桌“网络”图标 ,“属性” >选择“控制面板” >在“网络和共享中心”中可看到当前的网络状况,点击左边的“更改适配器设置” >右键单击“本地连接”择“属性” >选择“internet协议版本4(TCP/…

路由器显示DNS服务器设置错误,路由器dns设置错误怎么处理

一般都给家里配上了无线路由器,但是在用了无线路由器后,很容易导致电脑断网,大家一般用软件检测后上面会显示是DNS地址出现了异常,那么应该怎么解决这个问题,不让电脑频繁断网呢?下面是学习啦小编给大家整理的一些有关…

无线路由dns服务器地址,tplink无线路由器怎么设置DNS服务器地址

作为不同网络之间互相连接的枢纽,路由器系统构成了基于TCP/IP 的国际互联网络Internet 的主体脉络,也可以说,路由器构成了Internet的骨架。在设置路由器的时候,很多用户不知道该怎么手动设置路由器的DNS服务器地址,下面我们就来看看详细的设置教程,需要的朋友可以参考下 …

Ros系统配置DNS服务器,ros设置dns服务器

ros设置dns服务器 内容精选 换一换 域名的DNS服务器定义了域名用于解析的权威DNS服务器。通过华为云注册成功的域名默认使用华为云DNS进行解析,详细内容,请参见华为云DNS对用户提供域名服务的DNS是什么?。若您选择非华为云DNS进行域名解析,可以修改域名的DNS服务器。域名注…

无线网首选dns服务器怎么设置,dns服务器设置(192.168.1.1的首选dns)

我们知道影响上网速度的因素有很多,硬件、软件等都是高速上网的基础,每个人都希望自家的网速越来快,在相同的硬件、带宽固定的情况下,如何来择优选择上网参数中的DNS服务器呢? DNS服务是网络参数必不少的一项&#xff…