如何使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 清除 Activity Stack?

新手上路,请多包涵

我已经阅读了几篇关于使用它的帖子,但必须遗漏一些东西,因为它对我不起作用。我的活动 A 在清单中有 launchmode=“singleTop” 。它以 launchmode=“singleInstance” 启动活动 B。 Activity B 打开一个浏览器并收到一个返回的意图,这就是它是 singleInstance 的原因。我正在尝试覆盖后退按钮,以便将用户发送回活动 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,Browser,B

我希望此代码将堆栈更改为… A … 以便再次按下返回将用户带回主屏幕。

相反,它似乎将堆栈更改为… A,B,Browser,B,A …就好像那些标志不存在一样。

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

我错过了什么?

原文由 piusvelte 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 805
2 个回答

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

它隐藏在文档中,但是您必须将 launchModeActivity --- 更改为 standard 以外的任何内容。否则它将被销毁并重新创建,而不是被重置到顶部。

原文由 ScouseChris 发布,翻译遵循 CC BY-SA 3.0 许可协议

我已经开始活动 A->B->C->D。当在 Activity DI 上按下后退按钮时,我想转到 Activity A。因为 A 是我的起点,因此已经在堆栈中,A 顶部的所有 Activity 都被清除,你不能从 A 返回到任何其他 Activity .

这实际上适用于我的代码:

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

原文由 Jesper Bischoff-Jensen 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题