FLAG_ACTIVITY_NEW_TASK和FLAG_ACTIVITY_CLEAR_TASK的行为很奇怪

3

我一直在测试意图标志,但我需要澄清一些事情。我的导航抽屉中有两个项目,当我点击时执行以下操作:

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

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

测试用例:

  1. 启动不带清除-新标志的活动
  2. 启动带有清除-新标志的活动
  3. 返回

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


如果您想保留一个单独的活动堆栈,您需要自己创建它。 - Nanoc
1个回答

4
首个活动(未使用标志启动的那个)已被销毁,因为您第二个活动的标志组合执行以下操作:
  1. FLAG_ACTIVITY_NEW_TASK:在新任务中启动活动,或者如果该活动已存在,则将其任务带到前台。在我们的情况下,它尚不存在。如果您仅使用此标志,则会有task1和activity1以及task2和activity two。如果您没有点击返回按钮,则task2和activity 2会被关闭,您将返回task1和activity1。
  2. FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TASK: "清除任务"标志现在要求如果通过"新任务"将任务带到前台,则首先需要清理任务(即完成活动)。引用文档:

如果在传递给Context.startActivity()的Intent中设置了此标志,则在启动Activity之前,将清除与Activity关联的任何现有任务。也就是说,Activity成为否则为空的任务的新根,并且任何旧的Activity都将结束。这只能与FLAG_ACTIVITY_NEW_TASK一起使用。

结合起来,这意味着,通过点击返回按钮,您将task1和activity1带到前台,但是清除标志立即结束了activity1。因此,您遇到的问题是activity1已经被完成了。


有没有办法在后台保留两个堆栈? - Barışcan Kayaoğlu
您可以使用FLAG_ACTIVITY_MULTIPLE_TASK和FLAG_ACTIVITY_NEW_TASK一起,以便在新任务中启动活动,即使它是相同的活动也是如此。然后,您将拥有两个任务,每个任务都有一个活动实例。如果您现在继续在任一任务中打开活动,则每个任务都会有一个返回堆栈,只有当您离开任务的最后一个活动时,整个任务才会完成,并返回到上一个任务。这里的Android文档可能会有所帮助。 - user3363866

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