美文网首页
AIDL解析

AIDL解析

作者: sanfen | 来源:发表于2019-08-06 19:56 被阅读0次

实现

  1. 创建aidl文件

在build之后会在build目录生成IMyAidlInterface的实现类

interface IMyAidlInterface {
    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    int add(int aInt, int bInt);
    int min(int aInt, int bInt);
}

  1. 创建Service,并实现IMyAidlInterface.Stub()接口
    IMyAidlInterface.Stub stub = new IMyAidlInterface.Stub() {
        @Override
        public int add(int aInt, int bInt) {
            return aInt + bInt;
        }

        @Override
        public int min(int aInt, int bInt) {
            return aInt < bInt ? aInt : bInt;
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        return stub;
    }
  1. 在Activity中bindService
  bindService(intent, conn, Context.BIND_AUTO_CREATE);
private ServiceConnection conn = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            iMyAidlInterface = IMyAidlInterface.Stub.asInterface(service);
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            iMyAidlInterface = null;
        }
    };

解析

服务端

transact [træn'zækt]

        @Override
        public boolean onTransact(int code, 
        android.os.Parcel data, 
        android.os.Parcel reply,
        int flags) throws android.os.RemoteException {
            ...
        }

可以看到onTransact有四个参数 code,data,replay,flags

  • code 是一个整形的唯一标识,用于区分执行哪个方法,客户端会传递此参数,告诉服务端执行哪个方法
  • data 客户端传递过来的参数
  • replay 服务器返回回去的值
  • flags 标明是否有返回值,0为有(双向),1为没有(单向)
data.enforceInterface(DESCRIPTOR);
与客户端的writeInterfaceToken对用,标识远程服务的名称

客户端

实际上调用了Proxy

       public static com.sanfen.aidl.IMyAidlInterface asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.sanfen.aidl.IMyAidlInterface))) {
                return ((com.sanfen.aidl.IMyAidlInterface) iin);
            }
            return new com.sanfen.aidl.IMyAidlInterface.Stub.Proxy(obj);
        }

最后通过transact方法传递给服务端的onTransact(),并在_reply中返回值

    mRemote.transact(Stub.TRANSACTION_add, _data, _reply, 0);
    ==>
    onTransact(int code, android.os.Parcel data, android.os.Parcel reply,int flags)

源码

相关文章

  • Android中的AIDL

    Android中的AIDL使用详解 AIDL使用解析 Android进阶之AIDL的使用详解

  • 收集_Binder机制

    为什么 Android 要采用 Binder 作为 IPC 机制?AIDL原理解析Android中AIDL的工作原...

  • AIDL解析

    实现 创建aidl文件 在build之后会在build目录生成IMyAidlInterface的实现类 创建Ser...

  • AIDL解析

    AIDL是Android中IPC方式中的一种。 AIDL的使用 创建aidl后缀的文件,服务端和客户端各保存一份,...

  • 2020-06-19 AIDL Android Studio 3

    在导入以前可以运行的程序 出现了 AIDL 解析时已到达文件结尾,错误。 找了半天原来是 AIDL 中有中文的注释...

  • Android Binder的使用

    1、AIDL文件的创建及解析Binder使用起来还是比较简单的,创建一个IBinderPool.aidl文件然后c...

  • AIDL使用解析

    之前面试的时候被问到这个问题,然而当时只有一个大致的印象,随GG,于是我就重新整理的一下。这里大力推荐《Andro...

  • Android AIDL 解析

    AIDL简介 AIDL(Android Interface Definition Language) 是Andro...

  • Android Studio 升级到3.5.1 报错:解析时已到

    问题:错误: 解析时已到达文件结尾 D:\projects\app\build\generated\aidl_so...

  • Android的Parcelable类的序列化

    Android进程间通信 以aidl为例来说明这个情况 先了解Parcelable类的解析情况 序列化 : 将对象...

网友评论

      本文标题:AIDL解析

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