假设我有一个包含名为A,B,C,D的活动的应用程序。现在,考虑A已经作为根活动启动而B已经从A启动并且C已经从B启动并且D已经从C启动。现在我在活动D中有一个名为“删除”的按钮。如果假设,我按下活动D中的“删除”按钮,然后应从历史堆栈中删除活动B和活动C.在活动D中按回键应显示活动A而不是C.我不知道如何实现这一点。有人可以帮我解决这个问题吗?
答案 0 :(得分:31)
我不确定您是否可以直接以编程方式从历史记录中删除活动,但如果您使用startActivityForResult()
而不是startActivity()
,那么根据您的活动的返回值,您可以立即{ {1}}模拟所需行为的前任活动。通过在所有活动中使用此方法,您可以将此行为级联活动堆栈,以允许您从活动D转到活动A.
我知道这不是您的情况,但如果您在开始活动之前就知道您不希望保留前任,您可以在finish()
之后立即致电finish()
。
答案 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)
另一种方法是创建一个类来访问活动并关闭它们。 例如:
活动:
控制类:
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();
我不知道这是否是最好的方法,但是对我有用。