簡體   English   中英

為什么永遠不會調用 onRestoreInstanceState()

[英]Why onRestoreInstanceState() never gets called

我試圖在我的活動中保存數據而不是恢復它。 我將數據保存在onSaveInstanceState()中,然后嘗試在onRestoreInstanceState()中恢復數據。

我設置了斷點,方法onSaveInstanceState()被調用。 但是onRestoreInstanceState()onCreate()從來沒有。

這是我的步驟:

  1. 開始我的Activity
  2. 按手機上的“主頁”按鈕。 onSaveInstanceState()被調用。
  3. 單擊啟動器中的圖標並再次啟動我的Activity

此時,只有onRestart()被調用。 但不是onRestoreInstanceState()onCreate()

有誰知道為什么?

來自文檔:

僅當存在要恢復的已保存狀態時,系統才會調用 onRestoreInstanceState()。

好吧,如果onRestart() ,實例變量的值將由應用程序堆棧本身維護,因此您不需要恢復它們。

onCreate()方法僅在調用ActivityonStop()並且進程被終止時調用。

請參考Activity生命周期Android Activity Life Cycle以獲得清晰的理解。

您可能想檢查是否調用了onStop()方法以及您的進程是否被終止。 我不認為您的流程會被您所描述的場景殺死。

onRestoreInstanceState()方法非常棘手。 我不知道它到底是什么時候被調用的,但我看到它在從 Potrait 變為 Landscape 時被調用了一次。

我早些時候在這里問過類似的問題

以下是測試onRestoreInstanceState()的一些步驟:

  1. 按主屏幕
  2. 通過adb殺死應用
  3. 再次啟動您的應用

請按照以下步驟操作(使用 Android Studio):

  1. 創建新的 Logcat 過濾器,例如 AppState
  2. 在您的模擬器上啟動該應用程序。 你會看見:

    I/AppState﹕onCreate

    I/AppState﹕onStart

    I/AppState﹕onResume

  3. 按 Ctl-F12 旋轉模擬器。 你會看見:

    I/StateChange﹕onPause

    I/StateChange﹕onSaveInstanceState

    I/StateChange﹕onStop

    I/StateChange﹕onDestroy

    I/StateChange﹕onCreate

    I/StateChange﹕onStart

    I/StateChange﹕onRestoreInstanceState

    I/StateChange﹕onResume

這會通過對設備進行配置更改(例如從縱向旋轉到橫向)來破壞和重新創建活動。

請參閱下面的鏈接,了解如何在真實設備或模擬器中測試onSaveInstanceState()onRestoreInstanceState()

此方法使用 AlwaysFinish 設置,它比終止進程更簡單、更快速。 該方法還提供了Activity級別的控制,而不是進程級別的控制:

http://bricolsoftconsulting.com/how-to-test-onsaveinstancestate-and-onrestoreinstancestate-on-a-real-device/

這是我針對真實設備的解決方案,因此調用了 onRestoreInstanceState。

  1. 在相關活動的manifest中刪除這部分android:configChanges="orientation"
  2. 在相關活動的manifest中刪除這部分android:screenOrientation="portrait"
  3. 在您的活動中刪除此行,如果它在那里setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
  4. 在您的設備上啟用旋轉設置 - 顯示 - 自動旋轉。

然后運行您的應用程序,旋轉您的設備。 而已。

暫無
暫無

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

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