IBinder的三个主要部分暂不分析底层如何实现 spring底层实现原理

1:定义服务类,如AudioFlinger.cppMediaPlayerService.cppCameraService.cppAudioPolicyService.cpp 实现的过程参考前面的某一篇博客,差不多就是定义一个IXXXX,然后定义两个BnXXX和BpXXX等等;
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

  

爱华网本文地址 » http://www.aihuau.com/a/25101012/131693.html

更多阅读

发外链要注意的三个误区 外链群发工具

发外链要注意的三个误区——西安SEO-小轩一、新站前期的外链发布错误新站特别容易被处罚,经常新站在未发外链时就被处罚了。前期是不适合发大量的锚文本外链呢?前期发大量的锚文本外链很容易被认为是作弊,导致不收录和关键词排名时

截图 《SchoolDays》·游戏中的三个主要结局一 school days结局视频

不要急着往下翻,先听我说……  之所以说是主要结局,我在网上查了一下,据说游戏多达20几种结局……我已知道的结局有12个,但是除了主要结局,几乎都是在游戏进行到中途时就FIN了,而这三个主要结局是要将游戏进行到最后才能达成的。  另

速写快速入门的三个诀窍 风景速写入门

很多学生在进入人物速写练习阶段,要么存有畏难情绪,不知道怎样下笔,担心画不好;要么不得其法,画了很久仍无清晰的思路,对错全靠“蒙”;要么舍本逐末,沉迷于无谓的细节,表现手法拘谨,画面人物形象呆板等等。针对此类现象,笔者结合平时的教学经验

校园安全预案的三个误区 小学校园安全应急预案

校园安全应急预案的三个误区-----安全教育必须天天讲平安成长比成功更重要。子规夜半独泣血,不信东风换不回!王大伟就加强学校安全提出三点建议。首先,要加强学校安全预案。学校的安全预案大都印刷精美,但存在很大误区,很多都是事后

声明:《IBinder的三个主要部分暂不分析底层如何实现 spring底层实现原理》为网友一生酷到底分享!如侵犯到您的合法权益请联系我们删除