【问题标题】:How to clear backstack of a task and leave only the new activity?如何清除任务的后台堆栈并仅保留新活动?
【发布时间】:2012-10-14 17:09:25
【问题描述】:

我想在启动新的 Activity 意图时清除后台堆栈。

我的问题的确切情况如下: 我有这样的活动 A > B > C > D > E “A”是注册活动,“B”是确认注册活动。我希望当用户开始活动“B”时他不能再回到活动“A”,当用户到达活动“C”时,活动“A”和“B”都将没用,我不需要用户不再回到他们身边。

此外,当用户从“C”移动到活动“D”时,他可以返回到“C”,但如果他进一步移动到“E”活动,他将无法返回到之前的任何“C”或“D”活动。

经过大量研究,我得到的最好的方法是使用标志:FLAG_ACTIVITY_NO_HISTORY,但是对于我的情况有两个问题:

  1. 在活动“A”中,如果用户离开我的应用程序(例如转到主屏幕),它会破坏该活动,因此用户输入的所有信息都会丢失!
  2. 如果用户导航到“D”活动但当用户移动到“E”活动时我想将其删除,我希望将其保留在历史记录中(backstack)。

目前我还没有找到解决这个问题的方法,我认为如果有一些东西可以清除当前任务的后台堆栈会更容易!

我的最低 SDK 支持是 5。

提前致谢。

【问题讨论】:

标签: android


【解决方案1】:

如果您使用的是 API 级别 11 或更高级别,您只需在您的意图上添加 FLAG_ACTIVITY_CLEAR_TASK,这将清除您任务中的所有其他活动。

否则,这可能会有所帮助: Clearing the full Android activity stack on older SDKs (that lack FLAG_ACTIVITY_CLEAR_TASK)

另一种方法是让您完成您不再希望用户能够返回的活动。 例如,如果您在移动到 B 之前调用 ActivityA.finish(),则该活动将从任务中删除。

当你启动活动 D 时,你可以使用 C 中的 startActivityForResult() 来启动它,当你关闭 D 时,将结果发送到 C,然后在导航到 E 之前完成活动 C。

【讨论】:

  • 非常感谢您的回复,我应用了第一种方法,在启动另一种方法之前在 Activity 上调用“finish()”函数,效果很好。但对于第二部分,活动“C”启动活动“D”,活动“E”由活动“D”而不是“C”打开。那么我可以将对活动“C”的引用传递给活动“D”,以便在开始活动“E”之前将其销毁吗?
  • 你不应该传递引用。我想说的是,您可以使用 startActivityForResult() 方法从“C”开始活动“D”。当您决定去“E”时,在活动“D”中设置结果,然后完成它,这会将您发送到“C”,在那里您验证结果,并将用户重定向到“E”,也完成活动“C”。解释起来有点复杂,希望你能明白。
  • 是的,这很清楚,我应用了它,它按我的意愿工作。非常感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2011-08-13
相关资源
最近更新 更多