學習AIDL入門-傳遞自定義類的對象

目錄

1、簡介

2、Service 端

2.1  創建StudentInfo.aidl 及 StudentInfo.java

2.2 IMyAidlInterface.aidl 文件中添加對應的接口

2.3 在對應的Service 服務類中實現對應的接口

3、client端

3.1 創建StudentInfo.aidl 及 StudentInfo.java

3.2 IMyAidlInterface.aidl 文件中添加對應的接口

3.3 getStudentInfo() 調用

3.4 測試結果

4、總結


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

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章