Parcelable 與 Bundle

ParcelableBundle 物件應用於 用於跨程序邊界,例如處理序間通訊 (IPC/Binder) 交易、在具有意圖的活動之間處理交易,以及儲存跨設定時的暫時性狀態 並輸入變更內容本頁面提供使用 ParcelableBundle 物件。

注意: Parcel 並非一般用途 因此請勿 在磁碟上儲存任何 Parcel 資料,或透過網路傳送資料。

在活動之間傳送資料

應用程式建立要用於的 Intent 物件時 startActivity(android.content.Intent)開始新的活動, 應用程式可以將文字傳入 使用 putExtra(java.lang.String, java.lang.String) 進行 方法。

下列程式碼片段示範如何執行這項作業。

Kotlin

val intent = Intent(this, MyActivity::class.java).apply {
    putExtra("media_id", "a1b2c3")
    // ...
}
startActivity(intent)

Java

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("media_id", "a1b2c3");
// ...
startActivity(intent);

OS 會封裝意圖的基礎 Bundle。接著,OS 會建立 新的活動 並將資料拆分,然後將意圖傳遞至新活動。

建議您使用 Bundle 類別設定作業系統已知的基本 Intent 物件。Bundle 類別具有高度限制 最適合使用地塊進行搜尋與拆解。

在某些情況下,您可能需要具有跨活動傳送複合或複雜物件的機制。 在這種情況下,自訂類別應實作 Parcelable,並提供適當的 writeToParcel(android.os.Parcel, int) 方法。 也必須提供名為 CREATOR 的非空值欄位,且該欄位會 實作 Parcelable.Creator 介面,其中 createFromParcel() 方法用於將 Parcel 轉換回目前的物件。 如需更多資訊 請參閱 Parcelable 物件的參考說明文件。

透過意圖傳送資料時,應小心將資料大小限制為幾 KB。 傳送過多資料可能會導致系統擲回 TransactionTooLargeException 例外狀況。

在程序之間傳送資料

在程序之間傳送資料的方法與活動之間傳送類似。不過,傳送 ,建議您不要使用自訂 parcelable。如果傳送自訂值 應用程式之間的 Parcelable 物件,請務必確認 或是自訂類別的版本 傳送和接收應用程式。一般來說,這可能是通用的程式庫 用於兩個應用程式如果應用程式嘗試將自訂 Parcelable 系統,因為系統無法解開本身接觸的類別。

舉例來說,應用程式可能會使用 AlarmManager 類別,以及使用自訂 Parcelable 傳送到鬧鐘意圖上鬧鐘響起時,系統會修改意圖的 需要新增 Bundle 個額外項目 重複計數這項修改可能導致系統刪除 來自額外福利的 Parcelable。反過來說,這個清除作業可能會導致應用程式的 應用程式收到修改後的鬧鐘意圖時當機,因為應用程式預期 接收已不存在的額外資料。

Binder 交易緩衝區的固定大小有限,目前為 1 MB,與所有人共用 個處理中的交易。目前套用這項限制 這些交易包含所有繫結器交易,而非個別活動層級 例如 onSaveInstanceState、startActivity 以及與系統的任何互動,大小 超過限制,系統會擲回 TransactionTooLargeException。

如為 savedInstanceState 的情況,資料量應盡量小 因為系統程序需要保留 都能返回該活動 (即使活動程序終止)。 建議您將儲存狀態維持在 5 萬個以內。

注意:在 Android 7.0 (API 級別 24) 以上版本中,系統會擲回 TransactionTooLargeException 。 在較舊版本的 Android 中,系統只會在 logcat 中顯示警告。