AIDL文件简析

本文简单介绍一下aidl文件build所生成的文件。
首先我们先新建一个aidl文件,like this:

// IMyAidlInterface.aidl
package com.learn.cxx.learn;

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

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

很简单,系统会默认帮我们生成一个作演示用的方法。然后我们rebuild一下工程,在build/generated/source/aidl/debug/com.learn.cxx.learn目录下面就会生成一个名为IMyAidlInterface.java的文件。如下:

/*
 * This file is auto-generated.  DO NOT MODIFY.
 * Original file: /home/cxx/dev/android/workspace/Learn/app/src/main/aidl/com/learn/cxx/learn/IMyAidlInterface.aidl
 */
package com.learn.cxx.learn;
// Declare any non-default types here with import statements

public interface IMyAidlInterface extends android.os.IInterface {
    /**
     * Local-side IPC implementation stub class.
     */
    public static abstract class Stub extends android.os.Binder implements com.learn.cxx.learn.IMyAidlInterface {
        private static final java.lang.String DESCRIPTOR = "com.learn.cxx.learn.IMyAidlInterface";

        /**
         * Construct the stub at attach it to the interface.
         */
        public Stub() {
            this.attachInterface(this, DESCRIPTOR);
        }

        /**
         * Cast an IBinder object into an com.learn.cxx.learn.IMyAidlInterface interface,
         * generating a proxy if needed.
         */
        public static com.learn.cxx.learn.IMyAidlInterface asInterface(android.os.IBinder obj) {
            if ((obj == null)) {
                return null;
            }
            android.os.IInterface iin = obj.queryLocalInterface(DESCRIPTOR);
            if (((iin != null) && (iin instanceof com.learn.cxx.learn.IMyAidlInterface))) {
                return ((com.learn.cxx.learn.IMyAidlInterface) iin);
            }
            return new com.learn.cxx.learn.IMyAidlInterface.Stub.Proxy(obj);
        }

        @Override
        public android.os.IBinder asBinder() {
            return this;
        }

        @Override
        public boolean onTransact(int code, android.os.Parcel data, android.os.Parcel reply, int flags) throws android.os.RemoteException {
            switch (code) {
                case INTERFACE_TRANSACTION: {
                    reply.writeString(DESCRIPTOR);
                    return true;
                }
                case TRANSACTION_basicTypes: {
                    data.enforceInterface(DESCRIPTOR);
                    int _arg0;
                    _arg0 = data.readInt();
                    long _arg1;
                    _arg1 = data.readLong();
                    boolean _arg2;
                    _arg2 = (0 != data.readInt());
                    float _arg3;
                    _arg3 = data.readFloat();
                    double _arg4;
                    _arg4 = data.readDouble();
                    java.lang.String _arg5;
                    _arg5 = data.readString();
                    this.basicTypes(_arg0, _arg1, _arg2, _arg3, _arg4, _arg5);
                    reply.writeNoException();
                    return true;
                }
            }
            return super.onTransact(code, data, reply, flags);
        }

        private static class Proxy implements com.learn.cxx.learn.IMyAidlInterface {
            private android.os.IBinder mRemote;

            Proxy(android.os.IBinder remote) {
                mRemote = remote;
            }

            @Override
            public android.os.IBinder asBinder() {
                return mRemote;
            }

            public java.lang.String getInterfaceDescriptor() {
                return DESCRIPTOR;
            }

            /**
             * Demonstrates some basic types that you can use as parameters
             * and return values in AIDL.
             */
            @Override
            public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException {
                android.os.Parcel _data = android.os.Parcel.obtain();
                android.os.Parcel _reply = android.os.Parcel.obtain();
                try {
                    _data.writeInterfaceToken(DESCRIPTOR);
                    _data.writeInt(anInt);
                    _data.writeLong(aLong);
                    _data.writeInt(((aBoolean) ? (1) : (0)));
                    _data.writeFloat(aFloat);
                    _data.writeDouble(aDouble);
                    _data.writeString(aString);
                    mRemote.transact(Stub.TRANSACTION_basicTypes, _data, _reply, 0);
                    _reply.readException();
                } finally {
                    _reply.recycle();
                    _data.recycle();
                }
            }
        }

