8

我已经阅读了 Google Android 开发者页面,但是任务的概念(http://developer.android.com/guide/components/tasks-and-back-stack.html)真的让我很困惑。

在我读到 SingleTask 和 SingleInstance 之后,我变得更加困惑。

我想通过例子提出一些问题,希望我能从这些问题中得到更好的理解:

假设我有 2 个应用程序 A 和 B,A 有 x、y、z 活动;B有1、2、3个活动:

假设他们的启动模式是标准的(不使用任何意图标志)。x 是应用 A 的 Main Activity;1 是应用 B 的主要活动。

1)启动app A,然后x-> y -> 1,按home键,再次启动app A,我们会看到activity y还是1?

2) 启动应用程序 A 然后 x -> 1 -> y -> 2 -> z -> 3,按主页按钮,启动应用程序 A,它将包含所有活动 (x -> 1 -> y -> 2 -> z -> 3),还是只包含 x -> y -> z?如果我们现在启动应用程序 B 怎么样?应用 B 将包含哪些活动?

现在假设活动 1、2、3 是 SingleTask;x,y,z 仍然是标准的

3) 启动应用程序 A,然后 x -> y -> 1 -> 2,按主页按钮,启动应用程序 A,它将仅包含 x -> y 还是包含 x -> y -> 1 -> 2?如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 或 1 -> 2?

4)启动app B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?

5) 启动应用程序 B,然后 1 -> 2 -> 3,按主页按钮,现在启动应用程序 A,然后 x -> y -> 2 然后按返回按钮放下 2. 现在启动应用程序 B,它包含哪些活动?仅 1 -> 3 还是 1 -> 2 -> 3?

感谢任何人的回复和帮助!

4

1 回答 1

16

假设他们的启动模式是标准的(不使用任何意图标志)。x 是应用 A 的 Main Activity;1 是应用 B 的主要活动。

1)启动app A,然后x-> y -> 1,按home键,再次启动app A,我们会看到activity y还是1?

您将看到活动1。您有一个任务,其中包含该任务的x->y->1活动1堆栈顶部的活动。当您按 HOME 时,此任务将移至后台。当您再次启动应用程序时,Android 会找到任务堆栈并将其(完整)带回前台,向您显示堆栈上的顶部活动(在本例中1)。

2) 启动应用程序 A 然后 x -> 1 -> y -> 2 -> z -> 3,按主页按钮,启动应用程序 A,它将包含所有活动 (x -> 1 -> y -> 2 -> z -> 3),还是只包含 x -> y -> z?

如上所述,您有一个任务。当您按 HOME 时,任务包含x->1->y->2->z->3并移至后台。当您再次启动 App A 时,任务会被提前(完整)并且您会3在顶部看到活动。

如果我们现在启动应用程序 B 怎么样?应用 B 将包含哪些活动?

好吧,这样的问题是不正确的。您真正想知道的是“此任务将包含哪些活动?”,但答案如下:

如果您从主屏幕启动 App B,您将开始一个新任务。此任务将包含一个活动,即1. 此任务与其他任务(仍在后台)无关。后台任务包含来自 2 个不同应用程序的活动这一事实无关紧要。

现在假设活动 1、2、3 是 SingleTask;x,y,z 仍然是标准:

3) 启动应用程序 A,然后 x -> y -> 1 -> 2,按主页按钮,启动应用程序 A,它将仅包含 x -> y 还是包含 x -> y -> 1 -> 2?

在活动y启动活动1时,这将创建一个新任务。因此,您将拥有一个包含活动x->y的任务和第二个包含1. 当活动1启动活动2时,会发生什么不仅仅取决于launchMode活动。即使2声明了活动launchMode="singleTask",如果taskAffinity活动的活动与活动的活动相同2(默认情况下,如果它们属于同一个应用程序),那么活动将在与活动相同的任务中创建(即:它将表现得好像活动有)。但是,如果活动和活动有不同的,那么活动taskAffinity1212launchMode="standard"12taskAffinity2将作为新任务中的根活动启动。现在您将有 3 个任务,如下所示: Task1 包含x->y、 Task2 包含1和 Task3 包含2

