如何清除任务的后退栈并只保留新的活动?

6
我想在启动新的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.活动“ C”我希望保留它在历史记录(后退堆栈)中,如果用户导航到“ D”活动,但当用户移动到“ E”活动时,我希望将其删除。
到目前为止,我找不到这个问题的解决方案!如果有一些东西可以清除当前任务的后退堆栈,那么它将更容易!
我的最小SDK支持是5。
提前致谢。

2
可能是重复问题:https://dev59.com/62025IYBdhLWcg3wyZIn 还值得一看:http://developer.android.com/guide/components/tasks-and-back-stack.html#Clearing - jonvuri
同样类似于http://stackoverflow.com/questions/7121700/remove-all-activities-from-back-stack-while-calling-a-new-activity - speakingcode
1个回答

8
如果您使用的API级别是11或更高版本,您可以在意图中简单地添加FLAG_ACTIVITY_CLEAR_TASK,它将清除任务中的所有其他活动。
否则,这可能会有所帮助:在旧版SDK上清除完整的Android活动堆栈(缺少FLAG_ACTIVITY_CLEAR_TASK) 另一种方法是完成您不再希望用户返回的活动。例如,在移动到B之前调用ActivityA.finish(),该活动将从任务中删除。
当您启动活动D时,您可以从C使用startActivityForResult()启动它,并在关闭D时将结果发送给C,然后在导航到E之前完成活动C。

非常感谢您的回复,我采用了第一种方法,在启动另一个活动之前调用了“finish()”函数,效果很好。但是对于第二部分,活动“C”启动活动“D”,并且活动“D”打开活动“E”,而不是“C”。因此,我能否将对活动“C”的引用传递给活动“D”,以便在启动活动“E”之前销毁它? - Elkfrawy
1
你不应该传递一个引用。我的意思是,你可以使用startActivityForResult()方法从“C”启动活动“D”。当你决定去“E”时,在活动“D”中设置结果,然后结束它,这将把你发送到“C”,在那里验证结果,并将用户重定向到“E”,同时结束活动“C”。有点复杂,希望你能理解。 - kleinsenberg
是的,这很清楚,我应用了它,它按照我的意愿工作了。非常感谢你的帮助。 - Elkfrawy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接