目录
2.1 创建StudentInfo.aidl 及 StudentInfo.java
2.2 IMyAidlInterface.aidl 文件中添加对应的接口
3.1 创建StudentInfo.aidl 及 StudentInfo.java
3.2 IMyAidlInterface.aidl 文件中添加对应的接口
1、简介
上一篇文章中,详细说明了如何使用aidl进行开发,并提供了一个demo进行测试,如果对aidl还不了解,建议先去看看学习AIDL入门-一个简单的小demo ,本篇文章主要讲解对于自定义的类,如何通过aidl进行传递。
2、Service 端
2.1 创建StudentInfo.aidl 及 StudentInfo.java
首先创建 StudentInfo.aidl 及 StudentInfo.java两个文件,需要特别注意的是,这两个文件必须在相同的包名下,否则我们在IMyAidlInterface使用StudentInfo,编译时会出现找不到StudentInfo类的错误。类文件结构如下:
下面我们分别看看StudentInfo.aidl 及 StudentInfo.java对应的内容:
- StudentInfo.aidl
package com.android.study.example.aidl;
parcelable StudentInfo;
- StudentInfo.java
package com.android.study.example.aidl;
import android.os.Parcel;
import android.os.Parcelable;
public class StudentInfo implements Parcelable {
private String userName;
private int userAge;
public StudentInfo() {
}
protected StudentInfo(Parcel in) {
userName = in.readString();
userAge = in.readInt();
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public static final Creator<StudentInfo> CREATOR = new Creator<StudentInfo>() {
@Override
public StudentInfo createFromParcel(Parcel in) {
return new StudentInfo(in);
}
@Override
public StudentInfo[] newArray(int size) {
return new StudentInfo[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(userName);
dest.writeInt(userAge);
}
}
要想在aidl中对对象进行传输,该类必须实现Parcelable接口。
2.2 IMyAidlInterface.aidl 文件中添加对应的接口
package com.android.study.example;
import com.android.study.example.aidl.StudentInfo;
interface IMyAidlInterface {
// 计算两个数的和
int add(int num1, int num2);
StudentInfo getStudentInfo();
}
2.3 在对应的Service 服务类中实现对应的接口
此处代码省略。
3、client端
3.1 创建StudentInfo.aidl 及 StudentInfo.java
在client端,也需要创建对应的StudentInfo.aidl 及 StudentInfo.java, 同时这两个文件也必须在相同的包名下,但是对于在哪个包名下,是否需要与service端是否一致,并没有强制要求,通常建议在相同的包名下,代码部分与service端一致,此处省略。
3.2 IMyAidlInterface.aidl 文件中添加对应的接口
此文件代码和service端相同即可,这里不再重复粘贴。
3.3 getStudentInfo() 调用
public void onClickShowStuInfo(View view){
try {
StudentInfo studentInfo = iMyAidlInterface.getStudentInfo();
mTvShowResult.setText("name: "+studentInfo.getUserName()+" age: "+studentInfo.getUserAge());
} catch (RemoteException e) {
e.printStackTrace();
}
}
3.4 测试结果
4、总结
通过aidl 传递自定义类的对象其实并不难,只需要在aidl文件下声明对应的类,同时在相同的包名下,创建类同时实现Parcelable接口即可。