在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的工作机制浅析的更多相关文章

  1. Binder的工作原理浅析

    在Android开发中,Binder主要用于Service中,包括AIDL和Messenger,其中Messenger的底层实现就是AIDL,所以我们这里通过AIDL来分析一下Binder的工作机制. ...

  2. Android IPC机制—Binder的工作机制

    进程和线程的关系 IPC机制即为跨进程通信,是inter-Process Communication的缩写.是指两个进程之间进行通信.在说进程通信之前,我们的弄明白什么是线程,什么是进程.进程和线程是 ...

  3. MySQL Proxy和 Amoeba 工作机制浅析

    MySQL Proxy处于客户端应用程序和MySQL服务器之间,通过截断.改变并转发客户端和后端数据库之间的通信来实现其功能,这和WinGate 之类的网络代理服务器的基本思想是一样的.代理服务器是和 ...

  4. Java I/O 的工作机制浅析

    I/O 问题可以说是当今互联网 Web 应用中所面临的主要问题之一,因为当前在这个海量数据时代,数据在网络中随处流动.这个流动的过程中都涉及到 I/O 问题,可以说大部分 Web 应用系统的瓶颈都是 ...

  5. Android 进阶8:进程通信之 Binder 机制浅析

    读完本文你将了解: IBinder Binder Binder 通信机制 Binder 驱动 Service Manager Binder 机制跨进程通信流程 Binder 机制的优点 总结 Than ...

  6. oracle的resetlogs机制浅析

    oracle的resetlogs机制浅析 alter database open resetlogs 这个命令我想大家都很熟悉了,那有没有想过这个resetlogs选项为什么要用?什么时候用?它的原理 ...

  7. Android 4.4 Kitkat Phone工作流程浅析(七)__来电(MT)响铃流程

    本文来自http://blog.csdn.net/yihongyuelan 转载请务必注明出处 本文代码以MTK平台Android 4.4为分析对象,与Google原生AOSP有些许差异,请读者知悉. ...

  8. 红茶一杯话Binder (传输机制篇_下)

    红茶一杯话Binder (传输机制篇_下) 侯 亮 1 事务的传递和处理 从IPCThreadState的角度看,它的transact()函数是通过向binder驱动发出BC_TRANSACTION语 ...

  9. 红茶一杯话Binder (传输机制篇_中)

    红茶一杯话Binder (传输机制篇_中) 侯 亮 1 谈谈底层IPC机制吧 在上一篇文章的最后,我们说到BpBinder将数据发到了Binder驱动.然而在驱动层,这部分数据又是如何传递到BBind ...

随机推荐

  1. OLAP和OLTP的区别(基础知识)

    联机分析处理 (OLAP) 的概念最早是由关系数据库之父E.F.Codd于1993年提出的,他同时提出了关于OLAP的12条准则.OLAP的提出引起了很大的反响,OLAP作为一类产品同联机事务处理 ( ...

  2. dubbox消费者启动成功,却无法连接注册中心

    使用dubbox作为服务提供端很好实现,因为git的说明和网上有很多的例子可供参考,但是消费端都一笔带过,简单得很,初学者往往以为只要配置如下3样东西就够了: <?xml version=&qu ...

  3. php 权限 管理

    权限的思考: https://www.jianshu.com/p/cf9077a7d38a 权限例子,用户 角色 功能 用户角色关联表 角色功能关联表 http://www.cnblogs.com/n ...

  4. MySQL error : Deadlock found when trying to get lock; try restarting transaction

    在使用 MySQL 时,我们有时会遇到这样的报错:“Deadlock found when trying to get lock; try restarting transaction”. 在 14. ...

  5. PHP面向对象深入研究之【继承】,减少代码重复

    继承 先看两个类 <?php class CdProduct { public $playLength; // 播放时间 public $title; public $producerMainN ...

  6. window.open()打开新窗口被拦截

    window.open( url )是常用的打开新页面的方法,一般都没有问题,但是如果在ajax回调方法里面使用就会被浏览器拦截,因为在浏览器安全机制中,页面弹窗必须是由用户触发的才是安全弹窗,比如说 ...

  7. Java中的intern变量的讲解

    一般我们变成很少使用到 intern这个方法,今天我就来解释一下这个方法是干什么的,做什么用的 首先请大家看一个例子: public static void main(String[] args) t ...

  8. 7.solr学习速成之facet

    Facet 介绍   Facet 是 solr 的高级搜索功能之一 ,可以给用户提供更友好的搜索体验,在搜索关键字的同时 , 能够按照 Facet 的字段进行分组并统计.        比如你上淘宝, ...

  9. Bokeh绘图

     http://bokeh.pydata.org/en/latest Bokeh 是一个专门针对Web浏览器的呈现功能的交互式可视化Python库.这是Bokeh与其它可视化库最核心的区别. 专门针对 ...

  10. Delphi.NET

    Delphi.NET Borland.VclDSnap.dll Borland.Vcl.TCustomClientDataSet TFieldType.ftBCD Borland.Vcl.TField ...