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

Android深入浅出之Binder机制

 2012-06-30 10:47:32 来源:WEB开发网   
核心提示:si->name[len] = '\0';si->death.func = svcinfo_death;si->death.ptr = si;si->next = svclist;svclist = si; //看见没,这个svclist是一个列表,Android深入浅出之Bin
si->name[len] = '\0';
si->death.func = svcinfo_death;
si->death.ptr = si;
si->next = svclist;
svclist = si; //看见没,这个svclist是一个列表,保存了当前注册到ServiceManager
中的信息
}
binder_acquire(bs, ptr);//这个吗。当这个Service退出后,我希望系统通知我一下,好释放上面malloc出来的资源。大概就是干这个事情的。
binder_link_to_death(bs, ptr,&si->death);
return 0;
}
喔,对于addService来说,看来ServiceManager把信息加入到自己维护的一个服务列表中了。
2.9 ServiceManager存在的意义
为何需要一个这样的东西呢?
原来,Android系统中Service信息都是先add到ServiceManager中,由ServiceManager来集中管理,这样就可以查询当前系统有哪些服务。而且,Android系统中某个服务例如MediaPlayerService的客户端想要和MediaPlayerService通讯的话,必须先向ServiceManager查询MediaPlayerService的信息,然后通过ServiceManager返回的东西再来和MediaPlayerService交互。
毕竟,要是MediaPlayerService身体不好,老是挂掉的话,客户的代码就麻烦了,就不知道后续新生的MediaPlayerService的信息了,所以只能这样:
l MediaPlayerService向SM注册
l MediaPlayerClient查询当前注册在SM中的MediaPlayerService的信息
l 根据这个信息,MediaPlayerClient和MediaPlayerService交互
另外,ServiceManager的handle标示是0,所以只要往handle是0的服务发送消息了,最终都会被传递到ServiceManager中去。
三 MediaService的运行
上一节的知识,我们知道了:
l defaultServiceManager得到了BpServiceManager,然后MediaPlayerService 实例化后,调用BpServiceManager的addService函数
l 这个过程中,是service_manager收到addService的请求,然后把对应信息放到自己保存的一个服务list中
到这儿,我们可看到,service_manager有一个binder_looper函数,专门等着从binder中接收请求。虽然service_manager没有从BnServiceManager中派生,但是它肯定完成了BnServiceManager的功能。
同样,我们创建了MediaPlayerService即BnMediaPlayerService,那它也应该:
l 打开binder设备
l 也搞一个looper循环,然后坐等请求
service,service,这个和网络编程中的监听socket的工作很像嘛!
好吧,既然MediaPlayerService的构造函数没有看到显示的打开binder设备,那么我们看看它的父类即BnXXX又到底干了些什么呢?
3.1 MediaPlayerService打开binder
classMediaPlayerService : public BnMediaPlayerService
//MediaPlayerService从BnMediaPlayerService派生
//而BnMediaPlayerService从BnInterface和IMediaPlayerService同时派生
classBnMediaPlayerService: public BnInterface<IMediaPlayerService>
{
public:
virtual status_t onTransact( uint32_t code,
constParcel& data,
Parcel*reply,
uint32_t flags= 0);
};
看起来,BnInterface似乎更加和打开设备相关啊。
template<typenameINTERFACE>
class BnInterface :public INTERFACE, public BBinder
{
public:
virtual sp<IInterface> queryLocalInterface(const String16&_descriptor);

上一页  6 7 8 9 10 11 12 13 14 15  下一页

Tags:Android 深入浅出 Binder

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