很多人一提到Binder就说代理模式,人云亦云的多,能理解精髓的少。 本篇文章就从设计角度分析一下java层BInder的设计目标,以及设计思路,设计缺陷,从而驾驭它。

对于【邦德儿】的理解, 从通信的角度来看,就是一种通信方式而已,与socket没有任何区别。客户端transact,服务端onTransact.  但是,从【邦德儿】本身来说,如果客户端和服务端在一个进程,那么再通过底层驱动去把数据转过去就显得多余了。基于这种理论,设计的时候,如果客户端和服务端在一个进程就直接函数调用,而不再通过驱动。对于调用者来说,他只需要得到一个接口用来transact。并不愿意知道具体的通信细节。也就是说,不关心是否是通过【邦德儿】驱动来传输的,还是直接在同进程通过函数的调用传输的。调用者确实不愿意关心,调用者不愿意关心的,那么被调用者就得关心,不然代码谁来写。所以【邦德儿】本身必须要处理这两种情况:

1.在同一个进程。这个对应的是Binder。

2.不在同一个进程。这个对应的是BInderProxy。

对于调用者来说,这两个东西都实现了IBinder接口中的transact函数。BInderProxy通过底层驱动,把数据传输到服务端而BInder则直接通过内部调用转给onTransact处理。

附注:

在这里吐槽一下google。命名莫名其妙故弄玄虚。看到一个IBinder,脑子里除了邦德儿之外没有别的想法。我觉得,在设计上transact应该对应一个ISenderBinder,而onTransact对应一个IReceiverBinder。Binder实现了ISenderBinder和IReceiverBinder接口。这样的逻辑才够清晰。客户端只要看到ISenderBinder就倍感亲切,服务端只要看到IReceiverBinder就感觉自己在为别人做好事。一开始要做的事情就是打开通信通道,也就是把ISenderBinder这个东西对应的对象传给客户端。而服务端用谁进行服务都无所谓,只要是跟ISenderBinder是一对的就OK。BInderProxy应该叫做SenderBinder才合适。

那么对于应用程序来说,他需要什么?他需要函数调用,而不是transact这类东西。如果整天关心这些底层的打包解包那么也就很头大了。IActivityManager这个是用户需要的接口,之前的transact接口明显不合适让用户使用。把恶心的transact函数适配到IActivityManager。用户用起来更好用了。既然是适配,那么就有个接口转换。一个叫做asInterface,一个叫做asBInder。网上一讲这个东西就说是代理。这是其实是适配。asInterface将IBinder适配为IActivityManager。而asBInder将IActivityManager适配为IBinder。

google的代码里面,经常把这个能代表远程对象的东西叫做代理。仅此而已。只要能代表远程对象并执行函数。那么就叫做代理。具体怎么实现的,并不关心。在这里代理只是一种脱离实际代码的宏愿。

  • 大小: 33.1 KB
  • 查看图片附件

安卓高手之路之java层Binder相关推荐

  1. 安卓高手之路 图形系统(2)----------------基于Binder的架构思路)

    在学习安卓的时候最迷惑的就是Binder.图形框架的理解与Binder的理解分不开.前面一篇 [ 安卓高手之路之java层Binder 从代码角度分析了Java层Binder的实现原理.在C++层,这 ...

  2. 安卓高手之路 图形系统(4 Measure的算法)

    安卓高手之路 图形系统(4 Measure的算法) - 修补C++ - ITeye技术网站 Java代码   /** * Does the hard part of measureChildren:  ...

  3. 安卓高手之路之 ClassLoader

    我不喜欢那些泛泛而谈的去讲那些形而上学的道理,更不喜欢记那些既定的东西.靠记忆去弥补思考的人,容易陷入人云亦云的境地,最后必定被记忆所围困,而最终消亡的是创造力.希望这个高手之路系列能够记录我学习安卓 ...

  4. Java层Binder使用(ServiceManager)

    转自:http://blog.csdn.net/jacklam200/article/details/37567409 跟上篇Binder使用一样,先通过例子来跟踪Java层Binder机制.本文参考 ...

  5. native层 安卓_安卓逆向——拼xx协议java层分析

    制丨阿星 整理丨阿星 老铁们大家好,今天小编给大家带来很实用的技巧叫拼xx协议java层分析,有啥不足的地方望大家指点指点! 首先抓包  反编译 这个时间段我们方法剖析一下 找到onclick 看他的 ...

  6. 安卓高手之路之ClassLoader(四)

    显然,应用层的classLoader绝对不仅仅是一个systemclassloader那么简单.那么他一定是与PackageInfo连接起来的.而这个连接的纽带就是ContextImpl.Contex ...

  7. 安卓高手之路之 GDI图形引擎篇

    1.底层C++ SufaceFlinger类图的静态结构  2.上层Java的调用流程. 首先,直接从WindowManagerService入手: public int relayoutWindow ...

  8. [置顶] 安卓高手之路之ClassLoader(二)

    因为ClassLoader一定与虚拟机的启动有关系,那么必须从Zygote的启动开始看代码.下面就分析一下这些代码,行数不多: int main(int argc, const char* const ...

  9. [置顶] 安卓高手之路之 WindowManager

    安卓中的画面不是纯粹由window组成.而是改成了window+view的组织模式.window是一个顶层窗口的概念.view就相当于在window内的控件.而subwindow则是依附于window ...

最新文章

  1. Chromosome-scale assemblies of plant genomes using nanopore long reads and optical maps
  2. 为什么L1稀疏,L2平滑?
  3. 《java练习题》习题集二
  4. docker 安装nginx_docker安装nginx搭建简单文件共享服务
  5. linux驱动开发音频设备驱动,linux驱动开发—基于Device tree机制的驱动编写
  6. oracle 11g b表空间什么情况下自动增加,Oracle 11g表空间——创建和扩展(永久)表空间...
  7. 【渝粤教育】国家开放大学2018年秋季 2508T学前儿童语言教育 参考试题
  8. Ubuntu Vi 编辑器 命令(转)
  9. 话里话外:企业ERP实施的前前后后(二)
  10. cv2.error: opencv(4.4.0)_【OpenCV 4开发详解】图像连通域分析
  11. Hilbert变换器
  12. numpy tolist()的用法
  13. 如何查看steam游戏销量_如何查看您在Steam游戏上花费的金钱和时间
  14. servlet.ServletException: java.lang.NoClassDefFoundError: cn/huiyuan/lwj/vo
  15. 分享一些光纤模块接口类型有用信息给大家
  16. python爬新闻并保存到csv_python爬取信息并保存至csv
  17. div怎么在css中设置字体大小,根据div大小调整字体大小
  18. H264码流中SPS的获取
  19. 麦克劳林公式怎么记忆_怎么背麦克劳林公式?
  20. Spring控制Bean加载顺序

热门文章

  1. 包画三维散点图怎么导出_不开玩笑,发现宝藏了,一键导出场地三维模型,连贴图都有!...
  2. java转账_JAVA实现账户转账问题
  3. 大物实验总结模板_高考化学实验题答题模板归类总结!
  4. html盒子阴影的语法,css3 盒阴影box-shadow
  5. python开发环境和运行环境的区别_Django 开发环境与生产环境的区分详解
  6. matlab绘制多条折线图
  7. 配置网口相机(大恒水星相机)
  8. python redis处理高并发-Python高并发解决方案实现过程详解
  9. I/O异步之I/O完成端口
  10. linux基础(day19)