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

时间:2016-11-12 21:06:55

标签: android android-activity

我正在创建一个具有MainActivity(A)的应用程序,这是一个导航活动。该活动可以启动活动(B),然后我可以导航到活动(C)。然后,当我导航到活动(D)时,我想完成除MainActivity(A)之外的所有活动。所以基本上如果我从活动(A)回来,我将转到相同的活动实例(A)。

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

2 个答案:

答案 0 :(得分:0)

使用setFlags方法将此Intent设为FLAG_ACTIVITY_CLEAR_TOP

这将检查您的堆栈以查看MainActivity的实例是否已经存在,如果它已经存在,那么将该活动置于前面并清除其上方的所有活动而不是重新启动{{1把它放在堆栈顶部。

其他方式是在每个活动中手动调用finish()。赞:

MainActivity

答案 1 :(得分:0)

两个选项:

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之上的所有活动,并导致onNewIntent()上的MainActivity被调用。

MainActivity中,覆盖onNewIntent()

@Override
protected void onNewIntent(Intent intent) {
    if (intent.hasExtra("launchD")) {
        // Need to launch Activity D
        Intent launchIntent = new Intent(this, D.class);
        startActivity(launchIntent);
    }
}
在堆栈清除后,

MainActivity现在将启动D.在D中按BACK将返回MainActivity

2)像往常一样从C发射D:

Intent intent = new Intent(this, D.class);
startActivity(intent);

此时,堆栈是A-> B-> C-> D

在D中,覆盖onBackPressed()

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

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

注意:使用标记FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP的组合可确保重用MainActivity的现有实例。 Android无法创建新实例。