Android - 清除导航回栈

Posted

技术标签:

【中文标题】Android - 清除导航回栈【英文标题】:Android - Clearing Navigation Backstack 【发布时间】:2015-06-26 02:06:34 【问题描述】:

我有 4 页。

从 page_1 > page_2 > page_3 > page_4。

一旦用户到达 page_3 并单击一个按钮,它就会导航到 page_4。单击按钮后,我想清除所有导航历史记录,因此当用户返回 page_4 时,应用程序退出而不是返回 page_3。

我试过了:

    Intent intent = new Intent(this, page_4.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
    startActivity(intent);
    finish();

但是什么也没发生。我仍然可以返回 page_3、page_2 等。我该如何做到这一点,以便当用户单击 page_3 上的按钮时,他会转到 page_4,并且从 page_4 开始不应该有任何导航历史记录?

【问题讨论】:

【参考方案1】:

我不确定这些方法是否适合您。第一种方法是从page_3转到page_4时加上FLAG_ACTIVITY_TASK_ON_HOME

Intent intent = new Intent(this, page_4.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME);
startActivity(intent);

因此,一旦您在 page_4 中按下 BACK 按钮,它会首先将您引导至 HOME 活动(MainActivity),然后您可以再次按下 BACK 按钮以退出该活动。

来自文档:

如果在传递给Context.startActivity() 的 Intent 中设置,此标志将导致将新启动的任务放置在当前主活动任务(如果有的话)之上。也就是说,即使这不是他们看到的最后一个活动,从任务中按回总是会让用户回到家中。这只能与FLAG_ACTIVITY_NEW_TASK结合使用。

第二种方法是,在清单中的活动中设置android:noHistory="true"。将此属性应用于 page_1 到 page_4。但是这种方法有两个缺点。首先,您的活动完全没有回栈。第二,您使用此属性设置的活动会在您按下 HOME 按钮或接到来电时被销毁。我没找到这个话题,请CMIIW。

【讨论】:

【参考方案2】:

对于所有其他活动,例如 page_3、page_2、page_1,

使用 FLAG_ACTIVITY_NO_HISTORY(如果设置,新活动不会保存在历史堆栈中。):

intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);

【讨论】:

【参考方案3】:

尝试设置 Intent.FLAG_ACTIVITY_NO_HISTORY 和 Intent.FLAG_ACTIVITY_TASK_ON_HOME

来自文档 Intent.FLAG_ACTIVITY_NO_HISTORY

如果设置,新活动不会保存在历史堆栈中。立刻 用户离开它,活动就完成了。这可能 也可以使用 noHistory 属性设置。

Intent.FLAG_ACTIVITY_TASK_ON_HOME

如果在传递给的 Intent 中设置 Context.startActivity(),这个标志会导致一个新的启动任务 放置在当前家庭活动任务之上(如果有 一)。也就是说,从任务中按回总是会返回用户 回家,即使那不是他们看到的最后一次活动。这只能 与 FLAG_ACTIVITY_NEW_TASK 结合使用。

【讨论】:

以上是关于Android - 清除导航回栈的主要内容,如果未能解决你的问题,请参考以下文章

使用片段清除回栈

Android Fragment 回栈的问题

如何在 Android 应用程序中查找回栈活动?

图片模式下 Android O 图片的任务列表和回栈

关于android导航架构组件的问题

Android 深度链接 - 回栈