        static final int TRANSACTION_basicTypes = (android.os.IBinder.FIRST_CALL_TRANSACTION + 0);
    }

    /**
     * Demonstrates some basic types that you can use as parameters
     * and return values in AIDL.
     */
    public void basicTypes(int anInt, long aLong, boolean aBoolean, float aFloat, double aDouble, java.lang.String aString) throws android.os.RemoteException;
}

代码很长,看着眼晕,上一张UML图:这里写图片描述

UML画的不好,将就看一下。结构其实很清晰,继承关系我也不讲了。
我们在继承Service类实现自己的Service时,可重载onBind方法,并将一个ServiceClass实例作为返回值,onBind方法的返回类型是IBinder,显然,ServiceClass是可以作为返回值的。
在bindService时我们可以传入一个ServiceConnection对象,并获取到Service返回给我们的IBinder(也就是一个ServiceClass实例),然后通过Stub中的一个共有静态方法asInterface就可以将该IBinder对象转换为我们可以使用的IMyAidlInterface对象。我们通过操作IMyAidlInterface对象完成与服务端的通信。
以上。

参考:
在Android studio里面使用AIDL

<think>首先,用户的问题是:“aidl文件是什么”,我需要用中文回答这个问题。 AIDLAndroid Interface Definition Language 的缩写,意思是 Android 接口定义语言。它用于在 Android 中定义跨进程通信(IPC)的接口。 我的回答应该包括: - 解释 AIDL 是什么。 - 简要描述它的用途和工作原理。 - 可能提供一个简单的代码示例,因为示例格式中有一个代码块。 在示例格式中,有一个代码块用于快速排序,所以我应该为 AIDL 提供一个代码示例。 回答完成后,必须在末尾提出 3-5 个相关问题,并以 "§§相关问题§§" 开头,后面紧跟问题列表,不能换行分散。 相关问题必须基于用户的问题和我的回答。 结构: 1. 回答用户的问题。 2. 提供代码示例(如果需要)。 3. 以 "§§相关问题§§" 开头,然后列出 3-5 个相关问题。 相关问题示例: 1. AIDL 文件的基本结构是怎样的? 2. 如何在 Android 中使用 AIDL 进行 IPC? 3. AIDL 与其他 IPC 机制(如 Messenger)相比有什么优缺点? 4. 编写 AIDL 文件时需要注意哪些常见错误? 5. AIDL 支持哪些数据类型? 确保所有内容符合规则:用中文回答问题,相关问题在末尾,以 "§§相关问题§§" 开头。 完整回答: - 解释 AIDL。 - 代码示例:一个简单的 AIDL 文件定义。 - 然后 "§§相关问题§§" 和列表。 代码示例应该用 ``` 包裹,就像示例中那样。 最终输出: [回答部分] §§相关问题§§ 1. ... 2. ... 3. ...</think>### AIDL 文件是什么? AIDLAndroid Interface Definition Language)是 Android 接口定义语言的缩写,用于定义跨进程通信(IPC)的接口。它允许不同进程(如应用组件)通过 Binder 机制交互数据和方法调用。AIDL 文件以 `.aidl` 为后缀,定义了接口方法、参数和返回值类型,Android SDK 工具会将其编译为 Java 接口实现类,简化 IPC 开发。 **核心特点**: - **跨进程通信**:支持远程服务调用,例如后台服务与前台 Activity 的数据交换。 - **数据类型支持**:基本类型(如 `int`、`String`)、`Parcelable` 对象、`List` 和 `Map` 等。 - **自动生成代码**:编译生成 `Stub` 和 `Proxy` 类,处理底层 Binder 通信细节。 **简单示例**: 定义一个计算器接口的 AIDL 文件(`ICalculator.aidl`): ```java // 声明包名 package com.example.aidl; // 定义接口 interface ICalculator { // 方法:加法 int add(in int a, in int b); // 方法:减法 int subtract(in int a, in int b); } ``` 编译后,Android生成 `ICalculator.java` 实现类,供服务端和客户端使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值