FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 行为怪异

Posted

技术标签:

【中文标题】FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 行为怪异【英文标题】:FLAG_ACTIVITY_NEW_TASK and FLAG_ACTIVITY_CLEAR_TASK acts weird 【发布时间】:2016-03-05 13:20:13 【问题描述】:

我一直在测试意图标志,但我需要澄清一些事情。我的导航抽屉中有两个项目,单击时我会这样做,

Intent intent = new Intent(this, activityClazz);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);

哪些类是具有相同导航抽屉的活动。 -由于各种原因没有使用片段-。在这些活动中,我有打开相同活动但没有意图标志的按钮。我想做的是使用默认的 android 行为导航活动,但也根据导航项将它们堆叠在不同的堆栈中,例如选项卡的使用。

测试用例:

    startActivity 没有 clear-new 标志 带有 clear-new 标志的 startActivity 返回

我希望回到第一个活动,因为我用新任务启动了第二个活动,所以第一个应该留在第一个堆栈中)但我发现第一个已经销毁。

【问题讨论】:

如果您想保留一个单独的活动堆栈,您需要自己制作。 【参考方案1】:

第一个活动(没有标志开始的活动)被销毁,因为您的第二个活动的标志组合执行以下操作:

    FLAG_ACTIVITY_NEW_TASK:在新任务中启动活动,或者如果活动已经存在,则将其任务置于前台。在我们的例子中,它还不存在。如果您只使用此标志,那么您将拥有带有活动 1 的任务 1 和带有活动 2 的任务 2。如果您没有点击后退按钮,task2 和 activity 2 将被关闭,您会返回 task1 和 activity1。 FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TASK:clear task 标志现在强制如果一个任务被 new task 带到前面,那么它是第一个清洁(活动结束)。引用documentation:

如果在传递给 Context.startActivity() 的 Intent 中设置,此标志将导致与该活动关联的任何现有任务在活动启动之前被清除。也就是说,该活动成为一个空任务的新根,并且所有旧活动都已完成。这只能与 FLAG_ACTIVITY_NEW_TASK 结合使用。

结合起来,这意味着使用后退按钮可以将 task1 和 activity1 带到前面,但清除标志会立即完成 activity1。所以这就是为什么你遇到 activity1 已经完成的原因。

【讨论】:

那么有没有办法让 2 个堆栈保留在后堆栈中? 您可以将 FLAG_ACTIVITY_MULTIPLE_TASK 与 FLAG_ACTIVITY_NEW_TASK 一起使用以强制在新任务中启动活动,即使它是相同的活动。然后,您将有两个任务,每个任务都有一个活动实例。如果您现在继续在任一任务中打开活动,则每个任务都会有一个回栈,并且只有当您离开任务的最后一个活动时,整个任务才会完成并返回上一个任务。 android documentation 这里可能会有所帮助。

以上是关于FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 行为怪异的主要内容,如果未能解决你的问题,请参考以下文章

活动回栈 FLAG_ACTIVITY_NEW_TASK

FLAG_ACTIVITY_NEW_TASK 和 FLAG_ACTIVITY_CLEAR_TASK 行为怪异

在 Activity 上下文之外调用 startActivity() 需要 FLAG_ACTIVITY_NEW_TASK

Activity.finishAffinity() 与 Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK

Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK fla

Android: Activity启动模式 FLAG_ACTIVITY_NEW_TASK 详细探索