如何清除堆栈历史记录中的特定活动?

假设我有一个包含名为A,B,C,D的活动的应用程序。 现在,考虑A已经作为根活动启动而B已经从A启动并且C已经从B启动并且已经从C启动。现在我在活动D中有一个名为“删除”的按钮。如果假设,我按下活动D中的“删除”按钮,然后应从历史堆栈中删除活动B和活动C. 在活动D中按回键应显示活动A而不是C.我不知道如何实现这一点。 任何人都可以帮我解决这个问题吗?

Solutions Collecting From Web of "如何清除堆栈历史记录中的特定活动?"

我不确定您是否可以直接以编程方式从历史记录中删除活动,但如果使用startActivityForResult()而不是startActivity() ,那么根据活动的返回值,您可以立即finish()前任活动以模拟你想要的行为。 通过在所有活动中使用此方法,您可以将此行为级联活动堆栈,以允许您从活动D转到活动A.

我知道这不是你的情况,但是如果你在开始活动之前就知道你不想让前任保留,你可以在startActivity()之后立即调用finish() startActivity()

请参阅常见任务中的 “新屏幕的生命周期”部分以及如何在Android中执行这些操作

我同意@RivieraKid,但我想到另一种方式:当你按“删除”时,你将自定义标志设置为true。

覆盖后退键事件:

 public void onBackPressed() { if (!remove){ super.onBackPressed(); }else{ Intent goToA = new Intent((this,ActivityA.class);); goToA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(goToA); } } 

你觉得这样做你想要的吗?

祝你好运。

RivieraKid有最好的答案(和很酷的登录),但为了完整性,我想提一下你也可以在意图中设置FLAG_ACTIVITY_NO_HISTORY标志,以使新发起的活动不出现在历史记录中。 请参阅http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

启动应用程序时。 默认情况下,所有活动都在同一任务中启动。 所以后面的堆栈如下所示。

任务:A-> B-> C-> D在这种情况下,后堆栈的TOP指向“D”

现在,如果你想让TOP再次指向“A”。 只需声明属性即可

 android:launchMode="singleTask" 

对于AndroidManifest.xml中的活动“A”

现在当你按下活动“D”中的“删除按钮”时,就像平常一样开始活动。 后面的堆栈被清除了活动“B”和“C”,你可以从活动“A”开始一个干净的开始

请记住,即使你没有在“D”中明确调用finish() ,它也会从内存中关闭并销毁你的活动D.

我想这会做你想要的。 在清单文件中,只需将“noHistory”属性添加到“B”和“C”活动中,在“D”中按下后退按钮时不需要重新访问。

      

另一种方法是创建一个类来访问活动并关闭它们。 例:

活动内容:

  • ACT1
  • ACT2
  • ACT3

控制类:

 public class ActivitiesControl { public static act1 vAct1 = null; public static act2 vAct2 = null; public static act3 vAct3 = null; } 

在您设置的每个活动的onCreate中:ActivitiesControl.vAct1 = this;

和onDestroy():ActivitiesControl.vAct1 = null;

当你想破坏一些活动将它从stackHistory中删除时,你只需要调用:

ActivitiesContro.vAct1.finish();

我不知道这是不是最好的方法,但是对我有用。