簡體   English   中英

savedInstanceState 是 null 在第一次應用程序關閉后但不是在第二次

[英]savedInstanceState is null after first app shutdown but not after second

我正在關注這個代碼實驗室 Android Kotlin 基礎知識 04.2:復雜的生命周期情況https://codelabs.developers.google.com/codelabs-koindex/android

在 tast 5 中,您模擬應用程序關閉並使用 onSaveInstanceState()

當我按照說明進行操作時,以及在運行解決方案代碼時,第一個應用程序關閉后並沒有恢復 saveInstanceState ,而是在第二個應用程序關閉后才恢復。

來自 Codelab 的解決方案代碼: https://github.com/google-developer-training/android-kotlin-fundamentals-apps/tree/master/DessertClickerFinal

和 MainActivity 代碼

class MainActivity : AppCompatActivity() {

    private var revenue = 0
    private var dessertsSold = 0
    private lateinit var dessertTimer : DessertTimer;
    private var currentDessert = allDesserts[0]

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        Timber.i("onCreate called")

        if (savedInstanceState != null) {
            revenue = savedInstanceState.getInt(KEY_REVENUE, 0)
            dessertsSold = savedInstanceState.getInt(KEY_DESSERT_SOLD, 0)
            dessertTimer.secondsCount =
                    savedInstanceState.getInt(KEY_TIMER_SECONDS, 0)
            // Show the next dessert
            showCurrentDessert()
        }
    }

    override fun onSaveInstanceState(outState: Bundle) {
        super.onSaveInstanceState(outState)
        Timber.i("onSaveInstanceState Called")
        outState.putInt(KEY_REVENUE, revenue)
        outState.putInt(KEY_DESSERT_SOLD, dessertsSold)
        outState.putInt(KEY_TIMER_SECONDS, dessertTimer.secondsCount)
    } 

在解決方案代碼項目中,我執行以下操作:

  • 運行應用程序,點擊甜點(創建數據保存)
  • 將應用程序置於后台,將其殺死
  • 使用最近屏幕打開應用程序
  • onSaveInstanceState 是 null..
  • 再次將應用程序置於后台,將其殺死
  • 使用最近屏幕打開應用程序
  • 已恢復已保存狀態

每次都會發生這種情況; 應用程序第一次運行和關閉后,沒有任何反應,在我第二次殺死它后,savedState 恢復了。

我使用 Android Studio 和 Kotlin。 我使用以下命令關閉應用程序: adb shell am kill com.example.android.dessertclicker或 Logcat 中的終止應用程序按鈕。 兩者都給出相同的結果。

我讀到一些程序員說你必須在將鍵值對放到 outstate:Bundle 之后調用 super.onSaveInstanceState,但我只是按照示例代碼進行的。 當我嘗試調用它時,無論如何我都會得到相同的結果。

有誰知道為什么會這樣? 誰能告訴我他們在運行解決方案代碼時是否遇到相同的行為?

我相信這可以歸結為可以使用舊版本的應用程序保存的已保存實例 state 創建活動嗎? . 系統不認為從 最近屏幕啟動的活動是從 Android Studio 啟動的活動的延續。 也許可以通過強制taskAffinitylaunchMode為您的活動提供建議,但沒有什么是防彈的 如果從啟動器而不是 Android Studio 運行應用程序,則可以從頭開始重現整個周期。

此外,重要的是要記住:

注意

可以同時在后台執行多個任務。 但是,如果用戶同時運行多個后台任務,系統可能會開始破壞后台活動以恢復 memory,從而導致活動狀態丟失。

嘗試包括 onRestoreInstanceState。 此處閱讀有關生命周期的更多信息。 但我認為如果你殺死應用程序,它不會保存 state ......也許你應該更好地使用SharedPreferences

暫無
暫無

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

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