Binder是Android进程间通信的一种方式。要明白binder首先要对进程间通信有个概念。所谓进程间通信就是两个进程互相通信,通信需要有通信协议,不然通信双方都不明白对方意图,通信同样需要信息载体来传输信息,不然信息无法到达目的地。

  就好比我们和朋友之间写信,通信的规则就是:1.你要有对方的地址,这样邮局能够找到对方;2.需要信纸作为载体;3.朋友家需要有邮箱才能收到信件。在邮局送信的过程中有可能你的朋友已经搬家了,你又希望邮局遇到这种情况能给你通知,那么你就要用挂号信,这个时候邮局就会在查无此人的情况下会给你一个通知。人类之间的这种交流抽象在程序中就变成了进程之间的通信。在android中就提供binder这一套协议来完成了上面的这个功能。
  我们将上面的过程抽象到程序设计中,假设有这样的一个场景:
  进程A需要和进程B通信,A需要B完成一个功能c。那么A需要传递一个标记给B,明确自己想要B完成的功能,我们可以为这个标记编号。同时A申明:如果B不存在了希望收到通知。通信的第一步:B要让A能找到自己,于是B会向管理部门注册自己所拥有的功能模块。这里管理部门在binder中是ServiceManager,我们简称为SM。A通过向SM查询得到B的功能模块的地址,然后通过这个地址给B发送功能编号,这个编号信息通过binder驱动传递给B。B收到这个编号后调用相应的函数完成请求,然后返回结果给A。如果binder驱动在转发信息的时候发现B已经不存在了,就会通知A,你请求的对象已经死亡啦,A会收到B的死亡通知。B进程中提供功能的模块称为Service,A可以称为Client。Client请求SM得到的地址实际上是Service的一个代理proxy,这个代理类封装了发送请求的过程。所以我们只需要得到一个Service的代理就可以去调用Service的功能而不用去关心消息是如何的封装与传递的。这样一来,Client取得代理类之后,通过调用代理类的函数,最终这个函数的会发请求给Service,由Service来完成对应的功能。
  整理上面的过程:进程间的通信模型为Client/Service。一次通信的完成需要四个角色:Service(提供服务),Client(发送请求),ServiceManager(管理所有Service的部门),binder驱动(传递信息)。下面是一张简图:描述它们之间的关系


  在Android中,用什么来表示Service?Client取得的Service的代理又具体是什么呢?ServiceManager是个怎么实现的呢,为什么Client一定可以找到它的地址,然后给它发送查询服务的请求呢?带着这些疑问,我们来看一张类图。

在上面途中MediaPlayerService就是一个Service,途中也显示了它的继承关系。右边框中的BpMediaPlayerService是它的代理类。IMediaPlayerService是这两者的接口类,它定义了一些函数接口,表示MediaPlayerService所能提供的功能,在上面的例子中我们假设有一个功能是play()。在MediaPlayerService和BpMediaPlayerService都分别实现了这个虚函数,不过,BpMediaPlayerService中的play()只是将函数参数和参数所对应的编号打包,然后调用BpBinder的transact函数将这些信息透过binder驱动发送给MediaPlayerService,最终由MediaPlayerService去完成对应的功能。

BpBinder和BBinder这两个类都是和binder驱动通信相关的类,它们负责通信数据在应用层之间的传递,并不明白这些数据是什么含义,可以称他们为应用层的通信媒介。BpMediaPlayerService负责通信数据打包,BnMediaPlayerService负责通信数据的解析,MediaPlayerService负责完成通信请求的功能。BpInterface和BnInterface继承了通信媒介类和业务接口类,然后BpMediaPlayerService和BnMediaPlayerService分别继承这两个类,完美的将通信层和业务层结合到了一起,所以对于client来说,调用BpMediaPlayerService的函数play()就好像调用本地函数一样,因为BpMediaPlayerService封装了数据传输的过程。

讲到这里还有几个问题没有涉及:
1.client端如何取得BpMediaPlayerService?

2.BpMediaPlayerService将通信数据传递给binder驱动之后,binder驱动如何决定这些数据传递给哪一个Service来处理呢?

3.如果MediaPlayerService死掉了,BpMediaPlayerService如何收到通知呢?

这三个问题留待下一节。
  
 

转载于:https://blog.51cto.com/sailingthink/1177286

