美文网首页
android 跨进程的总结

android 跨进程的总结

作者: 蜗牛加油 | 来源:发表于2016-07-03 16:28 被阅读125次

    最近工作中在开发beacon的模块,里面涉及到beacon扫描的问题,然后就决定将beacon的扫描模块单独开发成一个SDK,单独放到一个进程里面,下面说一下开发中遇到的各种坑:

    1、AIDL的问题;

    2、RemoteCallbackList 对于activity的回调问题;

    下面一步步的进行说明:

    AIDL

    AIDL的设计主要是进行跨进程的通信,其底层的实现是使用binder机制,其机制后续再讲解;在使用aidl的时候需要注意几点:aidl文件、parcelable的参数、in out inout 关键字的含义、service绑定的时候serviceconnection的连接:下面一个个进行讲解;

    首先就是aidl文件定义的是一个接口,他的全称是Android Interface Definition Language,声明比较简单。需要关注的就是接口里面参数问题,参数类型必须是基本类型或者parcelable的复杂类型,list只是支持arraylist,map也是只支持hashmap,下面看一个例子:

    packagecom.mm.beacon;

    importcom.mm.beacon.IBeacon;

    // Declare any non-default types here with import statements

    interfaceIBeaconDetect {

    voidonBeaconDetect(inListlist);

    }

    还有一个地方就是引用外部的复杂对象,也还是需要顶一个aidl的文件进行应用如下:

    packagecom.mm.beacon;

    parcelable IBeacon;

    否则的话在引用的时候可能就会出现找不到相关的类;

    in、out:

    in:客户端的参数输入;

    解析:是把实参的值赋值给行参 那么对行参的修改,不会影响实参的值

    out:服务端的参数输入;

    解析:传递以后,行参和实参都是同一个对象,只是他们名字不同而已,对行参的修改将影响实参的值

    inout:这个可以叫输入输出参数,客户端可输入、服务端也可输入。客户端输入了参数到服务端后,服务端也可对该参数进行修改等,最后在客户端上得到的是服务端输出的参数。

    因此在使用基本类型进行参数传递的时候,都是使用 in;

    RemoteCallbackList

    使用RemoteCallbackList目的进行remote service的回调下面看一下具体的使用方法:

    首先就是需要声明一个回调的aidl,代码如下:

    IRemoteInterface.aidl

    interface IRemoteInterface {

    void registerCallback(IBeaconDetect cb);

    void unregisterCallback(IBeaconDetect cb);

    }

    下面看一下IBeaconDetect的声明:

    IRemoteInterface.aidl

    interface IBeaconDetect {

    void onBeaconDetect(in List list);

    void onRawDataDetect(in List list);

    }

    private final RemoteCallbackList mCallbacks = new RemoteCallbackList();

    private IRemoteInterface.Stub mLocalBinder = new IRemoteInterface.Stub() {

    @Override

    public void registerCallback(IBeaconDetect cb) throws RemoteException {

    mCallbacks.register(cb);

    }

    @Override

    public void unregisterCallback(IBeaconDetect cb) throws RemoteException {

    mCallbacks.unregister(cb);

    }

    };

    在onBinder的时候返回的就是那个mLocalBinder. 在serviceConnecttion的时候注册的代码如下:

    private IRemoteInterface.Stub mLocalBinder = new IRemoteInterface.Stub() {

    @Override

    public void registerCallback(IBeaconDetect cb) throws RemoteException {

    mCallbacks.register(cb);

    }

    @Override

    public void unregisterCallback(IBeaconDetect cb) throws RemoteException {

    mCallbacks.unregister(cb);

    }

    };

    private IBeaconDetect.Stub mCallback = new IBeaconDetect.Stub() {

    @Override

    public void onBeaconDetect(List beaconlist) throws RemoteException {

    Log.e("callback",beaconlist.size()+"");

    .......

    }

    @Override

    public void onRawDataDetect(List list){

    Log.e("onRawDataDetect",list.size()+"");

    }

    };

    上面就是使用RemoteCallbackList进行回调的过程。

    下章将会详细讲一个aidl的原理

    相关文章

      网友评论

          本文标题:android 跨进程的总结

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