EDIT解决方案:出于某种原因,我还使用NEW_TASK标志启动了活动2和3 ..所以现在它可以使用下面的代码。
原始问题: 我已经搜索过并找到了关于如何完全清除堆栈的多个答案,但在尝试了多种不同的解决方案之后,我仍在苦苦挣扎。为了澄清我的问题,我有3个活动,其中活动1是主要活动,并且用户可以在任何时候单击活动2或3中工具栏中的向上按钮返回活动1.此时,堆栈应该是使用Activity 1完全清除并“从头开始”。活动2在后台堆栈上也可以有多个版本。例如:
1> 2> 2> 3(点击向上按钮)1
或
1> 2> 2> 2(点击向上按钮)1
我发现的所有答案基本上都是相同的,即在启动活动1时使用FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK。有些人还指出在启动活动后使用nsuserdefaults
。所以我的代码现在看起来像这样:
finish()
单击向上按钮时,我会按预期返回活动1。但是,当单击后退按钮时,我将返回到活动2.换句话说,堆栈未被清除。
这是在自定义@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
finish();
break;
case R.id.action_homepage:
openHomepage();
break;
default:
break;
}
return super.onOptionsItemSelected(item);
}
中实现的,活动1,2和3都扩展了。但是,在活动1中关闭向上按钮,因为它是“起始点”。我还尝试将BaseActivity
添加到清单文件中,并使用CLEAR_TOP标志,以及组合它们。
知道为什么这对我不起作用? acitivity 2和3是否需要有一些标志才能生效?
答案 0 :(得分:0)
您可以在活动2和3中覆盖 OnBackPressed 方法。 然后调用 finishAffinity(),清除所有后台堆栈,然后启动MainActivity。
例如,
@Override
public void onBackPressed() {
super.onBackPressed();
finishAffinity();
startActivity(new Intent(getActivity(), MainActivity.class));
}
上述方法仅适用于 API 16或更高版本,因为在API 16中添加了finishAffinity()方法,因此对于较低版本,您可以实现如下所示 -
@Override
public void onBackPressed() {
super.onBackPressed();
Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
答案 1 :(得分:0)
您应该尝试使用setFlags()方法,而不是使用addFlags()方法。它对我有用
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);