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 地址,上传到码云上了,点击可以下载看看

相关推荐
拭心9 小时前
Google 提供的 Android 端上大模型组件:MediaPipe LLM 介绍
android
带电的小王11 小时前
WhisperKit: Android 端测试 Whisper -- Android手机(Qualcomm GPU)部署音频大模型
android·智能手机·whisper·qualcomm
梦想平凡12 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle
元争栈道12 小时前
webview和H5来实现的android短视频(短剧)音视频播放依赖控件
android·音视频
阿甘知识库13 小时前
宝塔面板跨服务器数据同步教程:双机备份零停机
android·运维·服务器·备份·同步·宝塔面板·建站
元争栈道13 小时前
webview+H5来实现的android短视频(短剧)音视频播放依赖控件资源
android·音视频
MuYe14 小时前
Android Hook - 动态加载so库
android
居居飒14 小时前
Android学习(四)-Kotlin编程语言-for循环
android·学习·kotlin
Henry_He17 小时前
桌面列表小部件不能点击的问题分析
android
工程师老罗17 小时前
Android笔试面试题AI答之Android基础(1)
android