什麼是 Parcelable
- Parcelable 是用於物件序列化的一種介面。通俗來講,Parcelable 允許將一個物件轉化為一個位元組流,這樣你就可以將這個物件在不同的元件之間(如 Activity、Service 等)進行傳遞
為什麼需要 Parcelable
- 元件之間通訊時(比如在兩個 Activity 之間傳遞資料),傳遞的物件必須被序列化。序列化是將物件轉換成可以儲存或傳輸的格式。它有兩種序列化方式:Serializable 和 Parcelable。Parcelable 相對於 Serializable 更高效,因此更推薦使用
Parcelable 的工作流程
-
實現 Parcelable 介面:類需要實現 Parcelable 介面並覆蓋
writeToParcel()
方法,將物件的每個欄位寫入 Parcel 物件中 -
定義一個 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 介面****並編寫序列化和反序列化程式碼**