这3个类,是对Android Binder框架的抽象,其实这个BBinder,改成BnBinder可能更形象一些。
但是要注意的是,一个IXXXService的继承图中,BpBinder并不在这个继承关系之中,也就是说BpBinder并没有子类。但是BBinder是在这个继承关系当中的,它的子类就是BnInterface。
换句话说,BBinder和BpBinder的功能并不是对称的,以前就是没有理解到这一点,才会一直很糊涂。

BpBinder的是存在于BpRefBase中的mRemote的成员变量中。从Client调用Service的过程中分析,就更清楚了。
假设有一个IXXXService接口:
class IXXXService : public IInterface {
    ....
    public void helloWorld(const char* str);
    ....
}
(1)client调用service
    client得到一个BpXXXService以后
    (a)会调用BpXXXService实现的helloWorld,它会将str参数打包到Parcel中。然后调用remote()->transact(xxx)
    (b)remote()是在BpXXXService的父类BpRefBase中实现的,返回的就是一个BpBinder.实际上调用的就是BpBinder的transact
    (c)BpBinder的transact实现,就是直接调用IPCThreadState::self()->transact()发送数据。
(2)service接收client请求:
    (a)通过IPCThreadState接收到client的请求后,首先会调用BBinder的transact方法。
    (b)BBinder的transact方法又会调用子类实现的虚拟方法onTransact。这个虚拟方法是在BnXXXService中实现的。
    (c)onTransact方法,会通过传递进来的参数来判断,需要调用IXXXService中的那个方法,示例中只有一个helloWorld方法。
    (d)直接调用helloWorld,就会找到它的真正实现,也就是BnXXXService的子类XXXService中的helloWorld方法。
总结一下,从上面的流程当中就可以看出前文说的,BpBinder并不在继承关系当中,它只是一个打包数据,并通过IPCThreadState::self()->transact()方法发送出去。
而BBinder和BnXXXService的作用,就是接收IPCThreadState传递过来的信息,解包数据,并调用XXXService真正的实现。

IPC的数据处理,Binder Driver和ServiceManager学习后会继续分析总结。

IBinder, BBinder和BpBinder相关推荐

  1. IBinder、BBinder和BpBinder

    注:这篇文章应该是根据某个博客记录下来的,但记不得链接了,请原作者见谅. IBinder.BBinder和BpBinder 这3个类,是对Android Binder框架的抽象,其实这个BBinder ...

  2. Android Binder机制(1501210451 张志康)

    本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...

  3. Android binder学习一:主要概念

    为什么80%的码农都做不了架构师?>>>    要看得懂android代码,首先要了解binder机制.binder机制也是android里面比较难以理解的一块,这里记录一下bind ...

  4. IBinder对象在进程间传递的形式(二)

    这篇文章是对IBinder对象在进程间传递的形式(一)这篇文章的补充,首先还是把service启动过程的流程图贴上来 Android中主要通过2种方法来获得service IBinder: 1.    ...

  5. Binder 驱动详解(下)

    前言 通过 Binder 上一篇文章的分析, 我们知道了 Binder 驱动在我们应用开发过程中的使用方式, 了解到了 BBinder 和 BpBinder 两个非常重要的 Native 对象, 本次 ...

  6. Android源码分析--MediaServer源码分析(二)

    在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...

  7. Binder源码分析之Native层(原)

    前面两节中介绍了Binder机制中的 ServiceManager 和 Binder驱动 ,在这一节中,我们来介绍Native中的Binder通讯. 为了更好的理解过程,我们挑选Native中的Med ...

  8. Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析

    原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...

  9. Android Binder基本概念流程学习

    一 Media Service进程启动 Init.rc中描述的service对应linux 的进程: Media进程定义: service media /system/bin/mediaserverc ...

最新文章

  1. 设计模式——6适配器模式(Adapter)
  2. android 画布旋转,Android-在安卓开发中,如何实现一个简单的图片旋转
  3. hadoop streaming部分问题总结
  4. Unity GeometryShader(从一个线框渲染的例子开始)
  5. 第六章至第九章的单元测试
  6. 故障码123401_P0221故障码故障原因和解决方法
  7. SSH Iptables访问控制
  8. python异步调用shell_Jenkins pipeline中优雅的执行shell/python/groovy脚本
  9. NF、$NF、FR、FNR举例说明
  10. HTML5程序开发范例宝典(韩旭著)读书笔记之渐变背景
  11. 什么是智能决策支持系统?
  12. 解决win7检测不到第二个显示器的方法
  13. xcode连接iphone调试_电脑操作手机?iPhone,安卓通吃?手机还能这么玩!
  14. 10张图看懂人口普查数据
  15. 工业照明节能减碳难?致远ZWS云平台有妙招
  16. html img标签alt属性吗,img标签可以不用alt属性吗
  17. 台式计算机如何上无线网络,台式机如何无线上网
  18. OpenCV——硬币检测与计数的设计实现
  19. 本轮大宗商品涨价:(背后原因分析)2021-09
  20. 从幂律分布到特征数据概率分布——12个常用概率分布

热门文章

  1. 《深入分析GCC 》——第3章 GCC总体结构3.1 GCC的目录结构
  2. win10 wifi连接上却显示无法连接internet
  3. 网易星球钻石随机排列且不重叠代码实现
  4. Ubuntu APT命令使用手册
  5. 基于标签的网络入侵问题
  6. gcc -O0 -g -O3对程序效率影响很大
  7. 国内慈善事业的现状及存在的问题
  8. background与background-color 你“不知道”的区别
  9. HTTPS协议详解:PKI体系
  10. matlab读取文件权限被拒绝,安装MATLAB拒绝访问问题的解决方法