最近在拜读任主席的Android开发艺术探索,现在看了一半,再回头看前面的,感觉跟没有看一样,所以还是把知识点总结一下吧,这一节咱们来讲一下IPC中的Binder

直观来说,Binder是Android中的一个实现了IBinder接口的类;从IPC角度来看,Binder是Android中一个跨进程通信的方式;从Android FrameWork角度来说,Binder是ServiceManager连接各种Manager和相应ManagerService的桥梁;从Android应用层来说,Binder是客户端和服务端进行通信的媒介。
Android开发中Binder主要用在Service中,包括AIDL和Messenger,普通的Service中的Binder不涉及进程间通信,所以较为简单,而Messenger的底层其实是AIDL,所以选择AIDL来分析Binder工作机制。
在使用AIDL的时候,Android编译器会根据我们定义的aidl文件,自动生成对应的java文件,这个java类继承了IInterface接口, 根据aidl文件中声明的方法实现了对应的方法,同时声明了几个整形的id分别用于标识我们声明的方法,这个几个id用于标识在transact过程中客户端所请求的到底是哪个方法。声明了一个内部类Stub,其实就是一个Binder类,只有当客户端和服务端不位于同一个进程时,方法调用才会走transact过程,这个逻辑有Stub类的内部代理类Proxy来完成,所以这个类的核心就是Stub类和Stub的内部代理类Proxy,下面来介绍一下这两个类中每个方法的含义:

  • DESCRIPTOR:Binder的唯一标识,一般用于当前Binder的类名标识
  • asInterface(android.os.IBinder obj):用于将服务端的Binder对象转换成客户端所需的AIDL接口类型的对象,如果客户端和服务端不在同意进程,那么这个方法返回的就是系统封装后的Stub.proxy对象,否则返回服务端的Stub对象本身。
  • asBinder:此方法用于返回当前Binder对象
  • onTransact:这个方法运行在服务端中的Binder线程池中,当客户端发起跨进程请求时,远程请求会通过系统底层封装后交由此方法来处理。
    这个方法的原型是public Boolean onTransact(int code, Parcelable data, Parcelable reply, int flags)
    服务端通过code可以知道客户端请求的目标方法,接着从data中取出所需的参数,然后执行目标方法,执行完毕之后,将结果写入到reply中。如果此方法返回false,说明客户端的请求失败,利用这个特性可以做权限验证(即验证是否有权限调用该服务)。
  • Proxy#[method]:代理类中的接口方法,这些方法运行在客户端,当客户端远程调用此方法时,它的内部实现是:首先创建该方法所需要的参数,然后把方法的参数信息写入到_data中,接着调用transact方法来发起RPC请求,同时当前线程挂起;然后服务端的onTransact方法会被调用,直到RPC过程返回后,当前线程继续执行,并从_reply中取出RPC过程的返回结果,最后返回_reply中的数据。
  • Binder的两个重要方法linkToDeath和unlinkToDeath
    Binder运行在服务端,如果服务端进程异常终止,客户端应该得到通知,这个时候我们可以通过这两个方法来得到通知以及做出相应的操作。首先声明一个DeathRecipient对象,这个对象是一个接口,内部只有一个binderDied方法,放Binder死亡的时候,系统会回调BinderDied方法
