如何复制Android Tasks和Backstack文档中的示例?

时间:2019-03-20 03:18:53

标签: android android-intent

我正在尝试通过阅读官方文档https://developer.android.com/guide/components/activities/tasks-and-back-stack

来了解Android Tasks和Back堆栈

关于文档,我有几个问题。

问题1 :在图4中。在文档中,有2个任务-一个前台任务和一个后台任务,如果Activity Y是用a声明的,则后台任务包含Activity Y和X。 singleTask启动模式下,如何在活动X的顶部创建活动Y的任务?

对于其他问题,我准备了一个简单的项目-2个活动,A和B。在这两个活动上,我都有2个按钮:

  • 按钮A打开活动A
  • 按钮B打开活动B

活动A是主要(发起人)活动。

问题2 :该文档说,使用意图标志FLAG_ACTIVITY_NEW_TASK会产生与使用singleTask启动器模式相同的行为:

  

这会产生与上一节中讨论的“ singleTask” launchMode值相同的行为。

这不是我从测试应用程序中看到的内容。如果活动B的启动器模式设置为singleTask,并且如果我的后退堆栈是A-> B-> A-> A,那么如果我打开B,则后退堆栈将类似于A-> B(它将弹出最后2个)。我猜想其背后的原因是创建的任务:发送启动程序意图后,它在新任务中打开了活动A(将其称为任务1),当我打开B时,便在任务2中将其打开(因为它具有singleTask启动模式),那么2 A活动也在任务2中打开。再次打开B后,Android发现一个已经具有B活动的任务(任务2),并将其带到最前面,弹出2 As。

但是,使用FLAG_ACTIVITY_NEW_TASK而不是singleTask不会产生相同的行为,它只是在所有其他内容之上打开B。文档是否错误,或者我做错了什么?

问题3:最后的示例说:

  

只有当活动具有ACTION_MAIN和CATEGORY_LAUNCHER过滤器时,才应使用将活动标记为始终启动任务的两种启动模式。例如,想象一下,如果缺少过滤器会发生什么:一个意图启动一个“ singleTask”活动,启动一个新任务,并且用户花一些时间在该任务上工作。然后,用户按下“主页”按钮。现在,该任务已发送到后台,并且不可见。现在,用户无法返回任务,因为它没有在应用启动器中显示。

如何重现?在上一个示例中,我在一个新任务中打开了活动B,但是如果再次按下主页按钮和启动器图标,我将返回到活动B。因此,即使我使用的是singleTask启动器模式,我仍然可以通过使用启动器图标或从最近的应用程序列表中选择它来返回该任务。

很有可能我在这里做错了什么,并且没有生成新任务,有没有办法查看特定应用程序的所有任务和活动?

谢谢。

1 个答案:

答案 0 :(得分:0)

今天,我花了更多时间尝试了解这里的情况,我认为我已经找到了答案。我意识到在我的示例中没有任何东西可以创建新任务。任务在Recent screens (后台应用程序)中可见-至少在Android 5+上可见。

因此,应该回答的第一个问题是:为什么创建活动B不能创建新任务?

这是因为生成新任务与taskAffinity属性并驾齐驱。如果未指定此属性,则活动将具有默认的taskAffinity,即应用程序的程序包名称。当您使用singleTask启动器模式打开活动时,Android将查找具有相同关联性的任务(任务的关联性由其根活动关联性定义),如果找到一个,它将向该任务添加您的活动。因为我没有指定关联性,所以android假设我想以与应用程序包相等的关联性将活动添加到任务中,并且它根本没有创建新任务。它只是将活动添加到现有任务中。

话虽这么说,FLAG_ACTIVITY_NEW_TASKsingleTask有很大的不同,尽管有时它们会产生相同的行为。如果您使用FLAG_ACTIVITY_NEW_TASK标志触发了一个试图打开活动A的意图而未指定活动的taskAffinity,则通常只会在当前任务之上添加一个活动。 (这仍然让我感到困惑,我希望仅当该活动不在堆栈中时才打开该活动;如果是,则它什么都不做。)

使用singleTask模式打开不带此标志的相同活动,将不会再次创建新任务,而是:

  1. 如果活动不在堆栈中,则将其添加到顶部(这是问题1的答案)
  2. 销毁所有活动,如果活动已在堆栈中,则调用onNewIntent(我认为branch.io使用此方法来处理深层链接-对我来说似乎确实很hack,但是...)

另一方面,如果您为活动指定taskAffinity,则:

  • 如果设置了singleTask模式,则android将以这种相似性搜索任务,如果存在,它将

    1. 如果活动不在任务的堆栈上,则将您的活动添加到顶部
    2. 在活动之上销毁所有活动,如果活动位于后堆栈中,则调用onNewIntent

如果该任务不存在,它将创建一个新任务并将您的活动添加为root。

  • 如果在意图中设置了FLAG_ACTIVITY_NEW_TASK标志,则android将搜索具有指定关联性的任务,如果找到了该任务,它将仅将该任务带到前台,而不会破坏堆栈或调用onNewIntent(我测试了该活动是否在后堆栈中,我想如果该活动不在后堆栈中,则会将其推送到任务的堆栈中)

因此,要回答问题2。标志FLAG_ACTIVITY_NEW_TASK和启动器模式singleTask是不同的。我想可以通过再使用两个标志FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP来实现类似的行为。

我认为文档中有关问题3的示例与旧版Android(低于5.0)相关。 Recent Screens中没有显示其他任务-这是文档:https://developer.android.com/guide/components/activities/recents