【Android必備】Parcelables and Bundles(6)

概要


Parcelable並且Bundle對象旨在用於跨IPC / Binder事務等進程邊界,活動與意圖之間以及跨配置更改存儲瞬態。本頁面提供使用Parcelable和Bundle對象的建議和最佳實踐 。

注意: Parcel不是通用的序列化機制,您不應該將任何Parcel數據存儲在磁盤上或通過網絡發送。

在activities之間發送數據


當應用程序創建一個Intent用於startActivity(android.content.Intent)啓動新Activity 的對象時 ,應用程序可以使用該putExtra(java.lang.String, java.lang.String) 方法傳入參數。

以下代碼片段顯示瞭如何執行此操作的示例。

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

OS Bundle包含意圖的基礎。然後,操作系統創建新的活動,取消數據包裹,並將意圖傳遞給新活動。

我們建議您使用Bundle該類在Intent對象上設置操作系統已知的基元 。的Bundle類是高度爲編組和解組使用包裹優化。

在某些情況下,您可能需要一種機制來跨活動發送合成或複雜對象。在這種情況下,自定義類應該實現Parcelable,並提供適當的 writeToParcel(android.os.Parcel, int)方法。它還必須提供一個非空的調用CREATOR實現該Parcelable.Creator接口的字段,該接口的 createFromParcel() 方法用於將Parcel後退轉換爲當前對象。有關更多信息,請參閱該Parcelable對象的參考文檔。

通過意圖發送數據時,應該小心將數據大小限制爲幾KB。發送太多數據會導致系統拋出 TransactionTooLargeException異常。

在進程之間發送數據


在進程之間發送數據與在活動之間執行數據類似。但是,在進程之間發送時,我們建議您不要使用自定義的可分區。如果您將自定義 Parcelable對象從一個應用程序發送到另一個應用程序,則需要確保發送應用程序和接收應用程序都具有完全相同的自定義類別版本。通常這可能是跨兩個應用程序使用的通用庫。如果您的應用程序嘗試向系統發送自定義parcelable,則會發生錯誤,因爲系統無法解組它不知道的類。

例如,應用可能會使用AlarmManager該類設置鬧鐘,並Parcelable 在鬧鐘意圖上使用自定義。當警報關閉時,系統會修改Bundle額外的意圖 以添加重複計數。此修改可能會導致系統Parcelable從附加內容中剝離自定義 。反過來,這種剝離可能導致應用程序在收到修改後的警報意圖時崩潰,因爲應用程序預計會收到不再存在的額外數據。

Binder事務緩衝區具有有限的固定大小,當前爲1MB,由進程中的所有事務共享。由於此限制處於流程級別而非每個活動級別,因此這些事務包括應用程序中的所有綁定事務,例如onSaveInstanceState,startActivity和與系統的任何交互。當超過大小限制時,將引發TransactionTooLargeException。

對於savedInstanceState的具體情況,數據量應該保持很小,因爲只要用戶可以導航回該活動(即使活動的進程被終止),系統進程也需要保留提供的數據。我們建議您將保存狀態保持爲小於50k的數據

注意:在Android 7.0(API級別24)及更高版本中,系統將引發TransactionTooLargeException作爲運行時異常。在較低版本的Android中,系統僅在logcat中顯示警告。

Lastest Update:2018.04.17

聯繫我

QQ:94297366
微信打賞:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公衆號推薦:

【Android必備】Parcelables and Bundles(6)

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