为什么在返回父活动时始终会调用onDestroy?

时间:2013-12-28 20:27:18

标签: android android-activity android-lifecycle

我有一个基于Building Your First App教程的非常简单的应用程序。有两项活动:MainActivity通过DisplayMessageActivity调用startActivity()

输入DisplayMessageActivity时,我看到:

MainActivity.onStop()

正如预期的那样,但是当我按下后退按钮返回到父MainActivity时,我得到:

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

对于这个非常简单的应用程序,活动总是被破坏。但是根据the documentation(第二个要点),典型的行为是在这种情况下停止并重新启动活动。

此外,首次启动子活动时不会发生onDestroy(),但只会单击一次后退按钮。

两个问题:

  1. 在普通情况下,有没有办法防止父母被摧毁?
  2. 为什么null传递给onCreate()?这可以防止我通过onSaveInstanceState()保留状态。
  3. 请注意,我已经验证了设置 - >开发者选项 - >应用 - >不要保持活动不受控制。

    编辑:

    以下是子活动与父级链接的方式:

        <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()

2 个答案:

答案 0 :(得分:25)

感谢Greg Giacovelli的评论,我找到了答案here。解决方案是设置android:launchMode="singleTop"

我仍然无法理解为什么这些基本信息如此未知且难以找到!

答案 1 :(得分:0)

每次在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. 第二个解决方案看起来像一个bug。将“android:parentActivityName”设置为当前任务堆栈中不存在的活动。 Android会像“BACK”按钮一样行为。它启动顶级实例,而不是启动父活动。文档提到“NavUtils.shouldUpRecreateTask”可以识别当前任务中是否存在父活动。但它在我的测试中不起作用。 Navigate up with a new back stack