private IBinder.DeathPecipient mDeath = new IBinder.DeathPecipient(){@Overridepublic void binderDied(){if(mBookManager == null) return;mBookManager.asBinder().unlinkToDeath(mDeath, 0);mBookManager = null;//重新绑定远程Service
}
//客户端代码
mService = IMessageBoxManager.Stub.asInterface(binder);
binder.linkToDeath(mDeath, 0);

这样当Binder死亡的时候我们就可以收到通知了。

Android开发艺术探索--第二章IPC机制(2)之Binder相关推荐

  1. 《Android 开发艺术探索》笔记2--IPC机制

    <Android 开发艺术探索>笔记2--IPC机制 思维导图 Android IPC简介 Android中的多进程的模式 IPC基础概念 Serializable接口 Parcelabl ...

  2. Android开发艺术探索——第九章:四大组件的工作过程(下)

    我們继续来看四大组件的工作过程 一.BroadcastReceiver的工作过程 广播的工作过程,我们主要看两个方面,一个是注册过程,另一个就是接收的过程,我们想使用广播是非常简单的,只需要继承Bro ...

  3. Android开发艺术探索完结篇——天道酬勤

    这片文章发布,代表着我已经把本书和看完并且笔记也发布完成了,回忆了一下我看Android群英传,只用了两个月,但是看本书却花了2016年05月04日 - 2018年07月16日,整整两年多,真是惭愧 ...

  4. 《Android开发艺术探索》完结篇

    笔记链接: <Android开发艺术探索>之Activity的生命周期和启动模式(一) <Android开发艺术探索>之IPC机制上(二) <Android开发艺术探索& ...

  5. 《Android开发艺术探索》

    序 昨晚准备参考一下 <Android 开发艺术探索>这本书写一个博客 ,但是在家里找了好长时间也找不见 .所以就找了网上的文章 .这本书强烈推荐大家好好读几遍 . <Android ...

  6. 《android开发艺术探索》读书笔记(二)--IPC机制

    接上篇<android开发艺术探索>读书笔记(一) No1: 在android中使用多进程只有一种方法,那就是给四大组件在AndroidMenifest中指定android:process ...

  7. Android开发艺术探索——第七章:Android动画深入分析

    Android开发艺术探索--第七章:Android动画深入分析 Android的动画可以分成三种,view动画,帧动画,还有属性动画,其实帧动画也是属于view动画的一种,,只不过他和传统的平移之类 ...

  8. Android 开发艺术探索——第十章 Android的消息机制

    Android 开发艺术探索--第十章 Android的消息机制读书笔记 Handler并不是专门用于更新UI的,只是常被用来更新UI 概述 Android的消息机制主要值得就是Handler的运行机 ...

  9. Android开发艺术探索读书笔记(一)

    首先向各位严重推荐主席这本书<Android开发艺术探索>. 再感谢主席邀请写这篇读书笔记 + 书评.书已经完整的翻完一遍了,但是还没有细致的品读并run代码,最近有时间正好系统的把整本书 ...

最新文章

  1. 太牛逼了!项目中用了Disruptor之后,性能提升了2.5倍
  2. 《Pro/ENGINEER野火版5.0从入门到精通》——1.3 体验Pro/E野火版5.0
  3. 如何重置linux,linux如何重置服务器
  4. 表达式树 php,Linux_LINQ学习笔记:表达式树,构建查询表达式 本节中, 我们 - phpStudy...
  5. 第四周实践项目3单链表:逆置、连接与递增判断(包含三个程序)
  6. java中servletcontext_Java中的ServletContext对象
  7. linux退出大于符号,每天一个linux命令--退出符号
  8. 使用X.509数字证书加密解密实务(一)-- 证书的获得和管理
  9. Spark的输出提交控制器OutputCommitCoordinator
  10. 微课|《Python编程基础与案例集锦(中学版)》第3章(1)
  11. vSAN其实很简单-Quickstart是一件很炫的东西
  12. 吴恩达深度学习5.1练习_Sequence Models_Character level language model - Dinosaurus land
  13. Android wifi carlife,carlife可以无线连接吗?carlife蓝牙连接流程
  14. 扇贝编程python是干嘛的-扇贝新推出的python课程值得买吗?
  15. 计算机bios设置系统安装教程,U盘装系统BIOS设置教程进行设置图文教程
  16. 数字功放芯片品牌大全
  17. 如何打造成功的数据归档策略
  18. 一网打尽系列之史玉柱运营法则
  19. ERP的灵魂是管理思想
  20. 蚂蚁金服区块链朱永春:蚂蚁金服业务新思路,用以往通用场景结合出新的解决方案...

热门文章

  1. android 读取手机存储数据恢复,Android手机数据恢复
  2. 【Pygame小游戏】一发超人:弓箭手佛系射鸟休闲小游戏,你能射中几只?(源码白嫖)
  3. 计算机之父冯·诺依曼
  4. https://blog.csdn.net/wutianxu123/article/details/82597337
  5. Echarts-gl geo3D设置regions区域高度
  6. 带动画效果的下拉菜单
  7. FPGA进行多路并行插值滤波(多相滤波)的实现原理
  8. 百慕大三角新奇神秘事件
  9. echarts 设置仪表盘数字的位置_【Python代替Excel】11:用Python做数据仪表盘
  10. OpenGL ES glfw 下载和使用