ActionBar 向上导航重新创建父活动,而不是 onResume

我使用的是 向上导航的推荐方法,我的代码如下:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent h = new Intent(ShowDetailsActivity.this, MainActivity.class);
h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(h);
return true;
default: return super.onOptionsItemSelected(item);
}
}

以下是用例:

  1. 我启动了我的应用程序“ MainActivity”
  2. 我点击一个按钮进入“ ShowDetailsActivity”
  3. 我点击 UP ActionBar 导航

问题是在我点击 UP 之后,MainActivity 会再次点击它的 onCreate ()方法,并且丢失所有的状态,而不是像从 ShowDetailsActivity 调用“ Finish ()”那样从典型的 onResume ()开始。为什么?这是它一直以来的工作方式吗? 这是 Android 使用“ Up”导航方法重新创建所有导航到的活动的预期行为吗?如果我按下后退按钮,我就得到了简历生命周期所期望的结果。

如果没有合适的安卓系统,这就是我的解决方案:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent upIntent = new Intent(this, MainActivity.class);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
NavUtils.navigateUpTo(this, upIntent);
finish();
} else {
finish();
}
return true;
default: return super.onOptionsItemSelected(item);
}
}
19917 次浏览

这个代码对我很有用:

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
// This activity is NOT part of this app's task, so create a new task
// when navigating up, with a synthesized back stack.
TaskStackBuilder.create(this)
// Add all of this activity's parents to the back stack
.addNextIntentWithParentStack(upIntent)
// Navigate up to the closest parent
.startActivities();
} else {
// This activity is part of this app's task, so simply
// navigate up to the logical parent activity.
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
NavUtils.navigateUpTo(this, upIntent);
}


return true;

不需要完成()调用。

的原因是,如果没有指定其他模式,那么在使用向上导航时会重新创建活动,因为 android 使用标准的启动模式。也就是说

”系统始终在 目标任务”

因此活动被重新创建(见文档 给你)。

解决方案 是将 MainActivity 的启动模式声明为

android:launchMode="singleTop"

AndroidManifest.xml
(应始终与 Intent.FLAG_ACTIVITY_CLEAR_TOP一起工作)

您可以将 FLAG_ACTIVITY_SINGLE_TOP添加到您的意图标志中,以告诉活动,如果它在后台堆栈上,则不应该重新创建它,例如。

Intent h = NavUtils.getParentActivityIntent(this);
h.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
NavUtils.navigateUpTo(this, h);

将以下内容添加到清单文件中的父活动中

android:launchMode="singleTop"

关于这个 回答

对我有效的方法(我也认为最干净的方法)是将活动重新排序为 front。如果它在堆栈上不存在,它将在你“导航”时被创建。

Intent upIntent = NavUtils.getParentActivityIntent(this);
upIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(upIntent);
finish();
return true;

你只需要回去,而不是再次创建活动。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
super.onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}

从 Android 4.1(API 级别16)开始,您可以通过在元素中指定 Android: ParentActivityName 属性来声明每个活动的逻辑父元素。 如果您的应用程序支持 Android 4.0或更低版本,请在应用程序中包含“支持库”,并在。然后指定父活动作为 android.support. PARENT _ ACTIVITY 的值,匹配 android: ParentActivityName 属性。

<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
android:name="com.example.myfirstapp.MainActivity" ...>
...
</activity>
<!-- A child of the main activity -->
<activity
android:name="com.example.myfirstapp.DisplayMessageActivity"
android:label="@string/title_activity_display_message"
android:parentActivityName="com.example.myfirstapp.MainActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value="com.example.myfirstapp.MainActivity" />
</activity>

如果父活动具有启动模式,或者 up 意图包含 FLAG _ ACTIVITY _ CLEAR _ TOP,那么父活动将被带到堆栈顶部,并通过其 onNewInent ()方法接收意图。

<activity
android:launchMode="singleTop"
android:name="com.example.myfirstapp.MainActivity">


</activity>

在以上代码“ SingleTop”中,还可以创建“ singleTop”活动的新实例来处理新意图。但是,如果目标任务在其堆栈顶部已经有活动的现有实例,则该实例将接收新意图(在 onNewInent ()调用中) ; 不会创建新实例。

有关详细文档,请单击此处

要在用户按下应用程序图标时向上导航,可以使用 NavUtils 类的静态方法 NavateUpFromSameTask ()。 请阅读以上链接中给出的文档。