簡體   English   中英

使用Android的新架構組件,saveInstanceState是否重要?

[英]With Android's new architecture components, does savedInstanceState matter?

閱讀Android的新架構組件 ,建議使用各種ViewModel實例將數據提供給Activities和Fragments。

還有一種從單個持久模型驅動數據的概念:

第二個重要原則是您應該從模型驅動UI,最好是持久模型。 持久性是理想的兩個原因:如果操作系統破壞您的應用程序以釋放資源,您的用戶將不會丟失數據,即使網絡連接不穩定或未連接,您的應用程序也將繼續工作。 模型是負責處理應用程序數據的組件。 它們獨立於應用程序中的視圖和應用程序組件,因此它們與這些組件的生命周期問題隔離開來。

一個類似的單一事實來源的概念:

在此模型中,數據庫充當單一事實來源,應用程序的其他部分通過存儲庫訪問它。 無論您是否使用磁盤緩存,我們都建議您的存儲庫將數據源指定為應用程序其余部分的唯一真實來源。

在我看過的代碼示例中,它們確實將savedInstanceState包傳遞給超類的實現,例如:

@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    String userId = getArguments().getString(UID_KEY);
    viewModel = ViewModelProviders.of(this).get(UserProfileViewModel.class);
    viewModel.init(userId);
}

但是,似乎我們的活動沒有理由將任何重要值顯式存儲/保存到savedInstanceState中。

savedInstanceState與新架構無關嗎?

我們的活動似乎沒有任何理由明確地將重要值存儲到/從savedInstanceState中檢索。

這完全取決於活動中的內容。

savedInstanceState與新架構無關嗎?

沒有。

保存的實例狀態背后的想法一直並且將繼續幫助活動假裝好像它一直存在,即使活動已被破壞並在此過程中重新創建,或者是因為:

  • 配置改變(例如,屏幕旋轉),或
  • 進程終止(例如,用戶離開應用程序,Android終止進程,用戶在半小時內返回應用程序)

因此,例如,假設我們有一個帶有表單的活動。 當用戶填寫表單並單擊“保存”操作欄項時,我們希望保留表單的內容。 並且,在某些情況下,我們正在打開一些已經存在的現有數據的表單,因此我們想要加載它。 這些是Android架構組件(特別是Room)旨在提供幫助的問題。

但是,假設用戶填寫表單上的字段,然后旋轉屏幕。 在這種情況下,我們很可能還不想在數據庫中保存更改,因為用戶沒有單擊“保存”以表示對持久保存此更改的興趣。 所以,我們依靠onSaveInstanceState()為我們處理。 在這種情況下,內置的onSaveInstanceState()處理這個,因為EditText的內容是明顯的用戶可變狀態。

但是,假設此外,在編輯字段后,用戶點擊ImageButton以選擇聯系人。 這使用ACTION_PICK來調出聯系人選擇器,用戶在那里選擇聯系人。 控制返回到原始活動,該活動可能具有TextView以顯示聯系人的姓名,或者可能使用聯系人頭像更新ImageButton 現在用戶旋轉屏幕。 再一次,我們可能不想堅持這一點。 但是,這一次,活動不會自動保留我們聯系人的Uri ,因為它不知道如何。 所以,我們把它放在保存的實例狀態Bundle ,重寫onSaveInstanceState()

數據存儲(例如,數據庫)代表單一的“事實來源”,但是應用程序邏輯決定數據何時變為“真實” ,而實例狀態是處理可能在未來成為真理的數據的常用方法,但不是真相呢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM