簡體   English   中英

為什么在返回父活動時總是調用 onDestroy?

[英]Why is onDestroy always called when returning to parent activity?

我有一個基於構建您的第一個應用程序教程的非常簡單的應用程序 有兩個活動: MainActivity通過startActivity()調用DisplayMessageActivity

輸入DisplayMessageActivity ,我看到:

MainActivity.onStop()

正如預期的那樣,但是當我按下后退按鈕返回父MainActivity ,我得到:

MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()

對於這個非常簡單的應用程序,活動總是被破壞。 但是根據文檔(第二個要點),典型的行為是在這種情況下停止並重新啟動活動。

此外,在首次啟動子活動時不會發生onDestroy() ,而只會在單擊后退按鈕時發生。

兩個問題:

  1. 有沒有辦法防止父級在普通情況下被破壞?
  2. 為什么null在這里被傳遞給onCreate() 這阻止我通過onSaveInstanceState()保留狀態。

請注意,我已驗證設置 -> 開發人員選項 -> 應用程序 -> 不保留活動未選中。

編輯:

以下是子活動與父活動的鏈接方式:

    <activity
        android:name="com.example.helloworld.DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName="com.example.helloworld.MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.helloworld.MainActivity" />
    </activity>

通過DisplayMessageActivity.onOptionsItemSelected()跟蹤,我可以看到它正在調用Activity.onNavigateUp()

感謝 Greg Giacovelli 的評論,我在這里找到了答案。 解決方案是將android:launchMode="singleTop"設置為父活動。

我還是不明白為什么這樣的基本信息如此未知和難以找到!

在 Manifest 中添加 launchMode 每次都會更改啟動模式,即使它不是由子活動啟動的。 還有其他方法可以啟動現有實例。

1.override onOptionsItemSelected(item: MenuItem)

override fun onOptionsItemSelected(item: MenuItem): Boolean {
   return when (item.itemId) {
        android.R.id.home -> {
            // Respond to the action bar's Up/Home button
            val upIntent: Intent? = NavUtils.getParentActivityIntent(this)
            when {
                upIntent == null -> throw IllegalStateException("No Parent Activity Intent")
                else -> {
                    //add launch flag here
                    upIntent.flags=Intent.FLAG_ACTIVITY_CLEAR_TOP
                    NavUtils.navigateUpTo(this, upIntent)
                }
            }
            true
        }
        else -> super.onOptionsItemSelected(item)
    }
}
  1. 第二個解決方案看起來像一個錯誤。 將“android:parentActivityName”設置為當前任務堆棧中不存在的活動。 Android 的行為類似於“返回”按鈕。 它啟動頂部實例而不是啟動父活動。 文檔提到“NavUtils.shouldUpRecreateTask”可以識別當前任務中是否存在父活動。 但它在我的測試中不起作用。 使用新的返回堆棧向上導航

暫無
暫無

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

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