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的参数标识准备的。睡觉了,后面有时间在介绍参数标识的含义吧。
上一篇: C++:使用void *传递多个参数
下一篇: LeetCode刷题 8.字符串转换整数
推荐阅读
-
自定义实现Json字符串向C#对象转变的方法
-
Android编程实现全局获取Context及使用Intent传递对象的方法详解
-
Python进阶之自定义对象实现切片功能
-
Map集合的遍历方式以及TreeMap集合保存自定义对象实现比较的Comparable和Comparator两种方式
-
C#在WinForm中使用WebKit传递js对象实现与网页交互的方法
-
e4 handler 传递自定义对象
-
Aidl传递自定义对象实现
-
大数据量Excel导出使用SXSSFWorkbook对象临时文件位置实现自定义配置
-
webservice 自定义对象,传递list<自定义对象>,客户端获取值为null
-
Spring security 自定义过滤器实现Json参数传递并兼容表单参数(实例代码)