详解android源码中IInterface.h
来源:互联网 发布:安卓软件源码 编辑:程序博客网 时间:2024/04/30 03:12
interface_cast是一个模版函数。用于将一个IBinder对象调用模版的成员函数asInterface。
template<typename INTERFACE>
inline sp<INTERFACE> interface_cast(const sp<IBinder>& obj)
{
return INTERFACE::asInterface(obj);
}
template<typename INTERFACE>
class BnInterface : public INTERFACE, public BBinder
{
public:
virtual sp<IInterface> queryLocalInterface(const String16& _descriptor);
virtual const String16& getInterfaceDescriptor() const;
protected:
virtual IBinder* onAsBinder();
};
template<typename INTERFACE>
class BpInterface : public INTERFACE, public BpRefBase
{
public:
BpInterface(const sp<IBinder>& remote);
protected:
virtual IBinder* onAsBinder();
};
BnInterface 和BpInterface 是2个模版类。对应的类名分别是BnInterface<INTERFACE> BpInterface<INTERFACE>.这里INTERFACE是I开头的类。
针对INTERFACE这个类定义了类成员descriptor,成员函数asInterface,以及getInterfaceDescriptor。
实际上是I开头的类。因为I开头的类都是抽象类,这里都是实现抽象类的对象可以调用的方法。
#define DECLARE_META_INTERFACE(INTERFACE) \
static const android::String16 descriptor; \
static android::sp<I##INTERFACE> asInterface( \
const android::sp<android::IBinder>& obj); \
virtual const android::String16& getInterfaceDescriptor() const; \
I##INTERFACE(); \
virtual ~I##INTERFACE(); \
#define IMPLEMENT_META_INTERFACE(INTERFACE, NAME) \
const android::String16 I##INTERFACE::descriptor(NAME); \
const android::String16& \
I##INTERFACE::getInterfaceDescriptor() const { \
return I##INTERFACE::descriptor; \
} \
android::sp<I##INTERFACE> I##INTERFACE::asInterface( \
const android::sp<android::IBinder>& obj) \
{ \
android::sp<I##INTERFACE> intr; \
if (obj != NULL) { \
intr = static_cast<I##INTERFACE*>( \
obj->queryLocalInterface( \
I##INTERFACE::descriptor).get()); \
if (intr == NULL) { \
intr = new Bp##INTERFACE(obj); \
} \
} \
return intr; \
} \
I##INTERFACE::I##INTERFACE() { } \
I##INTERFACE::~I##INTERFACE() { } \
#define CHECK_INTERFACE(interface, data, reply) \
if (!data.checkInterface(this)) { return PERMISSION_DENIED; } \
理解的不透彻,没写明白。
下面是关于模版类的函数定义。
template<typename INTERFACE>
inline sp<IInterface> BnInterface<INTERFACE>::queryLocalInterface(
const String16& _descriptor)
{
if (_descriptor == INTERFACE::descriptor) return this;
return NULL;
}
template<typename INTERFACE>
inline const String16& BnInterface<INTERFACE>::getInterfaceDescriptor() const
{
return INTERFACE::getInterfaceDescriptor();
}
template<typename INTERFACE>
IBinder* BnInterface<INTERFACE>::onAsBinder()
{
return this;
}
template<typename INTERFACE>
inline BpInterface<INTERFACE>::BpInterface(const sp<IBinder>& remote)
: BpRefBase(remote)
{
}
template<typename INTERFACE>
inline IBinder* BpInterface<INTERFACE>::onAsBinder()
{
return remote();
}
- 详解android源码中IInterface.h
- Android源码IInterface.IBinder,Parcelable的注释翻译
- lua.h源码详解
- Android中AsyncTask源码详解
- android/bitmap.h 详解
- android/bitmap.h 详解
- kobject.h源码详解(2.6.16)
- Android framework回顾(3)binder利用及IBinder BpRefbase IInterface INTERFACE 之间关系
- Android中launcherMode="singleTask"详解【android源码解析六】
- Android中launcherMode="singleTask"详解【android源码解析六】
- Android中Ringtone播放详解【安卓源码解析五】
- Android中Ringtone播放详解【安卓源码解析####】
- Android中Ringtone播放详解【安卓源码解析五】
- Android中Ringtone播放详解【安卓源码解析五】
- Android中源码Launcher主屏幕程序排列详解
- Android中Canvas绘图基础详解(附源码下载)
- Android中Canvas绘图基础详解(附源码下载)
- Android中Canvas绘图基础详解(附源码下载)
- 如何制作一个自动运行U盘
- 用HTML5实现音乐播放器和视频播放器
- 徐海蛟:matlab 程序在命令行直接运行
- 清理ubuntu /boot分区
- libevent源码深度剖析五
- 详解android源码中IInterface.h
- 用Aspose在Hadoop上处理Binary文件格式
- 8 款别具一格的 jQuery/HTML5 插件
- 2013搜狐移动互联战略
- 海外实习面试记
- 环境变量的配置
- Ubuntu 创建用户
- Steve Yegge:Google面试秘籍
- 9款开发者值得一试的jQuery全新应用