我用binder方式添加了一个服务。
defaultServiceManager()->addService(String16(servername), this);
可以处理客户端的请求,客户端是通过函数
onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
第二个参数Parcel&data向服务端传递参数的,服务端处理完请求后,通过第三个参数Parcel *reply向客户端返回数据。现在有一个问题,我的服务器有时候会自动检测到一些事件,比如从串口传递数据来,这个时候服务端应该主动向客户端上报,并将串口传过来的数据主动传给客户端,请问怎么实现?就是实现一个在客户端给服务器注册一个处理函数一样的功能,但是binder并不能这样,谁能给个思路?
好有参数代码就更好了我现在的想法是在客户端也开个服务,然后在服务端在开个客户,这样当串口有数据来时,主动传递给上层,不知道这样可行?
但是在客户端添加服务后好像不能够再删除这个服务。。?感觉这种方法不对头?有经验的高手指点一二?

解决方案 »

  1.   

    客户端(也就是代理了)是调用transact的吧。
    你的想法是可以实现的,不过应该不叫在客户端开个服务,只是多一个IBinder接口,在原服务的客户端实现BnInterface,将此IBinder传递给服务端。
    具体实现可参考MediaPlayerService,其中,IMediaPlayerClient接口即充当了这个角色,在IMediaPlayerClient里增加notify方法用来在MediaPlayerService的服务端调用
      

  2.   

    客户端也可以拥有服务端对象,MediaPlayerService就是一个很好的例子
    MediaPlayer是一个Native,但它创建了MediaPlayerService,拥有的是
    BpMediaPlayerService指针,创建时,把自己的BpMediaPlayerClient
    通过binder传递给了BnMediaPlayerService,BpMediaPlayerService就是通过
    这个代理发送消息给MediaPlayer
      

  3.   

    楼上可能和我的叫法习惯不太一样,我习惯把注册到ServiceManager的Binder实现叫做服务,如果没有注册,有人用了个匿名Binder的词,可能更加合适。
    顺便还想请教下,在MediaPlayer这一端,也会开启一个线程池来监听MediaPlayerService发来的请求吗?也会存在一个闭合的循环结构吗?如果有的话在哪里?分析代码时这里没有找到。请指点一下
      

  4.   

    我的想法我验证了一下,是可以了,即在客户端添加一个服务,用来接收从下面主动传上来的消息,这样是可以实现的,测试也通过了。我也比较好奇3楼的说法,即“把自己的BpMediaPlayerClient通过binder传递给了BnMediaPlayerService,BpMediaPlayerService就是通过这个代理发送消息给MediaPlayer”,目前正在学习这种方法。