在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并清除back堆栈(关闭B和C)。所以当用户使用后退按钮B和C不会出现时,我一直在尝试以下方法:

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

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


当前回答

在清单

android:launchMode="singleTask"

and

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

其他回答

尝试在文档中为FLAG_ACTIVITY_CLEAR_TOP添加FLAG_ACTIVITY_NEW_TASK:

这种启动模式也可以用于 配合使用效果好 FLAG_ACTIVITY_NEW_TASK:如果使用 启动一个任务的根活动it 会不会带来目前的运行 实例的 前景,然后清除到它的 根的状态。这个特别有用, 例如,当启动 来自通知的活动 经理。

启动A的代码是:

Intent intent = new Intent(this, A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);
CurrentActivity.this.finish(); // if the activity running has it's own context


// view.getContext().finish() for fragments etc.

除了FLAG_ACTIVITY_CLEAR_TOP,你可以尝试添加Intent。FLAG_ACTIVITY_SINGLE_TOP:

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

在kotlin中,它几乎与java相同。只有|符号被或文本替换。 它的写法是-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)

这是一个非常老的答案,我并没有真正找到一个适当的解决方案,以清除backStack的唯一目的,我决定创建自己的backStack,这甚至不是一个堆栈tbh,但它不必是,因为我们想要清除它的一切;

每次都有一个把手的背架的开销,但它给了我需要的控制;


首先声明一个公共的静态活动列表(或片段,无论你需要什么);

public static ArrayList <Activity> backStack = new ArrayList<>();

在所有其他活动的onCreate方法中:

MainActivity.backStack.add(this);

最后,当你想要清除backstack时,简单地调用:

public static void killBackStack () {
    for (Activity ac : backStack) {
        if (ac != null)
            ac.finish();
    }
}

意图。FLAG_ACTIVITY_CLEAR_TOP在这种情况下将不起作用。请使用(意图。FLAG_ACTIVITY_NEW_TASK

欲了解更多细节,请查看此文档。