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

时间:2011-02-15 09:33:29

标签: android

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

6 个答案:

答案 0 :(得分:31)

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

我知道这不是您的情况,但如果您在开始活动之前就知道您不希望保留前任,您可以在finish()之后立即致电finish()

请参阅Common Tasks and How to do Them in Android

中名为“新屏幕的生命周期”的部分

答案 1 :(得分:21)

我同意@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);
  }
}

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

祝你好运。

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

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

即可
android:launchMode="singleTask"

表示AndroidManifest.xml中的活动“A”

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

请记住,这将从内存中关闭并销毁您的活动D. 即使您未在“D”中明确调用finish()

答案 4 :(得分:0)

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

    <activity   android:name="com.acme.activityA"></activity>

    <activity   android:name="com.acme.activityB"  
                android:noHistory="true"></activity>

    <activity   android:name="com.acme.activityC"  
                android:noHistory="true"></activity>

    <activity   android:name="com.acme.activityD"></activity>

答案 5 :(得分:-1)

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

活动:

  • 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();

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