假设我有一个应用程序,其中包含名为A、B、C、D的活动。现在,假设A作为根活动启动,B从A启动,C从B启动,D从C启动。现在,在活动D中有一个名为“删除”的按钮。如果我按下活动D中的“删除”按钮,则应该从历史堆栈中删除活动B和活动C。从活动D按下返回键应显示活动A而不是C。我不知道如何实现这个。有人可以帮我解决这个问题吗?
我不确定您是否可以直接以编程方式从历史记录中删除活动,但如果使用startActivityForResult()
而不是startActivity()
,则根据您的活动返回值,您可以立即finish()
前身活动,以模拟所需的行为。通过在所有活动中使用此方法,您可以将此行为级联到活动堆栈中,以允许您从活动D转到活动A。
我知道这不是您的情况,但以后如果您在开始活动之前知道不想保留前身,则可以在startActivity()
之后立即调用finish()
。
请参阅Android常见任务及其执行方法中名为“新屏幕的生命周期”的部分。
我同意@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);
}
}
您认为这个代码可以实现您的需求吗?
祝您好运。
当您启动应用程序时,默认情况下所有活动都在同一个任务中启动。因此,返回堆栈如下所示。
任务:A->B->C->D 在这种情况下,返回堆栈的顶部指向“D”
现在,如果您想再次将顶部指向“A”,只需声明属性
android:launchMode="singleTask"
对于你的AndroidManifest.xml中的活动"A"
现在,当您在活动“D”中按下“删除按钮”时,只需像往常一样启动活动即可。回退堆栈将清除活动“B”和“C”,并从活动“A”开始进行清洁启动
请记住,即使您在“D”中没有显式调用finish()
,这也将关闭并销毁您的活动D。
我认为这可以实现你想要的功能。在清单文件中,只需将“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>
public class ActivitiesControl {
public static act1 vAct1 = null;
public static act2 vAct2 = null;
public static act3 vAct3 = null;
}
ActivitiesContro.vAct1.finish();
我不知道这是否是最好的方法,但它对我起作用了。