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核心源码 ...
随机推荐
- Guvav:Options使用和避免NULL
JAVA中的null null是Java中一个很重要的概念.null设计初衷是为了表示一些不确定的东西.null是Java中的关键字,它是大小写敏感的,你不能将null写成Null或NULL,编译器将 ...
- 文本主题模型之LDA(一) LDA基础
文本主题模型之LDA(一) LDA基础 文本主题模型之LDA(二) LDA求解之Gibbs采样算法 文本主题模型之LDA(三) LDA求解之变分推断EM算法(TODO) 在前面我们讲到了基于矩阵分解的 ...
- 【JAVAWEB学习笔记】15_request
HttpServletRequest 学习目标 案例一.完成用户注册 案例二.完成登录错误信息的回显 1.HttpServletRequest概述 我们在创建Servlet时会覆盖service()方 ...
- 【JAVAWEB学习笔记】25_Linux基础
Linux基础 学习目标 1.了解Linux的简介与安装 2.掌握Linux常用的命令 3.掌握Linux系统上JDK.Mysql.Tomcat的安装 一.Linux的简介 1.Linux的概述 Li ...
- Spring切面通知执行的顺序(Advice Order)
问题描述 如果在Spring的程序中同时定义了环绕通知(Around)和前置通知(Before)..那么,有以下问题: 1.怎么让两个切面通知都起作用 2.或者让两者切面按自己指定的顺序进行执行? 3 ...
- Java 8 Learn Notes
Main reference: [1] http://winterbe.com/posts/2014/03/16/java-8-tutorial/ [2] https://plus.google.co ...
- meta标签属性总结
一.常见name属性.不同参数含义 meta标签的name属性语法格式是: <meta name="参数" content="具体的参数值"> 其中 ...
- Mac和Windows系统下Mysql数据库的导入导出
最近在构建数据库的过程中,需要将Mac os系统下的Mysql数据库导出成.sql文件,然后导入到windows系统下的Mysql中.经过学习总结出的步骤如下: 一.Mac os导出Mysql数据库 ...
- Spark学习资料共享
链接相关 课件代码:http://pan.baidu.com/s/1nvbkRSt 教学视频:http://pan.baidu.com/s/1c12XsIG 这是最近买的付费教程,对资料感兴趣的可以在 ...
- Lambda类库篇 —— Streams API, Collector和并行
本文是深入理解Java 8 Lambda系列的第二篇,主要介绍Java 8针对新增语言特性而新增的类库(例如Streams API.Collectors和并行). 本文是对 Brian Goetz 的 ...