美文网首页
AIDL的作用与调用过程

AIDL的作用与调用过程

作者: AndroidHint | 来源:发表于2018-05-19 20:14 被阅读0次

    1、AIDL的作用

    AIDL是Android Interface Definition Language,意思就是Android接口定义语言。首先它是一种语言,它被设计出来的目的就是为了实现进程间的通信
    通过使用AIDL,可以帮我们生成进程间通信时需要用到的类和接口方法。
    当然,我们也可以不借助AIDL,而是自己实现这些类和方法,但是借助AIDL会让这个过程变得简单方便。

    2、AIDL支持的参数类型

    上面提到的AIDL是一种语言,那么它肯定有属于自己的一套语法:
    首先是文件类型,AIDL文件的后缀为.aidl。
    其次是支持的数据类型,AIDL默认支持的一些数据类型,在使用这些数据类型时是不需要导包的(即不需要使用import ***),除了这些默认支持的数据类型外,使用其他类型则需要导包,即使目标文件与当前正在编写的 .aidl 文件在同一个包下。
    AIDL默认支持的数据类型是:

    • Java中8中基本数据类型 byte,short,int,long,float,double,boolean,char。
    • String类型。
    • CharSequence类型。
    • List类型,List中的元素必须是AIDL支持的数据类型,或者是其他AIDL生成的一个接口,或者是定义的parcelable对象。
    • Map类型,Map中的元素必须是AIDL支持的数据类型,或者是其他AIDL生成的一个接口,或者是定义的parcelable对象。

    AIDL文件主要分为两种类型,一种是定义parcelable对象的,例如:

    // Book.aidl,这里是引入了一个序列化对象 Book 供其他的AIDL文件使用,其中Book.aidl与Book.java的包名应该要是一致的。
    package com.example.runningh.mydemo.binder;
    import com.example.runningh.mydemo.binder.Book;
    
    //parcelable是小写
    parcelable Book;
    

    上面将Book对象定义成了parcelable对象,这样才能成为AIDL文件支持的对象。

    另一种是用来定义方法接口的,例如:

    // BookManager.aidl
    package com.example.runningh.mydemo.binder;
    //导入所需要使用的非默认支持数据类型的包
    import com.example.runningh.mydemo.binder.Book;
    
    interface BookManager {
    
        //注意返回值前是没有修饰符的
        List<Book> getBooks();
        Book getBook();
        int getBookCount();
    
        void setBookPrice(in Book book , int price)
        void setBookName(in Book book , String name)
        void addBook(in Book book)
    }
    

    3、AIDL的调用过程

    • 默认情况下AIDL的调用过程是同步还是异步的?
      由于AIDL是在一个进程里面发起并调用另外一个进程的方法或者数据,而进程间的通信主要是由transact发起的,Binder的API都是同步的,transact方法会等待服务端进程的onTransact方法返回后才进行返回。所以默认情况下,AIDL的调用过程就是同步的。因此,如果在主线程中调用远程服务端的耗时操作方法,则比较容易出现ANR。

    • 如何指定AIDL为异步调用?
      要指定AIDL为异步调用,可以自行开一个线程或者使用线程池,然后在线程或者线程池中调用远程服务端的方法。

    相关文章

      网友评论

          本文标题:AIDL的作用与调用过程

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