WEB开发网
开发学院手机开发Android 开发 Android深入浅出之Binder机制 阅读

Android深入浅出之Binder机制

 2012-06-30 10:47:32 来源:WEB开发网   
核心提示:return intr; } BpServiceManager是个什么玩意儿?p是什么个意思?2.5 BpServiceManager终于可以讲解点架构上的东
return intr;
}
BpServiceManager是个什么玩意儿?p是什么个意思?
2.5 BpServiceManager
终于可以讲解点架构上的东西了。p是proxy即代理的意思,Bp就是BinderProxy,BpServiceManager,就是SM的Binder代理。既然是代理,那肯定希望对用户是透明的,那就是说头文件里边不会有这个Bp的定义。是吗?
果然,BpServiceManager就在刚才的IServiceManager.cpp中定义。
classBpServiceManager : public BpInterface<IServiceManager>
//这种继承方式,表示同时继承BpInterface和IServiceManager,这样IServiceManger的
addService必然在这个类中实现
{
public:
//注意构造函数参数的命名 impl,难道这里使用了Bridge模式?真正完成操作的是impl对象?
//这里传入的impl就是newBpBinder(0)
BpServiceManager(constsp<IBinder>& impl)
:BpInterface<IServiceManager>(impl)
{
}
virtual status_t addService(constString16& name, const sp<IBinder>& service)
{
待会再说..
}
基类BpInterface的构造函数(经过兑现后)
//这里的参数又叫remote,唉,真是害人不浅啊。
inlineBpInterface< IServiceManager >::BpInterface(const sp<IBinder>&remote)
: BpRefBase(remote)
{
}
BpRefBase::BpRefBase(constsp<IBinder>& o)
: mRemote(o.get()), mRefs(NULL), mState(0)
//o.get(),这个是sp类的获取实际数据指针的一个方法,你只要知道
//它返回的是sp<xxxx>中xxx* 指针就行
{
//mRemote就是刚才的BpBinder(0)
...
}
好了,到这里,我们知道了:
sp<IServiceManager> sm =defaultServiceManager(); 返回的实际是BpServiceManager,它的remote对象是BpBinder,传入的那个handle参数是0。
现在重新回到MediaService。
int main(int argc,char** argv)
{
sp<ProcessState>proc(ProcessState::self());
sp<IServiceManager>sm = defaultServiceManager();
//上面的讲解已经完了
MediaPlayerService::instantiate();//实例化MediaPlayerservice
//看来这里有名堂!

ProcessState::self()->startThreadPool();
IPCThreadState::self()->joinThreadPool();
}
到这里,我们把binder设备打开了,得到一个BpServiceManager对象,这表明我们可以和SM打交道了,但是好像没干什么有意义的事情吧?
2.6 MediaPlayerService
那下面我们看看后续又干了什么?以MediaPlayerService为例。
它位于framework\base\media\libmediaplayerservice\libMediaPlayerService.cpp
voidMediaPlayerService::instantiate() {
defaultServiceManager()->addService(
//传进去服务的名字,传进去new出来的对象
String16("media.player"),new MediaPlayerService());
}
MediaPlayerService::MediaPlayerService()
{
LOGV("MediaPlayerServicecreated");//太简单了
mNextConnId = 1;
}
defaultServiceManager返回的是刚才创建的BpServiceManager
调用它的addService函数。
MediaPlayerService从BnMediaPlayerService派生
classMediaPlayerService : public BnMediaPlayerService
FT,MediaPlayerService从BnMediaPlayerService派生,BnXXX,BpXXX,快晕了。
Bn 是Binder Native的含义,是和Bp相对的,Bp的p是proxy代理的意思,那么另一端一定有一个和代理打交道的东西,这个就是Bn。

上一页  2 3 4 5 6 7 8 9 10 11 12  下一页

Tags:Android 深入浅出 Binder

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接