2011-02-15 72 views
21

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

回答

29

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

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

请参见“新的屏幕的寿命”一节Common Tasks and How to do Them in Android

+0

有关在startActivity()之后立即调用finish()以便当前活动不在堆栈中的注释非常有用。谢谢。 – dazed 2015-12-13 16:24:32

19

我@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

标志Intent.FLAG_ACTIVITY_CLEAR_TOP正在工作。谢谢。 – anticafe 2011-03-13 08:28:33

+0

也为我工作。 – AB1209 2012-03-02 11:18:06

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> 
0

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

活动:

  • ACT1
  • ACT2
  • ACT3

Control类:

public class ActivitiesControl { 

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

在每个活动的OnCreate设置: ActivitiesControl.vAct1 = this;

and onDestroy(): ActivitiesControl。vAct1 = null;

当你想毁了一些活动,从stackHistory删除您只要致电:

ActivitiesContro.vAct1.finish();

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

1

当您启动应用程序。所有活动默认在同一个任务中启动。所以后面的堆栈如下所示。

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

现在d 时,如果你想为“A”再次进入前点。 刚刚宣布参加活动的“A”的属性

android:launchMode="singleTask" 

在AndroidManifest.xml中

现在,当您按下活动“d” 的“删除按钮”刚开始的活动像往常一样为你做。后退堆栈被清除 活动“B”和“C”的,你会得到从活动“A”

记住这将从内存 关闭和破坏你的活动d即使你不叫干净启动finish()明确地在“D”中