Android开发:什么是IBinder

上回书简单描述了进程间传递类对象的原理,这回在讲Parcel之前,先要讲一个东西:IBinder。
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对象直接作为进程间共享的令牌来使用。

转载于:https://www.cnblogs.com/phonegap/archive/2011/05/29/2536018.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263462.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Debug调试

先设置断点,然后Debug调试 step into:进入子函数step over:越过子函数,但子函数会执行step return:跳出子函数转载于:https://www.cnblogs.com/android-for-dh/p/4482519.html

python matplotlib绘图大全(散点图、柱状图、饼图、极坐标图、热量图、三维图以及热图)...

//2019.7.14晚matplotlib七种常见图像输出编程大全 七种图形汇总输出如下: import numpy as np #导入数据结构nmupy模块import matplotlib.pyplot as plt #导入matplotlib图像输出模块plt.rcParams["font.sans-serif"]["SimHei"] #输出图像的标…

Java入门需掌握的30个基本概念[转]

Java的白皮书为我们提出了Java语言的11个关键特性(1)Easy:Java的语法比C的相对简单,另一个方面就是Java能使软件在很小的机器上运行,基础解释其和类库的支持的大小约为40kb,增加基本的标准库和线程支持的内存需要增加125kb。(2)分布式:Java带…

LeetCode—241. 为运算表达式设计优先级

241. 为运算表达式设计优先级 题目描述: 给你一个由数字和运算符组成的字符串 expression ,按不同优先级组合数字和运算符,计算并返回所有可能组合的结果。你可以按任意顺序 返回答案。 考察重点:(递归分治) 以符号位分割为左右…

报错:不是可以识别的内置函数名称

!!创建函数的时候不需要加dbo.,但在访问的时候,标量函数要加.dbo的 自己写完的函数,调用后报错提示:不是可以识别的内置函数名称 例:SELECT JS_ID A.ID, JSHM A.JSHM, JS_MC A.JS_MC, XY_DM …

C++右值引用与转移语义

std::forwad? C11 中定义的 T&& 的推导规则为: 右值实参为右值引用,左值实参仍然为左值引用。 参考: 右值引用与转移语义转载于:https://www.cnblogs.com/glensblog/p/11098359.html

gltail安装

是基于Ruby,所以服务器需要安装有ruby,国内需要把ruby的源改为淘宝的 Centos上 yum groupinstall "Development Tools" yum -y install freeglut libX11-devel mesa-libGL-devel perl-Time-HiRes freeglut-devel readline-devel libffi-devel libtool bison libxml…

微软获得O/R映射技术专利 业界担忧阻碍技术进展

一组微软员工申报了O/R映射技术的专利。 该专利将对业界现有的O/R映射产品造成怎样的影响目前尚不清楚,但有业界专家担忧微软将借此专利打压竞争对手。 这份专利档案是被网友无意间在专利信息查询网站FreshPatents.com上找到的,点此可以浏览原文。该专利…

Linux下安装Perl模块

# perl -MCPAN -e install Time::HiRes# perl -MCPAN -e install File::Tail# perl -MCPAN -e install Date::Parse# perl -MCPAN -e install Net::Netmask转载于:https://www.cnblogs.com/nwf5d/archive/2011/06/07/2074259.html

LeetCode—260. 只出现一次的数字 III

260. 只出现一次的数字 III 题目描述: 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 进阶:你的算法应该具有线性时间复杂度。你能否…

keras中接口

接口文档 https://keras-cn.readthedocs.io/en/latest/layers/merge/转载于:https://www.cnblogs.com/charlie7/p/11190102.html

【活动】畅想云端加油站,赢iPad

2019独角兽企业重金招聘Python工程师标准>>> 中石化联手阿里云升级石油化工业务,已运行2月 中石化的“互联网”战略正在不断深化。4月20日消息,中石化与阿里云共同宣布,双方将展开技术合作,借助阿里巴巴在云计算、大数…

编写 Servlet 2.3 Filter

Servlets Filter 是Servlet 2.3 规范中新增加的,它是截取用户从客户端提交的请求,在还没有到达需要访问的资源时运行的一个类。它操纵来自客户端的请求,在资源还没有初发送到客户端前截取响应,并处理这些还没有发送到客户端的响应…

我记录网站综合系统 -- 技术原理解析[0:简介(代序) 1.7Beta源代码下载开始]...

看到了路过秋天的博客系统受到了大家的好评,我也来介绍一个好的开源的CMS系统。我记录网站综合系统 是 掷鸡蛋者 的作品,这个家伙将大量的时间和精力放在这个项目上了,可以算一个创业项目。对于这样的同志,我只有敬佩他和全力支持…

c++—简单的密码本实现

主要实现功能有增删改查数据,本地读取保存。 数据存储设计 data.h data.cpp #pragma once #define 添加账户 1 #define 删除账户 2 #define 修改账户 3 #define 查询账户 4 #define 查询所有 5 #define 保存本地 6 #define 退出 …

PowerShell在Exchange2010下快速创建动态通讯组

Exchange中遇到一个小需求,有很多部门要申请动态通信组,问题是二级部门三级部门四级部门非常非常多。……Get-ADObject -LDAPFilter "(&(&(ou>"")))" -SearchBase OUxx,OUxxx,DCxxx,DCxxx,DCcom -Properties CanonicalNa…

LeetCode—262. 行程和用户(困难)

262. 行程和用户(困难) 题目描述: 取消率 的计算方式如下:(被司机或乘客取消的非禁止用户生成的订单数量) / (非禁止用户生成的订单总数)。 写一段 SQL 语句查出 “2013-10-01” 至 “2013-10-03” 期间非禁止用户(乘客和司机都必须未被禁止…

动态创建数据库

动态创建数据库,就是不在sql企业管理器中设计数据库,而是在程序中建库并建表。 我原来对用程序操作数据库的概念总是先有一个跟数据库的连接,再用command对数据库操作。但这一次发现问题了,还没有我要创建的数 据库&#xff0c…

第五章 数组和指针的关系

如果对声明数组的语句不太明白的话&#xff0c;请参阅我前段时间贴出的文章<<如何理解c和c的复杂类型声明>>。 数组的数组名其实可以看作一个指针。看下例&#xff1a; 例八&#xff1a; int array[10]{0,1,2,3,4,5,6,7,8,9},value; ... ... valuearray[0];//也可写…

第5章 JVM调优

2019独角兽企业重金招聘Python工程师标准>>> ##5.1 Java虚拟机内存模型## Java虚拟机内存模型是Java程序运行的基础。JVM将其内存数据分为程序计数器&#xff0c;虚拟机栈&#xff0c;本地方法栈&#xff0c;Java堆和方法区等部分。 程序计数器&#xff1a;用于存放…