概述
看看官方文档:
AIDL(Android 接口定义语言)与您可能使用过的其他 IDL 类似。 您可以利用它定义客户端与服务使用进程间通信 (IPC) 进行相互通信时都认可的编程接口。 在 Android 上,一个进程通常无法访问另一个进程的内存。 尽管如此,进程需要将其对象分解成操作系统能够识别的原语,并将对象编组成跨越边界的对象。 编写执行这一编组操作的代码是一项繁琐的工作,因此 Android 会使用 AIDL 来处理。
看到这我们就知道了aidl是什么了:Android 接口定义语言。它可以实现一种通信服务ipc。既然是语言,那么都支持什么数据类型?
// IMyAidlTestInterface.aidl
package com.sim.aidlTest;
// Declare any non-default types here with import statements
interface IMyAidlTestInterface {
/**
* Demonstrates some basic types that you can use as parameters
* and return values in AIDL.
* /
void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString);
}
这是由AndroidStudio自动生成的aidl,可以看到aidl支持的基本类型。int,long,boolean,float,double,String。
默认情况下,AIDL 支持下列数据类型:
- Java 编程语言中的所有原语类型(如 int、long、char、boolean 等等)
- String
- CharSequence
- List
List 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 可选择将 List 用作“通用”类(例如,List)。另一端实际接收的具体类始终是 ArrayList,但生成的方法使用的是 List 接口。 - Map
Map 中的所有元素都必须是以上列表中支持的数据类型、其他 AIDL 生成的接口或您声明的可打包类型。 不支持通用 Map(如 Map
下面我们来看一下应用层aidl的使用,我认为aidl在使用时主要分为三步:
- 创建aidl接口
- 创建服务端
- 客户端调用
我创建了一个小的demo用来练习aidl的使用,下面是主要的代码:
步骤一:创建aidl接口
package com.sim.aidlTest;// Declare any non-default types here with import statementsinterface IMyAidlInterface {
void testMethod();
}
在接口中我只添加了一个方法。
步骤二:创建服务端
创建一个Service,Service中创建一个类继承AIDL接口中的Stub类并实现Stub中的抽象方法,最后不要忘记在onBind中返回这个类的对象。
public class MyAIDLService extends Service {
private static final String TAG = "MyAIDLService";
private final IMyAidlInterface.Stub mBinder=new IMyAidlInterface.Stub(){ @Override
public void testMethod() throws RemoteException { Log.d(TAG,"testMethod: this is myAIDLTest");
}
};
@Override