Binder、IBinder 和 IInterface 的关系
Binder、IBinder 和 IInterface 的关系
IBinder 接口
Binder 实现了 IBinder 接口。
public class Binder implements IBinder {...
}
IBinder 接口定义了一些常量和方法。比如第一个交易码(transaction code)和最后一个交易码。
最小的交易码是 1,最大的交易码是 16 ^ 6 - 1 = 16777215。其他的交易码处于这两个值之间。可以看出最多有 16777215 个 transaction。
/*** The first transaction code available for user commands.*/int FIRST_CALL_TRANSACTION = 0x00000001;/*** The last transaction code available for user commands.*/int LAST_CALL_TRANSACTION = 0x00ffffff;
IBinder 接口也定义了一些方法,比如 isBinderAlive、queryLocalInterface、transact、linkToDeath、unlinkToDeath 等。
/*** Check to see if the process that the binder is in is still alive.** @return false if the process is not alive. Note that if it returns* true, the process may have died while the call is returning.*/public boolean isBinderAlive();/*** Attempt to retrieve a local implementation of an interface* for this Binder object. If null is returned, you will need* to instantiate a proxy class to marshall calls through* the transact() method.*/public @Nullable IInterface queryLocalInterface(@NonNull String descriptor);public boolean transact(int code, @NonNull Parcel data, @Nullable Parcel reply, int flags)throws RemoteException;public void linkToDeath(@NonNull DeathRecipient recipient, int flags)throws RemoteException;public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags);
IBinder 接口也定义了一个子接口,DeathRecipient,表示服务进程消失的回调。
/*** Interface for receiving a callback when the process hosting an IBinder* has gone away.* * @see #linkToDeath*/public interface DeathRecipient {public void binderDied();}
IInterface 接口
自定义的 AIDL 接口继承了 IInterface 接口。
public interface ICustomAidl extends android.os.IInterface {...
}
IInterface 接口只有一个方法,asBinder。
public IBinder asBinder();
asBinder() 方法用来返回 AIDL 接口里面的 Stub 类的对象。如果是同进程的本地接口,就是 this。否则是 BinderProxy 代理对象。
/** Local-side IPC implementation stub class. */
public static abstract class Stub extends android.os.Binder implements com.caoshen.androidsample.binder.ICustomAidl
{...@Override public android.os.IBinder asBinder()
{return this;
}
asInterface 方法
asInterface 是 Stub 类里面的静态方法,用来返回自定义的 AIDL 接口。
/*** Cast an IBinder object into an com.caoshen.androidsample.binder.ICustomAidl interface,* generating a proxy if needed.*/
public static com.caoshen.androidsample.binder.ICustomAidl asInterface(android.os.IBinder obj)
{if ((obj==null)) {return null;
}
android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
if (((iin!=null)&&(iin instanceof com.caoshen.androidsample.binder.ICustomAidl))) {return ((com.caoshen.androidsample.binder.ICustomAidl)iin);
}
return new com.caoshen.androidsample.binder.ICustomAidl.Stub.Proxy(obj);
}
可以看出,如果 queryLocalInterface 得到的是本地接口,就强转成自定义的 AIDL 接口。否则把 Binder 自身传入 BinderProxy 作为 mRemote,返回一个 BinderProxy 对象。
Binder、IBinder 和 IInterface 的关系相关推荐
- 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )
文章目录 前言 一.分析 AIDL 文件生成的 Java 源文件 1.IMyAidlInterface.java 中的类结构 2.DESCRIPTOR 描述符 3.Stub 构造方法 4.Stub.a ...
- Binder Java层实现(一):IBinder/IInterface/Binder/Stub
要点 面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体(本地对象)位于一个进程中,而它的引用( ...
- Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL
前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程 ...
- Android Binder概述
背景知识 为了更好的理解binder,我们要先澄清一下概念,因为Android 基于Linux内核,我们有必要了解相关知识. 进程隔离 进程隔离是为了保护操作系统进程之间互不干扰而设计的,这个技术是为 ...
- Binder相关面试总结(七):AIDL内部的实现原理是什么
AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件夹,在aidl文件夹的下面用j ...
- Binder相关面试总结(六):四大组件底层的通信机制是怎样的
一.前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的 ...
- 写给 Android 应用工程师的 Binder 原理剖析
2019独角兽企业重金招聘Python工程师标准>>> 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大 ...
- Binder实用指南(一) - 理解篇
这是关于Android Binder机制的一篇文章,Binder是Android里面非常重要的组成,也是最难理解的一块知识点,学习Binder最好的方法是深入源码阅读,因为Binder相关的知识错综复 ...
- Android插件化原理解析——Hook机制之Binder Hook
Android系统通过Binder机制给应用程序提供了一系列的系统服务,诸如ActivityManagerService,ClipboardManager, AudioManager等:这些广泛存在系 ...
最新文章
- dx9 lock unlock效率太低_synchronized的缺陷,Lock的诞生
- 在控制台打印sql语句的办法(MyBatis Log Plugin插件的安装与使用)
- Python学习教程:Python爬虫抓取技术的门道
- wdcp系统升级mysql5.7.11
- matlab语法手册下载,MATLAB及其在理工课程中的应用指南 第4版.pdf
- 编程语言是从哪蹦出来的——大型伦理寻根现场
- 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(二)
- html缩略文本,列表中展示富文本的缩略内容
- Refusing to install package with name “vue-i18n“ under a package
- 陕西省高等数学竞赛_关于参加“陕西高校第十二次大学生高等数学竞赛”的通知...
- POSIX XSI
- MSAgent(微软助手精灵)很好很强大
- 一个萌新关于电脑安装软件错误提示“1402”的应对方法
- 月光宝盒游戏机MAME街机模拟器方案源码项目解析----米饭模拟器(2)
- 【电路设计】RC振荡器 - 文氏电桥振荡器
- codesys 轴程序
- QT 控件加载图片不显示
- 【计蒜客 - 蓝桥训练】蒜厂年会(循环数列的最大子段和)
- linux rsh通信实现_RSH的网络通信细节
- picker多选 vant_Vant Picker 选择器