Android開發 - Parcelable 介面實現不同元件之間傳遞資料解析

阿俊学JAVA發表於2024-08-29

什麼是 Parcelable

  • Parcelable 是用於物件序列化的一種介面。通俗來講,Parcelable 允許將一個物件轉化為一個位元組流,這樣你就可以將這個物件在不同元件之間(如 Activity、Service 等)進行傳遞

為什麼需要 Parcelable

  • 元件之間通訊時(比如在兩個 Activity 之間傳遞資料),傳遞的物件必須被序列化序列化是將物件轉換可以儲存或傳輸格式。它有兩種序列化方式:SerializableParcelableParcelable 相對於 Serializable高效,因此更推薦使用

Parcelable 的工作流程

  1. 實現 Parcelable 介面需要實現 Parcelable 介面覆蓋 writeToParcel() 方法,將物件的每個欄位寫入 Parcel 物件

  2. 定義一個 CREATOR 靜態欄位:它是一個實現了 Parcelable.Creator 介面物件,負責從 Parcel讀取資料並建立物件

程式碼示例

  • 有一個 User 類,我們想要在兩個 Activity 之間傳遞

    public class User implements Parcelable { 
        // User 類實現了 Parcelable 介面,表示這個類的物件可以被序列化並用於傳遞。
    
        private String name;
        private int age;
        // 定義了兩個欄位:name(String 型別)和 age(int 型別)。
    
        // 建構函式
        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }
        // 這是一個普通的建構函式,用於建立 User 物件時初始化 name 和 age 欄位。
    
        // 從 Parcel 中讀取資料的建構函式
        protected User(Parcel in) {
            name = in.readString();  // 從 Parcel 中讀取 String 型別的資料並賦值給 name 欄位。
            age = in.readInt();      // 從 Parcel 中讀取 int 型別的資料並賦值給 age 欄位。
        }
        // 這是一個特殊的建構函式,用於從 Parcel 物件中讀取資料並建立 User 物件。
    
        @Override
        public void writeToParcel(Parcel dest, int flags) {
            dest.writeString(name); // 將 name 欄位寫入到 Parcel 中。
            dest.writeInt(age);     // 將 age 欄位寫入到 Parcel 中。
        }
        // 這是 Parcelable 介面中的方法,用於將 User 物件的欄位寫入 Parcel。這樣它就可以被系統傳輸。
    
        @Override
        public int describeContents() {
            return 0;
        }
        // 這是 Parcelable 介面中的方法。通常返回 0 就可以。它用於描述當前物件的內容型別。
    
        public static final Creator<User> CREATOR = new Creator<User>() {
            // CREATOR 是一個靜態常量,是用於建立 User 類的物件並提供新陣列的方法。
            // 一個靜態欄位,用於從 Parcel 中建立新的 User 物件以及 User 陣列。它是 Parcelable.Creator<User> 的例項,實現了兩個方法:createFromParcel() 和 newArray()。
    
            @Override
            public User createFromParcel(Parcel in) {
                return new User(in);
            }
            // 從 Parcel 中讀取資料並返回一個新建立的 User 物件。
    
            @Override
            public User[] newArray(int size) {
                return new User[size];
            }
            // 建立一個指定大小的 User 陣列。
        };
        // CREATOR 的定義結束。這個欄位用於實現 Parcelable 介面中的 createFromParcel 和 newArray 方法。
    }
    
  • Activity 之間傳遞這個物件

    • 傳遞資料

      Intent intent = new Intent(CurrentActivity.this, NextActivity.class);
      User user = new User("Alice", 30);
      intent.putExtra("user_data", user);
      startActivity(intent);
      
    • 接收資料

      Intent intent = getIntent();
      User user = intent.getParcelableExtra("user_data");
      

總結

  • Parcelable 是用於高效物件序列化和傳遞的一種方式

  • 比 Serializable 更快,更適合

  • 需要實現 Parcelable 介面****並編寫序列化和反序列化程式碼**

相關文章