我的安卓学习Android知识Android开发

AIDL的使用、传递复杂对象以及回调客户端

2016-09-03  本文已影响2993人  daking

前言

概述

定义AIDL服务

  1. 创建.aidl文件
  2. SDK生成对应.java文件和Stub内部类
  3. 通过Service子类将接口暴露给外界

1. 创建.aidl文件

2. SDK生成对应.java文件和Stub内部类

3. 通过Service子类将接口暴露给外界

调用AIDL服务

传递复杂对象

AIDL服务回调客户端

  1. 自定义回调接口.aidl。

    package com.daking.aidl;
    
    import com.daking.aidl.ResponseVO; // 自定义结构类,具体实现可参考上一节。
    
    interface ICallback {
        void onResult(in ResponseVO vo);
    }
    
  2. AIDL服务.aidl提供接口给客户端注册和注销此回调。

    package com.daking.aidl;
    
    import com.daking.aidl.RequestVO;
    import com.daking.aidl.ICallback;
    
    interface IRemoteService {
        void request(in RequestVO vo);
        void registerCallback(in ICallback cb);
        void unregisterCallback(in ICallback cb);
    }
    
  3. AIDL服务.java的具体实现。

    public class RemoteService extends Service {
        // ICallback列表
        private RemoteCallbackList<ICallback> icallbacks;
    
        @Override
        public IBinder onBind(Intent intent) {
            icallbacks = new RemoteCallback<ICallback>();
            return mBinder;
        }
        
        private final IRemoteService.Stub mBinder = new IRemoteService.Stub() {
            @Override
            public void request(in RequestVO vo) {
                sendResponse();
            }
            @Override
            public void registerCallback(in ICallback cb) {
                if(cb != null) {
                    icallbacks.register(cb);
                }
            }
            @Override
            public void unregisterCallback(in ICallback cb) {
                if(cb != null) {
                    icallbacks.unregister(cb);
                }
            }
        };
        
        private void sendResponse() {
            ResponseVO vo = new ResponseVO();
            
            // 以广播的方式进行客户端回调
            int len = icallbacks.beginBroadcast();
            for (int i = 0; i < len; i++) {
                try {
                    icallbacks.getBroadcastItem(i).onResult(vo);
                } catch (RemoteException e) {
                    e.printStackTrace();
                }
            }
            // 记得要关闭广播
            icallbacks.finishBroadcast();
        }
    }
    
  4. 客户端创建回调接口的实现对象,并注册到AIDL。

    protected ICallback callback = new ICallback.Stub() {
        @Override
        public void onResult(ResponseVO vo) {
            // AIDL回调客户端后的业务处理
        }
    };
    
    // mService为AIDL服务
    mService.registerCallback(callback);
    

我的博客

上一篇下一篇

猜你喜欢

热点阅读