[Android]对ServiceManager的理解

通讯节点: /dev/binder

何时打开:一般在ProcessState::self()

何时用:透过BBinder, BpBinder

    管理者BpServiceManager , BnServiceManager

    它们会通过IPCThreadState::transact()等进行操作, handle在这里指定。结构binder_transaction_data 用来读写数据。 remote()->transact()就是BpBinder->transact(), 再到IPCThreadState::transact()

BpBinder不在继承关系里,只是打包数据。

Binder 通讯Thread何时起来:

某个service死掉,要如何知道:

ServiceManager的handle 是0

int main(int argc, char** argv)

{

sp<ProcessState> proc(ProcessState::self());

sp<IServiceManager> sm = defaultServiceManager();


MediaPlayerService::instantiate();

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

}

C++层自己写个process 来启动特定的service.

在Java层,写好service后,可以通过在SystemServer中启动一个thread来启动service

Framework service需要aidl文件,而native service(如media.player)则不需要。

sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);是对应IMPLEMENT_META_INTERFACE(MediaPlayerService, "android.media.IMediaPlayerService");里的asInterface(): 实现从IBinder 到BpMediaPlayerService(obj)的转换,一般的,如果obj为0 表示service manager本身的handle. 注意,该转换在local和remote的地方,是不同的。 如下示例:

void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService()); }

//获取ServiceManager的代理对象 sp<IServiceManager> sm = defaultServiceManager(); //通过ServiceManager获取media Service binder binder = sm->getService(String16("media.player")); //将binder封装 构造media Service代理对象 BpMediaPlayerService sMediaPlayerService = interface_cast<IMediaPlayerService>(binder);

参考: http://blog.youkuaiyun.com/luoshengyang/article/details/6621566

http://www.cnblogs.com/innost/archive/2011/01/09/1931456.html

http://www.cnblogs.com/bastard/archive/2012/11/13/2766611.html

http://blog.youkuaiyun.com/zbunix/article/details/8758631

转载于:https://my.oschina.net/u/996206/blog/162484

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值