目錄
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接口即可。