likes
comments
collection
share

AIDL的作用与调用过程

作者站长头像
站长
· 阅读数 3

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为异步调用,可以自行开一个线程或者使用线程池,然后在线程或者线程池中调用远程服务端的方法。