IBinder, BBinder和BpBinder
这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相关推荐
- IBinder、BBinder和BpBinder
注:这篇文章应该是根据某个博客记录下来的,但记不得链接了,请原作者见谅. IBinder.BBinder和BpBinder 这3个类,是对Android Binder框架的抽象,其实这个BBinder ...
- Android Binder机制(1501210451 张志康)
本文主要分析native层和Java层的Android binder通信机制. binder是Android最为常见的进程通信机制之一,其驱动和通信库是binder的核心,分别由C和C++编写,应用程 ...
- Android binder学习一:主要概念
为什么80%的码农都做不了架构师?>>> 要看得懂android代码,首先要了解binder机制.binder机制也是android里面比较难以理解的一块,这里记录一下bind ...
- IBinder对象在进程间传递的形式(二)
这篇文章是对IBinder对象在进程间传递的形式(一)这篇文章的补充,首先还是把service启动过程的流程图贴上来 Android中主要通过2种方法来获得service IBinder: 1. ...
- Binder 驱动详解(下)
前言 通过 Binder 上一篇文章的分析, 我们知道了 Binder 驱动在我们应用开发过程中的使用方式, 了解到了 BBinder 和 BpBinder 两个非常重要的 Native 对象, 本次 ...
- Android源码分析--MediaServer源码分析(二)
在上一篇博客中Android源码分析–MediaServer源码分析(一),我们知道了ProcessState和defaultServiceManager,在分析源码的过程中,我们被Android的B ...
- Binder源码分析之Native层(原)
前面两节中介绍了Binder机制中的 ServiceManager 和 Binder驱动 ,在这一节中,我们来介绍Native中的Binder通讯. 为了更好的理解过程,我们挑选Native中的Med ...
- Android系统进程间通信(IPC)机制Binder中的Server启动过程源代码分析
原文地址: http://blog.csdn.net/luoshengyang/article/details/6629298 在前面一篇文章浅谈Android系统进程间通信(IPC)机制Binder ...
- Android Binder基本概念流程学习
一 Media Service进程启动 Init.rc中描述的service对应linux 的进程: Media进程定义: service media /system/bin/mediaserverc ...
最新文章
- 设计模式——6适配器模式(Adapter)
- android 画布旋转,Android-在安卓开发中,如何实现一个简单的图片旋转
- hadoop streaming部分问题总结
- Unity GeometryShader(从一个线框渲染的例子开始)
- 第六章至第九章的单元测试
- 故障码123401_P0221故障码故障原因和解决方法
- SSH Iptables访问控制
- python异步调用shell_Jenkins pipeline中优雅的执行shell/python/groovy脚本
- NF、$NF、FR、FNR举例说明
- HTML5程序开发范例宝典(韩旭著)读书笔记之渐变背景
- 什么是智能决策支持系统?
- 解决win7检测不到第二个显示器的方法
- xcode连接iphone调试_电脑操作手机?iPhone,安卓通吃?手机还能这么玩!
- 10张图看懂人口普查数据
- 工业照明节能减碳难?致远ZWS云平台有妙招
- html img标签alt属性吗,img标签可以不用alt属性吗
- 台式计算机如何上无线网络,台式机如何无线上网
- OpenCV——硬币检测与计数的设计实现
- 本轮大宗商品涨价:(背后原因分析)2021-09
- 从幂律分布到特征数据概率分布——12个常用概率分布