美文网首页Android最最简单系列安卓应用技术开发
【Android最最简单】AIDL进阶(双向通信)

【Android最最简单】AIDL进阶(双向通信)

作者: 修鍋的江左喵郎 | 来源:发表于2018-12-31 02:06 被阅读55次

            在上一篇文章【Android最最简单】AIDL入门中,已经向大家介绍了AIDL的基础用法,基本上AIDL常用的方式大家也就都了解了,但是,这种方式存在一种弊端或者说一种不那么人性化的地方,就是只能由客户端主动向服务端发起请求,然后由服务端处理之后向客户端返回相应的数据。日常使用,这种方式基本可以满足需求,但是有这么一种场景,这种方式就不能满足大家了。

    举个例子

            服务端需要主动向客户端发送数据,而不是由客户端主动向服务端发起请求获取数据(大家可以想象一下手机上的推送),这种情况下,我们就需要使用到AIDL的进阶用法了,即一种观察者模式。

            按照惯例,先上图,github地址在文末:

    效果图

            如果对AIDL基本语法还有不懂的地方,请移步AIDL入门篇,接下来我们开始实现上图中的效果。

    一、服务端的实现

        1.创建回调的AIDL文件:

    回调的AIDL文件

           2.在IRemoteService.aidl文件中实现接口的注册和反注册方法(记得要import哦,即使在相同目录结构下也是要的):

    IRemoteService

        3.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对象注册到服务端。如下:

    ServiceConnection修改

            具体的改变到这里就成功了,就能够实现开篇gif的效果了,当你向服务端注册一个回调的时候,服务端就可以在有需要的时候主动调用回调返回数据给客户端了。

            完整代码请戳:github地址

    相关文章

      网友评论

        本文标题:【Android最最简单】AIDL进阶(双向通信)

        本文链接:https://www.haomeiwen.com/subject/hjvokqtx.html