如何使用Intent.FLAG_ACTIVITY_CLEAR_TOP清除活动堆栈?

我已经阅读了几篇关于使用它的帖子,但必须缺少一些东西,因为它对我不起作用。我的活动 A 在清单中具有 launchmode=“singleTop”。它启动活动 B,启动模式 =“单实例”。活动 B 打开浏览器并接收回意图,这就是它是单实例的原因。我正在尝试覆盖后退按钮,以便将用户发送回活动 A,然后可以按“后退”离开活动,而不是再次返回到活动 B。

// activity B
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
 if (android.os.Build.VERSION.SDK_INT < android.os.Build.VERSION_CODES.ECLAIR
  && keyCode == KeyEvent.KEYCODE_BACK
  && event.getRepeatCount() == 0) onBackPressed();
 return super.onKeyDown(keyCode, event);
}
@Override
public void onBackPressed() {
 startActivity(new Intent(this, UI.class)
 .setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK));
 return;
}

从浏览器返回后,堆栈是...A,B,浏览器,B

我希望此代码将堆栈更改为...一个。。。因此,再次按后退会将用户带回主屏幕。

相反,它似乎将堆栈更改为...A,B,浏览器,B,A ...好像那些标志不在那里。

我尝试在启动活动后在活动B中调用finish(),但随后后退按钮再次将我带回浏览器!

我错过了什么?


答案 1

我已经启动了活动A->B->C->D。当按下活动 D 上的后退按钮时,我想转到活动 A。由于 A 是我的起点,因此已经在堆栈上,因此 A 顶部的所有活动都被清除,您无法从 A 返回到任何其他活动。

这实际上在我的代码中起作用:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        Intent a = new Intent(this,A.class);
        a.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}       

答案 2

@bitestar有正确的解决方案,但还有一步:

它被隐藏在文档中,但是您必须将 的 更改为 除 .否则,它将被销毁并重新创建,而不是重置到顶部。launchModeActivitystandard


推荐