在上一篇文章【Android最最简单】AIDL入门中,已经向大家介绍了AIDL的基础用法,基本上AIDL常用的方式大家也就都了解了,但是,这种方式存在一种弊端或者说一种不那么人性化的地方,就是只能由客户端主动向服务端发起请求,然后由服务端处理之后向客户端返回相应的数据。日常使用,这种方式基本可以满足需求,但是有这么一种场景,这种方式就不能满足大家了。
举个例子服务端需要主动向客户端发送数据,而不是由客户端主动向服务端发起请求获取数据(大家可以想象一下手机上的推送),这种情况下,我们就需要使用到AIDL的进阶用法了,即一种观察者模式。
按照惯例,先上图,github地址在文末:
效果图如果对AIDL基本语法还有不懂的地方,请移步AIDL入门篇,接下来我们开始实现上图中的效果。
一、服务端的实现
1.创建回调的AIDL文件:
回调的AIDL文件2.在IRemoteService.aidl文件中实现接口的注册和反注册方法(记得要import哦,即使在相同目录结构下也是要的):
IRemoteService3.Build-Make module,然后修改RemoteService服务文件。我们使用RemoteCallbackList来存储注册的接口IRemoteCallback,如下:
RemoteCallbackList<IRemoteCallback> mCallbacks;
mCallbacks = new RemoteCallbackList<>();
// 注册
mCallbacks.register(callback);
// 反注册
mCallbacks.unregister(callback);
// 服务端发起推送
int len = mCallbacks.beginBroadcast();
for (int i = 0; i < len; i++) {
try {
mCallbacks.getBroadcastItem(i).onSuccess("push", "接口回调回来的数据" + System.currentTimeMillis());
} catch (RemoteException e) {
e.printStackTrace();
}
}
mCallbacks.finishBroadcast();
完整修改请查看RemoteService类。
二、客户端的实现
客户端的修改主要是在bindService中传递的ServiceConnection对象的实现,在回调的onServiceConnected方法中,调用register方法将回调IRemoteCallback对象注册到服务端。如下:
具体的改变到这里就成功了,就能够实现开篇gif的效果了,当你向服务端注册一个回调的时候,服务端就可以在有需要的时候主动调用回调返回数据给客户端了。
完整代码请戳:github地址
网友评论