Android 如何从堆栈历史中清除特定活动? 假设我有一个包含A、B、C、D.的活动的应用程序,考虑A已经被启动作为根活动,B已经从A和C启动,B和D已经从C启动了。现在我在活动D中有一个名为“Dead”的按钮。然后,应该从历史堆栈中删除活动B和活动C。按活动D的后退键时,应该显示活动A而不是C。我不知道如何实现这一点。有人能帮我解决这个问题吗?

Android 如何从堆栈历史中清除特定活动? 假设我有一个包含A、B、C、D.的活动的应用程序,考虑A已经被启动作为根活动,B已经从A和C启动,B和D已经从C启动了。现在我在活动D中有一个名为“Dead”的按钮。然后,应该从历史堆栈中删除活动B和活动C。按活动D的后退键时,应该显示活动A而不是C。我不知道如何实现这一点。有人能帮我解决这个问题吗?,android,Android,我不确定您是否可以通过编程直接从历史记录中删除活动,但是如果您使用startActivityForResult()而不是startActivity(),那么根据活动的返回值,您可以立即finish()模拟所需行为的前置活动。通过在所有活动中使用此方法,您可以将此行为级联到活动堆栈,以允许您从活动D转到活动A 我知道这不是你的情况,但是将来如果你在开始活动之前知道你不想让前一个继续,你可以在startActivity()之后立即调用finish() 请参阅中名为“新屏幕的寿命”的部分。我同意@Ri

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

我知道这不是你的情况,但是将来如果你在开始活动之前知道你不想让前一个继续,你可以在
startActivity()
之后立即调用
finish()


请参阅

中名为“新屏幕的寿命”的部分。我同意@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);
  }
}
你认为这是你想要的吗


祝你好运。

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



RivierKid有最好的答案(并且有一个很酷的登录),但是为了完整起见,我想说的是,您还可以设置标志\u ACTIVITY\u NO\u HISTORY标志,以使新启动的活动不会出现在历史记录中。请参见

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

活动:

  • 行动1
  • 行动2
  • 行动3
控制类:

public class ActivitiesControl {

    public static act1 vAct1 = null; 
    public static act2 vAct2 = null;
    public static act3 vAct3 = null;
}
在设置的每个活动的onCreate中: ActivitiesControl.vAct1=此

和onDestroy() ActivitiesControl.vAct1=null

当您要销毁某些活动以将其从stackHistory中删除时,只需调用:

ActivitiesContro.vAct1.finish()


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

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

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

现在,如果你想再次将最高点指向“A”。 只需声明属性

android:launchMode="singleTask"
对于AndroidManifest.xml中的活动“A”

现在,当您按下活动“D”中的“删除按钮”时 只需像往常一样开始活动。后堆栈已从中清除 活动“B”和“C”,你就可以从活动“a”开始了

记住,这将关闭并从内存中销毁活动D
即使您没有在“D”中显式调用
finish()
,也可能会发生糟糕的内存泄漏EP,存储在这些静态字段中的活动不会被垃圾收集。有关在startActivity()之后立即调用finish()以使当前活动不留在堆栈中的注释非常有用。谢谢
android:launchMode="singleTask"