Android:清除返回栈

362

在Android中,我有一些活动,假设它们是A,B,C。

在A中,我使用以下代码打开B:

Intent intent = new Intent(this, B.class);
startActivity(intent);
在B中,我使用以下代码来打开C:
Intent intent = new Intent(this, C.class);
startActivity(intent);

当用户在C中点击按钮时,我希望返回A并清除后退栈(关闭B和C)。因此,当用户使用后退按钮时,B和C将不会出现。我一直在尝试以下操作:

Intent intent = new Intent(this, A.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
startActivity(intent);

但是当我回到活动A时,如果我使用后退按钮,B和C仍然会出现。我该如何避免这种情况?

39个回答

0
虽然可能有点晚了,但我也遇到了同样的问题。当我试图从活动A -> B -> C -> D,然后如果D返回true,则转到B,我想清除活动D和C。
val intent = Intent(this, ActivityUpload::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)

我按照文档中的描述找到了解决方案。

例如,考虑一个由活动 A、B、C、D 组成的任务。如果 D 使用 Intent 调用 startActivity(),并将其解析为活动 B 的组件,则 C 和 D 将被结束,B 将接收给定的 Intent,导致堆栈现在变为:A、B。


0

我在启动新的意图后调用了activity_name.this.finish(),这对我起作用了。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

但这对我不起作用...我并不建议使用这个解决方案,但如果设置标志无法解决问题,那么你可以尝试一下。但我仍然建议不要使用它。


0

除了 FLAG_ACTIVITY_CLEAR_TOP,你也可以尝试添加 Intent.FLAG_ACTIVITY_SINGLE_TOP

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);


那只会影响栈顶的活动,而不是它的根。 - jakebasile

0
给定的代码可以正常工作。我在应用程序生命周期示例中尝试过。
使用FLAG_ACTIVITY_CLEAR_TOP标志启动Activity A后,我没有在返回栈中找到B和C。

0

这对我在onBackPressed中起作用:

public void onBackPressed()
{
    Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class);

    Intent myIntent = new Intent(this, ImageUploadActivity.class);
    myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
   finish();
}

0

这段代码在 Kotlin 中适用:

 val intent = Intent(this, MainActivity::class.java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()

0

这是我解决问题的方法:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}

-2

这是一个非常古老的答案,我真的没有找到一个合适的解决方案。为了清除backStack的唯一目的,我决定创建自己的backstack,它实际上甚至不是一个堆栈,但它也没有必要,因为我们无论如何都想清除其中的所有内容;

每次处理backstack都有点繁琐,但这给了我所需的控制权;


首先声明一个公共静态的活动列表(或片段,根据您的需要);
public static ArrayList <Activity> backStack = new ArrayList<>();

并在所有其他活动的onCreate方法内部:

MainActivity.backStack.add(this);

最后,当您想要清除后堆栈时,请调用以下代码:
public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}

-27
Intent intent = new Intent(this, A.class);
startActivity(intent);
finish();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接