Binder中 Service与Binder之间的转换

本文探讨了Android Binder框架中的IInterface如何用于Service与Binder之间的转换。IInterface提供了IXXXXService与IBinder互相转换的功能,使得在IPC过程中,Service能够转换成IBinder进行注册和传递,而Client能将IBinder转换回IXXXXService进行调用。同时解释了IBinder、BBinder和BpBinder的角色和转换过程。
摘要由CSDN通过智能技术生成

这几天一直在看binder的结构,感叹这样天才的设计。
现在只研究到binder的native框架,在IPCThreadState以下,真正的driver和数据交换还需要进一步研究。在此记录一些目前的体会。

1.IInterface的作用
个人感觉,这个IInterface严格上讲,并不是Binder这个框架的一部分。

基类 IInterface为 server 端提供接口,它的子类声明了 service 能够实现的所有的方法。
它的作用是提供了一个common的方式,可以将IBinder与Service进行显示的转换。

因为在进行IPC时,实际的service IXXXService要转换成IBinder,才能传递给ServiceManager进行注册检索,或者传递给Client进行调用。
而且Client拿到ServiceManager回传的IBinder以后,又要转换回IXXXService进行功能调用,所以IInterface产生了,提供了IXXXService与IBinder互相转换的功能。

(1)IXXXService转换IBinder实现:
IXXXService继承自IInterface,所以IInterface中的asBinder()方法,会将自身,也就是IXXXService转换成一个IBinder对象。
sp<IBinder> IInterface::asBinder()
{
    return this ? onAsBinder() : NULL;
}
这个onAsBinder()是一个虚拟方法,实际上是有IInterface的两个子类BpInterface和BnInterface实现的。
BpInterface的实现:
inline IBinder* BpInterface<INTERFACE>::onAsBinder()
{
    return remote(); //调用它的父类BpRefBase的remote()方法,返回IBinder,其实就是一个BpBinder
}
BnInterface的实现:
IBinder* BnInterface<INTERFACE>::onAsBinder()
{
    return this; //就是返回自身,因为BnInterface就是从BBinder继承的,BBinder又是继承自IBinder
}

(2)IBinder转换IXXXService

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值