AIDL详解
1、简介:
AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写。
其主要作用是用于进程间的通讯。
在Android系统中,每个进程都运行在一块独立的内存中,在其中完成自己的各项活动,与其他进程都分隔开来。可是有时候我们又有应用间进行互动的需求,比较传递数据或者任务委托等,AIDL就是为了满足这种需求而诞生的。通过AIDL,可以在一个进程中获取另一个进程的数据和调用其暴露出来的方法,从而满足进程间通信的需求。
2、特性:
-
支持的数据类型: 八种基本数据类型:byte、char、short、int、long、float、double、boolean String,CharSequence 实现了Parcelable接口的数据类型 List 类型。List承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象 Map类型。Map承载的数据必须是AIDL支持的类型,或者是其它声明的AIDL对象
-
AIDL文件可以分为两类。一类用来声明实现了Parcelable接口的数据类型,以供其他AIDL文件使用那些非默认支持的数据类型。还有一类是用来定义接口方法,声明要暴露哪些接口给客户端调用,定向Tag就是用来标注这些方法的参数值。
-
定向Tag。定向Tag表示在跨进程通信中数据的流向,用于标注方法的参数值,分为 in、out、inout 三种。其中 in 表示数据只能由客户端流向服务端, out 表示数据只能由服务端流向客户端,而 inout 则表示数据可在服务端与客户端之间双向流通。此外,如果AIDL方法接口的参数值类型是:基本数据类型、String、CharSequence或者其他AIDL文件定义的方法接口,那么这些参数值的定向 Tag 默认是且只能是 in,所以除了这些类型外,其他参数值都需要明确标注使用哪种定向Tag。
-
明确导包。在AIDL文件中需要明确标明引用到的数据类型所在的包名,即使两个文件处在同个包名下。
3、实例:
服务端:
完整服务端在 '.'(main)目录下的文件结构:
.
├── aidl
│ └── com
│ └── example
│ └── myaidl
│ ├── Book.aidl
│ └── BookController.aidl
├── AndroidManifest.xml
├── java
│ └── com
│ └── example
│ └── myaidl
│ ├── AIDLService.java
│ ├── Book.java
│ └── MainActivity.java
右键之后的New选项中有一个AIDL,选中创建Book.aidl,会出现如下目录文件:
.
├── aidl
│ └── com
│ └── example
│ └── myaidl
│ ├── Book.aidl
Book.aidl
package com.example.myaidl;
parcelable Book;
下来定义Book类,注意Book类的包名必须与Book.aidl包名一样,但是不可与Book.aidl在同一个目录下。
Book.java
package com.example.myaidl;
import android.os.Parcel;
import android.os.Parcelable;
public class Book implements Parcelable {
private String name;
public Book(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
接下来便是要定义服务端暴露给客户端的接口了(获取书籍列表,添加书籍)
在同样的目录定义aidl文件BookController.aidl
package com.example.myaidl;
import com.example.myaidl.Book;
interface BookController {
List<Book> getBookList();
void addBookInOut(inout Book book);
}
注意要把包手动导进来。然后将项目clean一下
创建service
package com.example.myaidl;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class AIDLService extends Service {
private final String TAG = "AIDLserver";
private volatile List<Book> mBookList;
public AIDLService(){
}