类目录:android.os.IBinder
直接子类是Binder
这个接口是能进行远程操作对象的一个基接口。定义了为在提供进程间和跨进程间的调用时提供高性能的轻量级远程调用的核心部分。该接口描述了与远程对象进行交互的抽象协议。
它的核心API是transact(),在它的直接子类中是Binder.onTransact()。这些方法允许你分别发送一个呼叫到一个IBinder对象和接收呼叫到一个Binder对象。
IBinder是什么呢?首先要明白,Android的远程调用(就是跨进程调用)就是通过IBinder实现的,下面是对android开发文档的翻译。
IBinder是远程对象的基本接口,是为高性能而设计的轻量级远程调用机制的核心部分。但它不仅用于远程调用,也用于进程内调用。这个接口定义了与远程对象交互的协议。不要直接实现这个接口,而应该从Binder派生。
IBinder的主要API是transact(),与它对应另一方法是Binder.onTransact()。第一个方法使你可以向远端的IBinder对象发送发出调用,第二个方法使你自己的远程对象能够响应接收到的调用。IBinder的API都是同步执行的,比如transact()直到对方的Binder.onTransact()方法调用完成后才返回。调用发生在进程内时无疑是这样的,而在进程间时,在IPC的帮助下,也是同样的效果。
通过transact()发送的数据是Parcel,Parcel是一种一般的缓冲区,除了有数据外还带有一些描述它内容的元数据。元数据用于管理IBinder对象的引用,这样就能在缓冲区从一个进程移动到另一个进程时保存这些引用。这样就保证了当一个IBinder被写入到Parcel并发送到另一个进程中,如果另一个进程把同一个IBinder的引用回发到原来的进程,那么这个原来的进程就能接收到发出的那个IBinder的引用。这种机制使IBinder和Binder像唯一标志符那样在进程间管理。
系统为每个进程维护一个存放交互线程的线程池。这些交互线程用于派送所有从另外进程发来的IPC调用。例如:当一个IPC从进程A发到进程B,A中那个发出调用的线程(这个应该不在线程池中)就阻塞在transact()中了。进程B中的交互线程池中的一个线程接收了这个调用,它调用Binder.onTransact(),完成后用一个Parcel来做为结果返回。然后进程A中的那个等待的线程在收到返回的Parcel后得以继续执行。实际上,另一个进程看起来就像是当前进程的一个线程,但不是当前进程创建的。
Binder机制还支持进程间的递归调用。例如,进程A执行自己的IBinder的transact()调用进程B的Binder,而进程B在其Binder.onTransact()中又用transact()向进程A发起调用,那么进程A在等待它发出的调用返回的同时,还会用Binder.onTransact()响应进程B的transact()。总之Binder造成的结果就是让我们感觉到跨进程的调用与进程内的调用没什么区别。
当操作远程对象时,你经常需要查看它们是否有效,有三种方法可以使用:
1 transact()方法将在IBinder所在的进程不存在时抛出RemoteException异常。
2 如果目标进程不存在,那么调用pingBinder()时返回false。
3 可以用linkToDeath()方法向IBinder注册一个IBinder.DeathRecipient,在IBinder代表的进程退出时被调用。
要实现IBinder来支持远程调用,应从Binder类派生一个类。Binder实现了IBinder接口。但是一般不需要直接实现此类,而是跟据你的需要由开发包中的工具生成,这个工具叫aidi。你通过aidi语言定义远程对象的方法,然后用aidi工具生成Binder的派生类,然后就可使用之。然而,可是,但是,当然,你也可以直接从Binder类派生以实现自定义的RPC调用,或只是实例化一个原始的Binder对象直接作为进程间共享的令牌来使用。

android ibinder类接口编辑相关推荐

  1. php 类 接口的区别吗,PHP的接口类(interface)和抽象类(abstract)的区别

    /** * 接口类:interface * 其实他们的作用很简单,当有很多人一起开发一个项目时,可能都会去调用别人写的一些类, * 那你就会问,我怎么知道他的某个功能的实现方法是怎么命名的呢,这个时候 ...

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

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

  3. Android IBinder的linkToDeath介绍及情景模拟

    最近查看Framework源码的时候,读到了AudioService处理音量的流程,在这里碰到了IBinder的linkToDeath()这个知识点,比较感兴趣,所以记录下来,并自己写demo尝试了一 ...

  4. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

  5. Android生命周期帮助类,Android Service类与生命周期详细介绍_Android_脚本之家

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Ser ...

  6. python接口自动化(三十六)-封装与调用--流程类接口关联续集(详解)

    简介 上一篇已经给大家都介绍过了流程类接口关联,但是由于博客的登录机制改变,所以没有办法给小伙伴们实战演练一下,那么这篇就按照上一篇计划的用jenkins来给小伙伴们演示一下流程类接口的封装和调用,其 ...

  7. python接口自动化(三十五)-封装与调用--流程类接口关联(详解)

    简介 流程相关的接口,主要用 session 关联,如果写成函数(如上篇),s 参数每个函数都要带,每个函数多个参数,这时候封装成类会更方便.在这里我们还是以博客园为例,带着小伙伴们实践一下. 接口封 ...

  8. Android ObjectAnimator类:手把手带你自定义属性动画

    前言 属性动画的使用 是 Android 开发中常用的知识 今天,我将讲解属性动画使用中最核心的一个方法类:ObjectAnimator,希望你们会喜欢. Carson带你学Android动画系列文章 ...

  9. Unity3D调用Android提供的接口

    需求:Android提供相关的接口,android只提供接口,没有相关的界面,android接口打包以jar包的形式供Unity3D调用 1.编写相关的android接口 在studio中新建工程,并 ...

最新文章

  1. vue 数据(data)赋值问题
  2. C#中的构造方法与对象初始化器
  3. python 常见问题汇总(待续)
  4. centos一键清理磁盘空间_如何清理 Docker 占用的磁盘空间
  5. 【EOJ Monthly 2019.02 - E】中位数(二分 ,中位数 ,−1/1变换,dp求解DAG最长路)
  6. 关于xfce中桌面没法显示回收站以及thunar中无法进行卷管理的解决办法
  7. Android 摇一摇(二)
  8. HTML img 标签的 alt 属性
  9. css对于文字过长加省略号
  10. 访问kubernetes dashboard UI报错
  11. Linux系统配置ftps服务(显式)
  12. Latex系列[2]--公式中的字体
  13. 计数器函数 php,PHP用函数嵌入网站访问量计数器
  14. 3w最简单led灯电路图_怎么选择自己合适的LED驱动IC?(十大LED驱动IC典型应用电路图)...
  15. Zookeeper + Centos7 详细安装教程
  16. IPV6地址解析与DAD机制实验分析
  17. 三级公立医院绩效考核操作手册
  18. 关于office2016卸载后注册表残留无法重新安装问题解决
  19. Vulkan再探(12):输入附件
  20. 红队使用的那些工具(基础篇)附下载

热门文章

  1. Python-matplotlib:调整坐标轴位置、标签位置和标签方向,以及X轴刻度标签位置
  2. 支付宝社交风波以道歉收场,微信小程序会有不同结局吗?
  3. 只用2秒,轻松获取一线所有城市公交数据!
  4. WEB前端面试常见的问题及答案
  5. 电脑下载速度一快电脑就卡的问题解决
  6. 使用开源DocX 生成Word
  7. vue中将html页面转为图片并且下载该图片
  8. ded汉语意思_DED是什么意思
  9. 信息安全工程师学习笔记《第四章》
  10. C++: #define中的三个特殊符号:#,##,#@