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 的关系相关推荐

  1. 【Binder 机制】AIDL 分析 ( 分析 AIDL 文件生成的 Java 源文件 | Binder | IBinder | Stub | Proxy )

    文章目录 前言 一.分析 AIDL 文件生成的 Java 源文件 1.IMyAidlInterface.java 中的类结构 2.DESCRIPTOR 描述符 3.Stub 构造方法 4.Stub.a ...

  2. Binder Java层实现(一):IBinder/IInterface/Binder/Stub

    要点 面向对象思想的引入将进程间通信转化为通过对某个Binder对象的引用调用该对象的方法,而其独特之处在于Binder对象是一个可以跨进程引用的对象,它的实体(本地对象)位于一个进程中,而它的引用( ...

  3. Android进阶——Android跨进程通讯机制之Binder、IBinder、Parcel、AIDL

    前言 Binder机制是Android系统提供的跨进程通讯机制,这篇文章开始会从Linux相关的基础概念知识开始介绍,从基础概念知识中引出Binder机制,归纳Binder机制与Linux系统的跨进程 ...

  4. Android Binder概述

    背景知识 为了更好的理解binder,我们要先澄清一下概念,因为Android 基于Linux内核,我们有必要了解相关知识. 进程隔离 进程隔离是为了保护操作系统进程之间互不干扰而设计的,这个技术是为 ...

  5. Binder相关面试总结(七):AIDL内部的实现原理是什么

    AIDL的作用是实现跨进程通讯使用方法也非常的简单,他的设计模式是典型的C/S架构.使用AIDL只要在Client端和Server端的项目根目录下面创建一个aidl的文件夹,在aidl文件夹的下面用j ...

  6. Binder相关面试总结(六):四大组件底层的通信机制是怎样的

    一.前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大方.又怕自己理解不够透彻,无法用清晰直白的文字准确的表达出 Binder 的 ...

  7. 写给 Android 应用工程师的 Binder 原理剖析

    2019独角兽企业重金招聘Python工程师标准>>> 一. 前言 这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔.生怕自己理解上还有偏差,对大家造成误解,贻笑大 ...

  8. Binder实用指南(一) - 理解篇

    这是关于Android Binder机制的一篇文章,Binder是Android里面非常重要的组成,也是最难理解的一块知识点,学习Binder最好的方法是深入源码阅读,因为Binder相关的知识错综复 ...

  9. Android插件化原理解析——Hook机制之Binder Hook

    Android系统通过Binder机制给应用程序提供了一系列的系统服务,诸如ActivityManagerService,ClipboardManager, AudioManager等:这些广泛存在系 ...

最新文章

  1. dx9 lock unlock效率太低_synchronized的缺陷,Lock的诞生
  2. 在控制台打印sql语句的办法(MyBatis Log Plugin插件的安装与使用)
  3. Python学习教程:Python爬虫抓取技术的门道
  4. wdcp系统升级mysql5.7.11
  5. matlab语法手册下载,MATLAB及其在理工课程中的应用指南 第4版.pdf
  6. 编程语言是从哪蹦出来的——大型伦理寻根现场
  7. 机器学习实战(用Scikit-learn和TensorFlow进行机器学习)(二)
  8. html缩略文本,列表中展示富文本的缩略内容
  9. Refusing to install package with name “vue-i18n“ under a package
  10. 陕西省高等数学竞赛_关于参加“陕西高校第十二次大学生高等数学竞赛”的通知...
  11. POSIX XSI
  12. MSAgent(微软助手精灵)很好很强大
  13. 一个萌新关于电脑安装软件错误提示“1402”的应对方法
  14. 月光宝盒游戏机MAME街机模拟器方案源码项目解析----米饭模拟器(2)
  15. 【电路设计】RC振荡器 - 文氏电桥振荡器
  16. codesys 轴程序
  17. QT 控件加载图片不显示
  18. 【计蒜客 - 蓝桥训练】蒜厂年会(循环数列的最大子段和)
  19. linux rsh通信实现_RSH的网络通信细节
  20. picker多选 vant_Vant Picker 选择器

热门文章

  1. win7系统中Fiddler根证书创建失败的解决方法
  2. 翻译技能提升的主要难点和对策(含入门书籍和资料推荐)丨打死个翻译官 2.2
  3. 网站图标favicon.ico
  4. 关于颈椎病,上班族必须知道的TOP5
  5. 在华为工作十年的大佬手把手教你Charles抓包工具使用,还学不会你就完了!
  6. UTF-8 GBK UTF8 GB2312 之间的区别和关系
  7. Cesium数字乡村项目模板
  8. 区块链攻击方式总结二
  9. 【汇正财经顾晨浩】A股冲关时刻,美股暴跌
  10. 《python数据分析与挖掘实战》(一)1-5章