我正在创建一个具有MainActivity(A)的应用程序,这是一个导航活动。该活动可以启动活动(B),然后我可以导航到活动(C)。然后,当我导航到活动(D)时,我想完成除MainActivity(A)之外的所有活动。所以基本上如果我从活动(A)回来,我将转到相同的活动实例(A)。
因此基本上A> B> C然后当启动(D)时,堆栈是A> D.
答案 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_TOP
和FLAG_ACTIVITY_SINGLE_TOP
的组合可确保重用MainActivity
的现有实例。 Android无法创建新实例。