IBinder的三个主要部分(暂不分析底层如何实现)

1:定义服务类,如
AudioFlinger.cpp 
MediaPlayerService.cpp
CameraService.cpp
AudioPolicyService.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 (gAudioPolicyServiceClien t == NULL) {
            gAudioPolicyServiceClien t = new AudioPolicyServiceClient ();
        }
        binder->linkToDeath(gAudioPolicyServiceClien t);
        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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值