如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 或 1 -> 2?

如上所述,这取决于taskAffinity. 如果taskAffinityActivity12相同,从主屏幕启动应用程序 B 会将包含的任务1->2带到前台。如果taskAffinity活动的不同,从主屏幕启动应用程序 B 会将包含活动的任务1带到前台。

4)启动app B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?

2不会,3也不会被破坏。假设1,2并且3所有人都拥有launchMode="singleTask"它(再次)取决于taskAffinity设置。假设所有活动都相同taskAffinity,那么您将有一个包含1->2->3->1(您将有 2 个活动实例1)的任务,因为taskAffinitytrumps launchMode

如果所有活动都有不同taskAffinity的 ,那么之后1->2->3您将有 3 个单独的任务,每个任务包含一个活动。然后,当活动3启动活动时1,这只会将包含活动的任务1带到前台,不会创建活动的新实例1

5) 启动应用程序 B,然后 1 -> 2 -> 3,按主页按钮,现在启动应用程序 A,然后 x -> y -> 2 然后按返回按钮放下 2. 现在启动应用程序 B,它包含哪些活动?仅 1 -> 3 还是 1 -> 2 -> 3?

同样,这取决于taskAffinity. 如果应用 B 的所有活动都相同,taskAffinity那么之后1->2->3您将完成一项任务。用户按下 HOME 按钮,此任务将进入后台。现在用户启动应用程序 A 创建一个新任务。在x->y第二个任务包含这两个活动之后。现在活动y开始活动2。由于此活动与任务中的其他活动(它们都具有App A)具有launchMode="singleTask"并且不同于任务中的其他活动,因此Android 将创建一个以活动为根的新任务。Android 无法使用现有任务包含,因为该任务不包含作为其根的活动。当用户按 BACK in 时,这将完成活动taskAffinitytaskAffinity21->2->3222这将完成第三个任务,将用户返回到顶部包含x->y活动的第二个任务。y现在按下 HOME 并启动应用程序 B 会将现有的第一个任务包含1->2->3在前台。

但是,如果应用程序 B 的所有活动都有不同的taskAffinity,那么之后1->2->3您将有 3 个单独的任务,每个任务都包含一个活动。用户按下 HOME 并启动 App A 创建一个新任务(现在您有 4 个任务)。在x->y第四个任务包含这两个活动之后。现在活动y开始活动2。Android 只是将包含活动的任务2带到前台。用户按下 BACK 按钮,这将完成 Activity2和它所在的任务(因为该任务现在是空的),将用户返回到上一个任务,该任务是x->y来自应用程序 A 的任务。从主屏幕启动应用程序 B 只会带来包含1前台活动的任务。您现在有 3 个任务:Task1 包含活动1并且在前台,Task2 包含活动3并且在后台,Task3 包含x->y并且在后台。

笔记

我意识到这很复杂。我的回答是出自我的脑海,我并没有尝试实际实现所有这些组合并进行检查(但是,我过去已经实现了许多这样的案例,并且我确实知道它是如何工作的)。原因是您所描述的大部分内容在现实世界中都不会完成,因此这些示例只是理论上的,并不实用。在现实生活中,您几乎不需要使用singleTasksingleInstance启动模式,除非您正在构建自己的主屏幕替换,或者您需要仔细控制应用程序在其他应用程序启动时的行为方式。在大多数情况下,您永远不会拥有多个启动模式为singleTask或的活动singleInstance

如果您使用singleInstance或者singleTask您需要了解其taskAffinity工作原理,并且您还需要确保声明为“singleTask”或“singleInstance”的每个活动都有不同的应用程序图标(可能还有应用程序标签)。否则,由于最近任务列表中显示这些任务的方式,用户将无法返回到正确的任务。

于 2013-09-04T19:25:26.183 回答