在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 manifest中使用[android:launchMode=" SingleTop "]将活动A声明为SingleTop。

现在,在从任何地方启动A时添加以下标志。它将清空堆栈。

Intent in = new Intent(mContext, A.class);
in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK );
startActivity(in);
finish();

其他回答

你不会得到任何活动按后退按钮之后:

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | 
Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finishAffinity();
finish();

这个问题困扰了我很长一段时间。最后我是这样解决的:

在片段中,使用:

Intent intent = new Intent(view.getContext(), A.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); 
startActivity(intent);

在Activity中,使用(再添加一个intent标志intent。FLAG_ACTIVITY_CLEAR_TASK相对于fragment):

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

我在开始新的意图后调用activity_name.this.finish(),它为我工作。

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

但这对我没用……我不建议使用这个解决方案,但如果设置标志不适合你,你可以试试这个..但我仍然建议不要使用它

尽管这可能来得晚了。当我试图从活动A -> B -> C -> D移动到B时,我遇到了同样的问题,如果D返回true,我想清除活动D和C。

val intent = Intent(this, ActivityUpload::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
startActivity(intent)

我得到了文档中描述的解决方案。

例如,考虑一个由下列活动组成的任务:a、B、C、D。如果D调用startActivity()时带有一个解析为活动B的组件的Intent,那么C和D将被完成,B接收到给定的Intent,导致堆栈现在是:a, B。

我发现了一个有趣的解决办法,可能会有帮助。我在onBackPressed()方法中做到了这一点。

finishAffinity();
finish();

FinishAffinity删除现有活动到其堆栈的连接。然后finish帮助你退出那个活动。最终将退出应用程序。