欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Aidl传递自定义对象实现

程序员文章站 2022-07-14 18:24:24
...

        关于这个小知识点,主要是为了下一个知识点做准备,这里先不展开,只说实现。我们知道,aidl默认支持基本数据类型以及String,CharSequence,List,Map等等,当然还有自定义的实现了Parcelable接口的类。今天就来说一下最后一种的实现步骤。主要分为以下几步:

  • 自定义类实现Parcelable接口,并置于aidl目录(方便移植)
  • 创建声明自定义类的与自定义类同名aidl文件
  • 创建使用自定义类的aidl文件,并手动导入自定义类
  • 在build.gradle(app)中添加配置,实现项目可解析aidl包下的java文件(类)
  • rebuild工程,不报错即完成我们的目标

(1)自定义类:Person.java:

package aoto.com.aidltest;

import android.os.Parcel;
import android.os.Parcelable;

/**
 * author:why
 * created on: 2019/4/7 17:28
 * description:
 */
public class Person implements Parcelable {


    private String name;
    private int age;

    public Person() {

    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return name + "----" + age;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        //写入到Parcel
        dest.writeString(name);
        dest.writeInt(age);

    }


    public void readFromParcel(Parcel source) {
        name = source.readString();
        age = source.readInt();
    }


    public static final Parcelable.Creator<Person> CREATOR = new Parcelable.Creator<Person>() {


        @Override
        public Person createFromParcel(Parcel source) {

            //从Parcel中读取生成对象;顺序和上面的dest的写入顺序要保持一致
            Person myParcelable = new Person();
            myParcelable.name = source.readString();
            myParcelable.age = source.readInt();
            return myParcelable;
        }

        @Override
        public Person[] newArray(int size) {
            return new Person[size];
        }
    };

}

(2)创建同名aidl文件:

// Person.aidl
package aoto.com.aidltest;
// Declare any non-default types here with import statements
   parcelable Person;

(3)创建应用了自定义对象的aidl文件,并手动导引用的类(Person):

// IMyAidlInterface.aidl
package aoto.com.aidltest;

import aoto.com.aidltest.Person;

interface IMyAidlInterface {
     void testIn(in Person p);
     void testOut(out Person p);
     void testInOut(inout Person p);
}

(4)在build.gradle(app的android下)文件中添加如下配置:

  sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/aidl']
        }
    }

完整配置示例:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "aoto.com.aidltest"
        minSdkVersion 22
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            java.srcDirs = ['src/main/java', 'src/main/aidl']
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

最后一步没有什么好说的了,我们rebuild一下工程,as会通过aidl(android 接口定义语言)文件帮助我们完成转换接口的代码。这个小知识点主要为了介绍下一部分关于 aidl 中in out inout的参数标识准备的。睡觉了,后面有时间在介绍参数标识的含义吧。