我有一个基于Building Your First App教程的非常简单的应用程序。有两项活动:MainActivity
通过DisplayMessageActivity
调用startActivity()
。
输入DisplayMessageActivity
时,我看到:
MainActivity.onStop()
正如预期的那样,但是当我按下后退按钮返回到父MainActivity
时,我得到:
MainActivity.onDestroy()
MainActivity.onCreate(null)
MainActivity.onStart()
对于这个非常简单的应用程序,活动总是被破坏。但是根据the documentation(第二个要点),典型的行为是在这种情况下停止并重新启动活动。
此外,首次启动子活动时不会发生onDestroy()
,但只会单击一次后退按钮。
两个问题:
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()
。
答案 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)
}
}