AIDL

2021-07-08  本文已影响0人  ttyttytty

IPC进程间通信Inter-Process Communication

Binder
如何实现双向通信
在血压进程里面,向ResearchData进程申请kit数据权限,受API限制,实际是由主进程实现。                                                              
1.Client(血压)->Server(ResearchData):正常调用服务端接口,客户端初始化Callback.stub(),在回调.AIDL里面处理客户端自己的逻辑
2."Server(ResearchData)"->主进程:实际代码是主进程中实现
a)ResearchData定义回调AIDL和接口AIDL

    // IDataPermissionRequestCallback.aidl
    interface IDataPermissionRequestCallback {
        void onResult(in int resultCode );
    }

    // IWearDeviceManager.aidl
    interface IWearDeviceManager {
         //请求kit 授权
        void requestDataPermission(in List<DataPermission> permissionList, in IDataPermissionRequestCallback callback,in Cookie cookie);
     }

b)血压进程实现回调AIDL并调用ResearchData的功能接口:
    provider.requestDataPermission(PERMISSION_LIST, new IDataPermissionRequestCallback.Stub() {
        @Override
        public void onResult(int resultCode) throws RemoteException {
            LogUtils.d(TAG, " requestDataPermission: " + resultCode);
        }
    });
    
c)ResearchData:
    ResearchData实现对血压公开接口:
    public class authManagerImp extends IAuthManager.Stub implements AddHealthScopesCallback {
        private final RemoteCallbackList<IAddAuthScopesCallback> addAuthScopesCallbackList = new RemoteCallbackList<>();
        @Override
        public void requestDataPermission(List<com.huawei.study.data.permission.DataPermission> permissionList,
            IDataPermissionRequestCallback callback, Cookie cookie) throws RemoteException {
            addScopesInAUth(convertScope(permissionList));
        }
        
        public synchronized void addScopesInAUth(List<com.huawei.study.data.permission.DataPermission> scopes) {
            int number = addAuthScopesCallbackList.beginBroadcast();
            for (int i = 0; i < number; i++) {
                try {
                    IAddAuthScopesCallback addAuthScopesCallback = addAuthScopesCallbackList.getBroadcastItem(i);
                    addAuthScopesCallback.addScopes(scopes);  // 最终调用主进程注册进来的Callback,执行实际scope申请代码
                } catch (RemoteException ex) {
                    LogUtils.e(TAG, "failed to add health scope:" + scopes == null ? "" : scopes.toString());
                }
            }
            addAuthScopesCallbackList.finishBroadcast();
        }
        @Override
        public void registerAddScopesCallback(IAddAuthScopesCallback callback) throws RemoteException {
            addAuthScopesCallbackList.register(callback);
        }
    }
    
    ResearchData实现接受主进程回调:
    // IAddAuthScopesCallback.aidl
    interface IAddAuthScopesCallback {
        void addScopes(in List<DataPermission> scopes);
    }
    
    主进程中ResearchServiceManager:
        private final IAddAuthScopesCallback.Stub addAuthScopesCallback = new IAddAuthScopesCallback.Stub() {
        @Override
        public void addScopes(List<DataPermission> scopes) throws RemoteException {
            HuaweiIdAuthManager.addAuthScopes(ActivityManager.getInstance().currentActivity(), FAIL_GET_SCOPE, PermissionUtil.convertScope(scopes));
        }
    };
     authManagerImp.registerAddScopeCallback(addAuthScopesCallback);

上一篇 下一篇

猜你喜欢

热点阅读