Android AIDL 创建的DEMO

使用AIDL创建一个demo 主要参考文件, 以及其他地址

Android 接口定义语言 (AIDL) | Android 开发者 | Android Developers

绑定服务概览 | Android 开发者 | Android Developers

Android 接口定义语言 (AIDL)

Android 接口定义语言 (AIDL) 与您可能使用过的其他接口语言 (IDL) 类似。您可以利用它定义客户端与服务均认可的编程接口,以便二者使用进程间通信 (IPC) 进行相互通信。在 Android 中,一个进程通常无法访问另一个进程的内存。因此,为进行通信,进程需将其对象分解成可供操作系统理解的原语,并将其编组为可供您操作的对象。编写执行该编组操作的代码较为繁琐,因此 Android 会使用 AIDL 为您处理此问题。

注意: 只有在需要不同应用的客户端通过 IPC 方式访问服务,并且希望在服务中进行多线程处理时,您才有必要使用 AIDL。如果您无需跨不同应用执行并发 IPC,则应通过实现 Binder 来创建接口;或者,如果您想执行 IPC,但 需要处理多线程,请使用 Messenger来实现接口。无论如何,在实现 AIDL 之前,请您务必理解绑定服务

上面是官网对AIDL的描述,下面说了使用AIDL创建一个简单的dmeo

1 选中自己包名

2 点击鼠标右键 之后选择new ,之后再选择AIDL 在点击AIDL File

之后自己取一个名字点击finish

3 之后android studio 会自动生成一个AIDL包如下, 下面文件是自己刚才文件的,报名时工具生成

一般里面默认有一个方法,自己有添加了几个,1个void 和2个有返回值的方法,具体如下

// Declare any non-default types here with import statements

interface Information {
    /**
     * 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);

    // 自己定义的几个方法
    void Infor(String name ,int age);

    boolean isActive();

    List<String> getList();

}

4 之后再点击工具栏上的Build

5 选择里面的Make Project

之后自己在app下面的build里面查看生成的文件,如果文件生成了,就可以接着下面的工作了

下面图是 Make Project 生成的

AIDL文件生成之后下面写代码

创建一个Service

public class InforService extends Service {

    private final IBinder iBinder = new Information.Stub() {
        @Override
        public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, String aString) throws RemoteException {
            Log.d("******InforService", "Received data: " + anInt + ", " + aLong + ", " + aBoolean + ", " + aFloat + ", " + aDouble + ", " + aString);
        }

        @Override
        public void Infor(String name, int age) throws RemoteException {
            Log.d("******infor", "姓名=" + name + "," + "年龄=" + age);
        }

        @Override
        public boolean isActive() throws RemoteException {
            return true;
        }

        @Override
        public List<String> getList() throws RemoteException {
            return Arrays.asList("A", "B", "C", "D");
        }
    };

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        Log.d("******Bind service:", String.valueOf(intent));
        return iBinder;
    }
}

之后再AndroidManifest 文件里面注册下刚才创建的服务

            <service
            android:name="com.hly.aidldemo.InforService"
            android:enabled="true"
            android:exported="true" />

最后在Main里面使用ServiceConnection来获取AIDL连接成功和失败的方法

在连接成功的方法里面使用asInterface获取AIDL里面的方法

下面是自己放2个void方法里面传递一些参数,然后获取2个有返回值的方法,如下

public class MainActivity extends ComponentActivity {

    private final ServiceConnection mServiceConnection = new ServiceConnection() {
        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            Information information = Information.Stub.asInterface(service);
            try {
                //传递参数
                information.basicTypes(18,18L,true,18.88f,18.88,"HI");
                information.Infor("张三丰",180);
                //获取参数
                Log.d("******isActive", String.valueOf(information.isActive()));
                Log.d("******getList", String.valueOf(information.getList()));
            } catch (RemoteException e) {
                throw new RuntimeException(e);
            }
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {
            Log.d("******onServiceDisconnected,","onServiceDisconnected:"+name);
        }
    };

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_activity_layout);

        Intent intent = new Intent(this,InforService.class);
        bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE);
    }
}

这样一个简答的AIDLdemo 流程就创建完成了。

demo 地址,上传到码云上了,点击可以下载看看

相关推荐
长亭外的少年6 小时前
Kotlin 编译失败问题及解决方案:从守护进程到 Gradle 配置
android·开发语言·kotlin
建群新人小猿9 小时前
会员等级经验问题
android·开发语言·前端·javascript·php
1024小神10 小时前
tauri2.0版本开发苹果ios和安卓android应用,环境搭建和最后编译为apk
android·ios·tauri
兰琛10 小时前
20241121 android中树结构列表(使用recyclerView实现)
android·gitee
Y多了个想法11 小时前
RK3568 android11 适配敦泰触摸屏 FocalTech-ft5526
android·rk3568·触摸屏·tp·敦泰·focaltech·ft5526
NotesChapter12 小时前
Android吸顶效果,并有着ViewPager左右切换
android
_祝你今天愉快13 小时前
分析android :The binary version of its metadata is 1.8.0, expected version is 1.5.
android
暮志未晚Webgl13 小时前
109. UE5 GAS RPG 实现检查点的存档功能
android·java·ue5
麦田里的守望者江14 小时前
KMP 中的 expect 和 actual 声明
android·ios·kotlin
Dnelic-14 小时前
解决 Android 单元测试 No tests found for given includes:
android·junit·单元测试·问题记录·自学笔记