IBinder的三个主要部分(暂不分析底层如何实现)
来源:互联网 发布:手机本地端口1080 编辑:程序博客网 时间:2024/06/05 00:19
1:定义服务类,如 实现的过程参考前面的某一篇博客,差不多就是定义一个IXXXX,然后定义两个BnXXX和BpXXX等等;
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(); defaultServiceManager()->addService( String16("media.player"), new MediaPlayerService());
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(); }
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); }
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);
AudioFlinger.cpp
MediaPlayerService.cpp
CameraService.cpp
AudioPolicyService.cpp
2:在开机流程中,将这些服务注册到servicemanager中去,这个servicemanager有什么用涉及到IBinder的实现机制,暂不管,只要知道它是一个管理IBinder服务的地方,上面三个服务的注册在开机流程mediaserver这个最重要的继承创建后(Main_MediaServer.cpp)
int main(int argc, char** argv)
{
}
具体每个服务类的instantiate(),大致一致,MediaPlayerService.cpp为例
void MediaPlayerService::instantiate() {
}
其他几个只要换个名字就可以了:media.audio_flinger,media.audio_policy,media.camera
3:最后就是客户端需要使用这些服务的时候需要做的事情了:从servicemanager中取出相应的服务类的代理
代码基本一致,和上面一样只要换个名字就可以了
if (gAudioPolicyService.get() == 0) {
if (gAudioFlinger.get() == 0) {
if (sMediaPlayerService.get() == 0) {
0 0
- IBinder的三个主要部分(暂不分析底层如何实现)
- 第三部分 MediaPlayer的主要实现分析
- 聊天室的功能实现(主要部分)
- java集合的底层如何实现的,源码分析(未完成)
- 分析IBinder体系中getService的流程
- 分析IBinder体系中getService的流程
- 分析IBinder体系中getService的流程
- Messenger,Handler,IBinder是如何合作实现跨进程通信的
- JavaScript实现的三个构成部分
- libpcap底层实现变化的分析
- libpcap底层实现变化的分析
- libpcap底层实现变化的分析
- 深入分析HashMap的底层实现
- 《Android发短信底层源码(android5.1)解析》---主要解析SMSDispatcher发短信部分源码
- JVM底层是如何实现synchronized的
- 如何实现IO的底层原理问题?
- Lua部分源代码分析(讨论lua的库是如何实现)
- 系统研究Java--容器(五)--部分容器的底层实现
- [程序员面试题精选100题]5.查找最小的k个元素
- mysql 权限表说明
- 使用ajax提交上传文件
- 黑马程序员—ios开发环境xcode介绍
- cocos2dx 3.x 相机机制
- IBinder的三个主要部分(暂不分析底层如何实现)
- hdu3681 Prison Break (dfs+二分+状态压缩)
- 函数fork与vfork的区别与联系详解
- js无法修改隐藏域value问题
- C/S架构和B/S架构的概念和区别
- Ajax局部页面刷新和history的坑
- KERNEL_DATA_INPAGE_ERROR 蓝屏错误
- Android 背景透明度设置
- CThread类