服务端:
1.首先在你的模块下的build.gradle里面把AIDL加上:
Groovy
android{
...
buildFeatures{
aidl true
}
}
加上后记得同步一下
2.新建src/main/aidl文件夹,右键文件夹新建一个AIDL文件即可

3.在aidl文件里面写需要实现的抽象方法
4.编译一下项目,android studio会自动为我们生成对应的类文件,路径为app/build/generated/aidl_source_output_dir,你可以在这个路径下发现一个相同包名的接口,这个就是aidl对应的java文件:
java
public interface IDataAccess extends android.os.IInterface
{
.....
}
5.新建一个Service,我们通过service来向客户端提供一个实现这个接口的类的binder对象,进而让客户端可以跨进程调用我们的aidl接口:
java
public class DataAccess extends Service {
private static final String TAG = "IDataAccess";
private static String name = "";
//这里通过匿名内部类的方式创建一个实例化对象:IDataAccess.Stub是一个继承了Binder实现了IDataAccess的抽象类
private final IDataAccess.Stub mBinder = new IDataAccess.Stub() {
@Override
public String get() throws android.os.RemoteException {
return name;
}
@Override
public int set(String value) throws android.os.RemoteException {
this.name = name;
retunn 1;
}
};
public DataAccess() {
}
//返回binder对象
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
}
最后把我的Service在AndroidManifest.xml文件里面注册一下就好了,至此服务端就创建完成了。
下面是客户端的实现:
把服务端的aidl文件复制到客户端项目,注意必须路径啥的和服务端一模一样,然后编译一下项目,和服务端一样,也会生成对应的java文件。
接下来就是创建一个连接对象:
java
sConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
/**sDataAccessInterface是我们声明的一个对象,用来存储连接后的AIDL实例
*连接成功后通过IDataAccess.Stub.asInterface(service)把接收的binder对象实例化为AIDL实例
**/
Log.d(TAG, "Service connected: " + name.flattenToString());
sDataAccessInterface = IDataAccess.Stub.asInterface(service);
sIsBound = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "Service disconnected: " + name.flattenToString());
sDataAccessInterface = null;
sIsBound = false;
}
@Override
public void onBindingDied(ComponentName name) {
Log.w(TAG, "Service binding died: " + name.flattenToString());
sDataAccessInterface = null;
sIsBound = false;
}
@Override
public void onNullBinding(ComponentName name) {
Log.w(TAG, "onNullBinding: " + name.flattenToString());
sDataAccessInterface = null;
sIsBound = false;
}
};
这里我是通过binderservice进行连接的,不知道的同学可以问下AI
现在我们的工作就完成了,可以使用AIDL实例调用服务端的方法了。