IBinder的三个主要部分暂不分析底层如何实现 spring底层实现原理
2:在开机流程中,将这些服务注册到servicemanager中去,这个servicemanager有什么用涉及到IBinder的实现机制,暂不管,只要知道它是一个管理IBinder服务的地方,上面三个服务的注册在开机流程mediaserver这个最重要的继承创建后(Main_MediaServer.cpp)int main(int argc, char** argv){ sp<ProcessState>proc(ProcessState::self()); sp<IServiceManager> sm =defaultServiceManager(); LOGI("ServiceManager:%p", sm.get()); AudioFlinger::instantiate(); MediaPlayerService::instantiate(); CameraService::instantiate(); AudioPolicyService::instantiate(); ProcessState::self()->startThreadPool(); IPCThreadState::self()->joinThreadPool();}具体每个服务类的instantiate(),大致一致,MediaPlayerService.cpp为例void MediaPlayerService::instantiate() { defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService());}其他几个只要换个名字就可以了:media.audio_flinger,media.audio_policy,media.camera
3:最后就是客户端需要使用这些服务的时候需要做的事情了:从servicemanager中取出相应的服务类的代理代码基本一致,和上面一样只要换个名字就可以了if (gAudioPolicyService.get() == 0) { sp<IServiceManager> sm =defaultServiceManager(); sp<IBinder>binder; do { binder =sm->getService(String16("media.audio_policy")); if (binder!= 0) break; LOGW("AudioPolicyService not published, waiting..."); usleep(500000); // 0.5 s } while(true); if (gAudioPolicyServiceClient == NULL) { gAudioPolicyServiceClient = new AudioPolicyServiceClient(); } binder->linkToDeath(gAudioPolicyServiceClient); gAudioPolicyService =interface_cast<IAudioPolicyService>(binder); gLock.unlock(); }
if (gAudioFlinger.get() == 0) { sp<IServiceManager> sm =defaultServiceManager(); sp<IBinder>binder; do { binder =sm->getService(String16("media.audio_flinger")); if (binder!= 0) break; LOGW("AudioFlinger not published, waiting..."); usleep(500000); // 0.5 s } while(true); if (gAudioFlingerClient == NULL) { gAudioFlingerClient = new AudioFlingerClient(); } else { if(gAudioErrorCallback) { gAudioErrorCallback(NO_ERROR); } } binder->linkToDeath(gAudioFlingerClient); gAudioFlinger =interface_cast<IAudioFlinger>(binder); gAudioFlinger->registerClient(gAudioFlingerClient); }
if (sMediaPlayerService.get() == 0) { sp<IServiceManager> sm =defaultServiceManager(); sp<IBinder>binder; do { binder =sm->getService(String16("media.player")); if (binder!= 0) { break; } LOGW("Media player service not published,waiting..."); usleep(500000); // 0.5 s } while(true);
if (sDeathNotifier == NULL) { sDeathNotifier = new DeathNotifier(); } binder->linkToDeath(sDeathNotifier); sMediaPlayerService =interface_cast<IMediaPlayerService>(binder);
后面该分析分析IBinder底层实现机制。over
更多阅读
哺乳期可以喝茶吗?哺乳期喝茶的三个坏处! 哺乳期可以喝绿茶么
哺乳期可以喝茶吗?哺乳期喝茶的三个坏处!——简介茶是个好东西,能养肝护胆、清毒排废、还能预防癌症。但是专家指出,喝茶也不是什么阶段的人都适宜喝的,特别对女性来讲,喝茶选择好时间是非常重要的,哺乳期对于女性及宝宝来说都是一个特殊的
发外链要注意的三个误区 外链群发工具
发外链要注意的三个误区——西安SEO-小轩一、新站前期的外链发布错误新站特别容易被处罚,经常新站在未发外链时就被处罚了。前期是不适合发大量的锚文本外链呢?前期发大量的锚文本外链很容易被认为是作弊,导致不收录和关键词排名时
截图 《SchoolDays》·游戏中的三个主要结局一 school days结局视频
不要急着往下翻,先听我说…… 之所以说是主要结局,我在网上查了一下,据说游戏多达20几种结局……我已知道的结局有12个,但是除了主要结局,几乎都是在游戏进行到中途时就FIN了,而这三个主要结局是要将游戏进行到最后才能达成的。 另
速写快速入门的三个诀窍 风景速写入门
很多学生在进入人物速写练习阶段,要么存有畏难情绪,不知道怎样下笔,担心画不好;要么不得其法,画了很久仍无清晰的思路,对错全靠“蒙”;要么舍本逐末,沉迷于无谓的细节,表现手法拘谨,画面人物形象呆板等等。针对此类现象,笔者结合平时的教学经验
校园安全预案的三个误区 小学校园安全应急预案
校园安全应急预案的三个误区-----安全教育必须天天讲平安成长比成功更重要。子规夜半独泣血,不信东风换不回!王大伟就加强学校安全提出三点建议。首先,要加强学校安全预案。学校的安全预案大都印刷精美,但存在很大误区,很多都是事后