Binder的工作原理浅析
在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制。
一、在Android Studio中建立AIDL
首先,我们需要建立一个AIDL
1.在建立了对应的实现Parcelable接口的实体类和AIDL接口后,文件结构如下:
2.点击clean Project/reBuild Project,出现如下错误:提示无法找到Book实体类。
3.解决方案
这个问题的出现是因为我还没有在build.gradle中对默认的sourceSets进行修改,默认情况下他指定的源码目录不包括aidl。
加入下面语句后同步build.gradle,再重建工程即可。
在app下的build.gradle添加:
系统自动生成的IBookManager
二、Binder原理分析
通过Structure
我们可以看到这个系统生成这个接口文件包括一个静态抽象类Stub和两个方法getBookList()和addBook(),这两个方法很显然就是我们之前在IBookManager.aidl中声明的方法,此外它还为这两个方法用两个int来标示,从而在onTransact()方法中起到标示作用,如下所示:
而内部类Stub继承自Binder,在这个类内部又有一个代理类Proxy。接下来看这一段代码:
这里判断了客户端和服务端是否处于同一个进程中,如果处于同一个进程中,则方法调用不会走跨进程的transact方法,而如果处于不同的进程中,则需要通过其中的代理里proxy来完成。下面展现代理类
在这个代理类中的getBookList和addBook方法中调用transact方法来发起RPC(远程过程调用)请求,并将当前线程挂起,然后服务端的onTransact方法响应并执行,当RPC过程返回后,当前线程继续执行。
从上述描述中我们可以得出Binder的大概工作方式了,但其中有两点需要特别说明:
1.其实刚才也已经有所提及,即当客户端发起远程调用时会将当前线程挂起直至服务端方法执行完毕后才继续执行,所以如果一个远程方法比较耗时的话,是不能在UI线程中发起远程请求的,需要我们开启一个子线程然后再去进行远程调用。
2.由于服务端的Binder方法是运行在Binder的线程池中的,所以我们需要以同步的方式去实现保证线程安全。
Binder的工作机制具体如下图所示:
三、Binder的两个重要方法
上面我们提到Binder运行在服务端进程,那么如果服务端进程由于某种原因异常终止,这个时候服务端的Binder死亡,会导致我们的远程调用失败,并且我们还不知道Binder连接断裂了。所以我们需要有方法来提示我们Binder已经断裂,然后我们就可以重新绑定远程Service。
为此,Binder提供了两个配对的方法linkToDeath和unlinkToDeath,通过linkToDeath我们可以给Binder设置一个死亡代理,当其死亡时我们就能知道从而重现发起连接。
具体如下:
private IBinder.DeathRecipient deathRecipient = new IBinder.DeathRecipient(){ @Override
public void binderDied() {
if(mBookManager==null)
return;;
mBookManager.asBinder().unlinkToDeath(mDeathRecipient,0);
mBookManager=null;
//TODO:这里重现绑定远程Service }
};
在客户单绑定远程服务成功后,给binder设置死亡代理。
mService=IMessageBoxManager.Stub.asInterface(binder);
binder.linkToDeath(mDeathRecipient,0);
其中linkToDeath的第二个参数是个标记位,这里我们直接设为0,。
Binder的工作原理浅析的更多相关文章
- CPU处理器架构和工作原理浅析
CPU处理器架构和工作原理浅析 http://c.biancheng.net/view/3456.html 汇编语言是学习计算机如何工作的很好的工具,它需要我们具备计算机硬件的工作知识. 基本微机设计 ...
- Binder的工作机制浅析
在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...
- SPI协议及其工作原理浅析
转载自:http://bbs.chinaunix.net/thread-1916003-1-1.html一.概述. SPI, Serial Perripheral Interface, 串行外围设备接 ...
- SPI协议及其工作原理浅析【转】
转自:http://www.laoliu-soft.net/category/tech_chap/tech_linux/ 一.概述. SPI, Serial Perripheral Interface ...
- JQuery选择器$()的工作原理浅析
每次申明一个jQuery对象的时候,返回的是jQuery.prototype.init对象,很多人就会不明白,init明明是jQuery.fn的方法啊,实际上这里不是方法,而是init的构造函数,因为 ...
- @清晰掉 spi协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理浅析 http://bbs.chinaunix.net/thread-1916003-1-1.html 一.概述. SPI, Serial Perripheral ...
- “Ceph浅析”系列之五——Ceph的工作原理及流程
本文将对Ceph的工作原理和若干关键工作流程进行扼要介绍.如前所述,由于Ceph的功能实现本质上依托于RADOS,因而,此处的介绍事实上也是针对RADOS进行.对于上层的部分,特别是RADOS GW和 ...
- 浅析AIDL的使用和工作原理
AIDL是一种接口定义语言,用于生成可在Android设备上两个进程之间进行进程间通信(IPC)的代码. AIDL的使用 新建一个aidl文件,定义进程间通信的接口 // IStudentManage ...
- springmvc工作原理以及源码分析(基于spring3.1.0)
springmvc是一个基于spring的web框架.本篇文章对它的工作原理以及源码进行深入分析. 一.springmvc请求处理流程 二.springmvc的工作机制 三.springmvc核心源码 ...
随机推荐
- 单词计数,杭电0j-2072
原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=2072 [Problem Description] lily的好朋友xiaoou333最近很空,他想了一 ...
- 模板不存在:./xx 错误位置 FILE: LINE:110 (thinkphp上传至服务器后模板无法解析原因)
thinkphp上传至服务器后模板无法解析原因 前几日做好的响应式静态页面上传至虚拟空间,打开网址地址出现: 模板不存在:./App/Admin/View/Config/customerService ...
- Centos5搭建vsftpd服务
更换镜像源 由于centos5已经历史久远,内置的镜像源已经不能用.看: 因此,我手工更换了阿里云的源.(ps:我本来是想用网易的源,但不知为什么,这个源在安装vsftpd时提示http 404错误) ...
- c++堆与栈的简单认识
堆: 操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删 除,并将该结点的空间分配给程序,另外,对于大多数 ...
- swift - uicollectionView自定义流水布局
TYWaterFallLayout 不规则流水布局 - swift3.0 配图 使用方法 //创建layout let layout = TYWaterFallLayout() layout.sect ...
- html学习笔记 - 标签
单标签 : <!DOCTYPE html> 解析类型标签 <!-- xxx --> 注释标签 <br /> 换行标签 <hr /> 分割线标签 < ...
- 计蒜客蓝桥杯模拟赛五J. 程序设计:放置守卫
在一张 n 行 m 列的方格地图上放置一些守卫,每个守卫能守护上.左.右三个方向上相邻的方格和自己所在的方格.如下图,红色的方格放置守卫,绿色的方格为该守卫守护的区域. 现在要求在地图上放置若干个守卫 ...
- 面试(3)-java-se-java中的匿名内部类总结
java中的匿名内部类总结 匿名内部类也就是没有名字的内部类 正因为没有名字,所以匿名内部类只能使用一次,它通常用来简化代码编写 但使用匿名内部类还有个前提条件:必须继承一个父类或实现一个接口 实例1 ...
- GRPC在NET上的实践(记录篇)
GRPC是什么? GRPC是一个开源RPC框架,于2015年3月开源,其由Google主要面向移动应用开发并基于HTTP/2协议标准而设计,基于Protobuf 3.0(Protocol Buffer ...
- WCF(远程服务器返回错误: 400 错误的请求)
类似相关问题有以下: WCF- restful接口 POST方式调用报错(远程服务器返回错误: 400 错误的请求) WCF Rest:不使用UriTemplate使用post方式传参解决HTTP40 ...