我用binder方式添加了一个服务。
defaultServiceManager()->addService(String16(servername), this);
可以处理客户端的请求,客户端是通过函数
onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
第二个参数Parcel&data向服务端传递参数的,服务端处理完请求后,通过第三个参数Parcel *reply向客户端返回数据。现在有一个问题,我的服务器有时候会自动检测到一些事件,比如从串口传递数据来,这个时候服务端应该主动向客户端上报,并将串口传过来的数据主动传给客户端,请问怎么实现?就是实现一个在客户端给服务器注册一个处理函数一样的功能,但是binder并不能这样,谁能给个思路?
好有参数代码就更好了我现在的想法是在客户端也开个服务,然后在服务端在开个客户,这样当串口有数据来时,主动传递给上层,不知道这样可行?
但是在客户端添加服务后好像不能够再删除这个服务。。?感觉这种方法不对头?有经验的高手指点一二?
defaultServiceManager()->addService(String16(servername), this);
可以处理客户端的请求,客户端是通过函数
onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
第二个参数Parcel&data向服务端传递参数的,服务端处理完请求后,通过第三个参数Parcel *reply向客户端返回数据。现在有一个问题,我的服务器有时候会自动检测到一些事件,比如从串口传递数据来,这个时候服务端应该主动向客户端上报,并将串口传过来的数据主动传给客户端,请问怎么实现?就是实现一个在客户端给服务器注册一个处理函数一样的功能,但是binder并不能这样,谁能给个思路?
好有参数代码就更好了我现在的想法是在客户端也开个服务,然后在服务端在开个客户,这样当串口有数据来时,主动传递给上层,不知道这样可行?
但是在客户端添加服务后好像不能够再删除这个服务。。?感觉这种方法不对头?有经验的高手指点一二?
你的想法是可以实现的,不过应该不叫在客户端开个服务,只是多一个IBinder接口,在原服务的客户端实现BnInterface,将此IBinder传递给服务端。
具体实现可参考MediaPlayerService,其中,IMediaPlayerClient接口即充当了这个角色,在IMediaPlayerClient里增加notify方法用来在MediaPlayerService的服务端调用
MediaPlayer是一个Native,但它创建了MediaPlayerService,拥有的是
BpMediaPlayerService指针,创建时,把自己的BpMediaPlayerClient
通过binder传递给了BnMediaPlayerService,BpMediaPlayerService就是通过
这个代理发送消息给MediaPlayer
顺便还想请教下,在MediaPlayer这一端,也会开启一个线程池来监听MediaPlayerService发来的请求吗?也会存在一个闭合的循环结构吗?如果有的话在哪里?分析代码时这里没有找到。请指点一下