企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
匿名Service就是没有注册的Service,这句话是什么意思? - 没有注册意味着这个Service没有在ServiceManager上注册。 - 它是一个Service又表示它确实是一个基于Binder通讯的C/S结构。 再看下面的代码,或许就会明白是什么意思了。 **IMediaPlayerService.cpp** ~~~ status_t BnMediaPlayerService::onTransact(uint32_tcode, const Parcel& data, Parcel* reply, uint32_t flags) { switch(code) { caseCREATE_URL: { CHECK_INTERFACE(IMediaPlayerService, data, reply); ... //player是一个IMediaPlayer类型的对象 sp<IMediaPlayer> player =create( pid, client, url, numHeaders > 0 ? &headers : NULL); //下面这句话也很重要 reply->writeStrongBinder(player->asBinder()); return NO_ERROR; }break; ~~~ 当MediaPlayerClient调用create函数时,MediaPlayerService会返回一个IMediaPlayer对象,此后,MediaPlayerClient即可直接使用这个IMediaPlayer来进行跨进程的函数调用了。 请看,这里确实也存在C/S的两端: - BpMediaPlayer,由MediaPlayerClient使用,它用来调用IMediaPlayer提供的业务服务 - BnMediaPlayer,由MediaPlayerService使用,用来处理来自Client端的业务请求。 上面明显是一个C/S结构,但在ServiceManager中,肯定没有IMediaPlayer的信息,那么BpMediaPlayer是如何得到BnMediaPlayer的handle值的呢? >[warning] **注意**:handle事关通信的目的端,因此它非常重要。 答案可能就在下面这句话中: ~~~ reply->writeStrongBinder(player->asBinder());//将Binder类型作为一种特殊数据类型处理 ~~~ 当这个reply写到Binder驱动中时,驱动可能会特殊处理这种IBinder类型的数据,例如为这个BBinder建立一个独一无二的handle,这其实相当于在Binder驱动中注册了一项服务。 通过这种方式,MS输出了大量的Service,例如IMediaPlayer和IMediaRecorder等。 >[info] **说明**:关于这个问题,也可以查看驱动的实现来验证这一想法。