浅谈Android binder原理与设计 (1)相关推荐

  1. 浅谈麦克风指向性原理、设计及应用

    麦克风的指向性通常分为两大类:全指向式麦克风.单一指向式麦克风,有的划分为全指向.8字型指向和心型指向,不论怎么划分基本原理都是一样的,下面就单振膜来进行解析 从原理角度来解析 全指向式(Omnidi ...

  2. 浅谈Android系统进程间通信(IPC)机制Binder中的Server和Client获得Service Manager接口之路

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6627260 在前面一篇文章浅谈Service Manager成为Android进程间 ...

  3. 浅谈Android文件管理器的几种实现方式(原理篇)--对我有帮助

    转自 https://blog.csdn.net/weixin_33698823/article/details/87269955 浅谈Android文件管理器的几种实现方式 为了完成毕业设计,我花费 ...

  4. 高通android逆向分析,浅谈Android高通(Qualcomm)和联发科(MTK)平台

    一款CPU好不好是要从多个方面考虑的,并不是说简简单单看一个主频.几个核心数就完了,更重要的是它的综合实力到底有多强,这里面当然也会牵扯到价格问题,性能相似当然是便宜的获胜,这是毋庸置疑的. 事实上, ...

  5. 浅谈Android引用计数(2)

    在浅谈Android引用计数(1)中讲了LightRefBase实现对象计数管理的原理,这篇文章将要分析重量级的引用基类:RefBase的实现和它的作用. 下面是RefBase和相关类的类图: 图中可 ...

  6. android fps 垂直同步,浅谈Android流畅度

    原标题:浅谈Android流畅度 哈哈 讲个故事 白 1 流畅度 关于流畅度谷歌官方给出的解释为:running at a consistent 60 frames per second, witho ...

  7. 浅谈“三层结构”原理与用意(转帖)

    浅谈"三层结构"原理与用意 序 在刚刚步入"多层结构"Web应用程序开发的时候,我阅读过几篇关于"asp.net三层结构开发"的文章.但其多 ...

  8. 浅谈Android Architecture Components

    浅谈Android Architecture Components 浅谈Android Architecture Components 简介 Android Architecture Componen ...

  9. 浅谈实时数据库系统原理及其应用

    浅谈实时数据库系统原理及其应用 孙俊彦   苏州大学计算机科学与技术学院 摘要: 现代的工程和时间关键型应用对数据库的实时性和对数据直接分析和处理的能力要求特别高,单纯的传统关系数据库已经不能满足需要 ...

最新文章

  1. matlab 函数pdf怎么用_pdf加水印怎么加?这个实用pdf编辑工具可以用
  2. Work Queues(点对多)
  3. completable java_java8 CompletableFuture异步编程
  4. lombok链式调用_翻车!记一次使用 Lombok 造成的事故!
  5. c++ stl模糊查找【找到key对应的值,找不到时返回最接近key的两个值】
  6. 通过反射修改强转值类型_什么是反射机制?反射机制的应用场景有哪些?
  7. 网络编程在线英英词典之客户端代码框架搭建(一)
  8. Matlab中直方图的绘制histogram函数
  9. 新手织梦建站教程:设置网页文档默认点击数为0方法
  10. 计算机固态硬盘256g,1t(后悔买256g的固态硬盘了)
  11. 论剑乌镇-热点轮换谁能屹立不倒
  12. 物联网网关神器 Kong ( 四 )- 利用 Konga 来配置生产环境安全连接 Kong
  13. 直播推流拉流概念介绍
  14. RBD存储模式为RWX时kubernetes多次挂载该PV不报错
  15. 盖茨和李嘉诚双龙卸甲 他们的区块链业务一个在链圈扶贫 一个在币圈赚钱
  16. Python+OpenCV视频的读取与处理;截取部分图像数据; 边界填充
  17. 2023年华中科技大学土地资源管理考研上岸前辈备考经验
  18. [从头学数学] 第208节 带着计算机去高考(序)
  19. katana(武士刀)setuid提权
  20. pandas关键字提取_pandas处理数据textrank提取关键词

热门文章

  1. 文件不能自动求和_Excel求和公式函数的使用方法教程
  2. 事务四大特性及隔离级别
  3. jQuery常用方法
  4. 订餐系统项目中OrderForm、OrderDTO、OrderMaster和ResultVO的区别
  5. JDBC连接MySQL数据库:建立SSL连接出现警告信息
  6. 二叉树C++ | 实现删除节点_4
  7. vscodepython技巧_VScode Python no module的解决方法
  8. 【英语学习】【Daily English】U01 Greetings / L03 Have we met before?
  9. Intel Core Enhanced Core架构/微架构/流水线 (6) - 指令预译码/指令队列/指令译码
  10. mysql 傻瓜式管理_傻瓜式教学【数据库管理工具Navicat】