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