无法使用API​​上的NEW_TASK和CLEAR_TASK清除堆栈> 15

时间:2016-08-24 11:24:45

标签: android-studio android-intent stack

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是否需要有一些标志才能生效?

2 个答案:

答案 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);