Android 完成MainActivity和新activity之间的所有活动

Android 完成MainActivity和新activity之间的所有活动,android,android-activity,Android,Android Activity,我正在制作一个包含MainActivity(a)的应用程序,这是一个导航活动。该活动可以启动一个活动(B),从那里我可以导航到活动(C)。然后,当我导航到活动(D)时,我希望在它之前完成除MainActivity(A)之外的所有活动。所以本质上,如果我从活动(A)返回,我将转到活动(A)的同一个实例 因此本质上是A>B>C,然后当(D)启动时,堆栈是A>D。使用setFlags方法将标记活动\u CLEAR\u TOP赋予此目的 这将检查堆栈,查看MainActivity的实例是否已存在,如果已

我正在制作一个包含MainActivity(a)的应用程序,这是一个导航活动。该活动可以启动一个活动(B),从那里我可以导航到活动(C)。然后,当我导航到活动(D)时,我希望在它之前完成除MainActivity(A)之外的所有活动。所以本质上,如果我从活动(A)返回,我将转到活动(A)的同一个实例


因此本质上是A>B>C,然后当(D)启动时,堆栈是A>D。

使用
setFlags
方法将
标记活动\u CLEAR\u TOP
赋予此目的

这将检查堆栈,查看
MainActivity
的实例是否已存在,如果已存在,则会将该活动置于最前面并清除其上方的所有活动,而不是重新启动
MainActivity
并将其置于堆栈顶部

另一种方法是在每个活动中手动调用finish()。例如:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();
两种选择:

1) 使用
MainActivity
作为“调度程序”。当C想要启动D时,它应该这样做:

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.putExtra("launchD", true);
startActivity(intent);
此代码将清除
MainActivity
上的所有活动,并导致在
MainActivity
上调用
onNewIntent()

main活动中
,覆盖
onNewIntent()

MainActivity
现在将在清除堆栈后启动D。在D中按后退将返回到
main活动

2) 像往常一样从C启动D:

Intent intent = new Intent(this, D.class);
startActivity(intent);
此时,堆栈是A->B->C->D

在D中,覆盖
onBackPressed()

在这种情况下,在D中按BACK将导致D、C和B从堆栈中删除,用户将返回到
MainActivity


注意:组合使用标志
FLAG\u ACTIVITY\u CLEAR\u TOP
FLAG\u ACTIVITY\u SINGLE\u TOP
可确保重用
MainActivity
的现有实例。Android不会创建新实例。

如果活动a不被称为MainActivity怎么办。还有第二个解决方案,如果在启动activity之前我不想关闭中间活动,您不应该只手动选择几个要销毁的活动。无论如何,请尝试创建“activity”对象,然后从另一个活动调用finish()方法。如下所示
Intent intent = new Intent(this, D.class);
startActivity(intent);
@Override
public void onBackPressed() {
    Intent intent = new Intent(this, MainActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
}