Android 怎么写一个AIDL接口?

服务端:

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实例调用服务端的方法了。

相关推荐
2501_916008895 小时前
深入解析iOS机审4.3原理与混淆实战方法
android·java·开发语言·ios·小程序·uni-app·iphone
独行soc7 小时前
2026年渗透测试面试题总结-20(题目+回答)
android·网络·安全·web安全·渗透测试·安全狮
常利兵7 小时前
2026年,Android开发已死?不,它正迎来黄金时代!
android
Risehuxyc7 小时前
备份三个PHP程序
android·开发语言·php
Doro再努力17 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华17 小时前
echarts使用案例
android·javascript·echarts
做人不要太理性18 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我1234518 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
朗迹 - 张伟19 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu19 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习