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

30
假设我有一个应用程序,其中包含名为A、B、C、D的活动。现在,假设A作为根活动启动,B从A启动,C从B启动,D从C启动。现在,在活动D中有一个名为“删除”的按钮。如果我按下活动D中的“删除”按钮,则应该从历史堆栈中删除活动B和活动C。从活动D按下返回键应显示活动A而不是C。我不知道如何实现这个。有人可以帮我解决这个问题吗?
6个回答

34

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

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

请参阅Android常见任务及其执行方法中名为“新屏幕的生命周期”的部分。


关于在调用startActivity()后立即调用finish()以便当前活动不留在堆栈中的评论非常有帮助。谢谢。 - dazed

22

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

您认为这个代码可以实现您的需求吗?

祝您好运。


3

2

当您启动应用程序时,默认情况下所有活动都在同一个任务中启动。因此,返回堆栈如下所示。

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

现在,如果您想再次将顶部指向“A”,只需声明属性

android:launchMode="singleTask"

对于你的AndroidManifest.xml中的活动"A"

现在,当您在活动“D”中按下“删除按钮”时,只需像往常一样启动活动即可。回退堆栈将清除活动“B”和“C”,并从活动“A”开始进行清洁启动

请记住,即使您在“D”中没有显式调用finish(),这也将关闭并销毁您的活动D。


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>

-2
一个替代方案是创建一个类来访问这些活动并关闭它们。 例如:
活动:
- 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();

我不知道这是否是最好的方法,但它对我起作用了。

4
很糟糕的想法,可能会发生内存泄漏。 - Gelldur
是的,存储在那些静态字段中的活动不会被垃圾回收。 - Ion Farima

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接