假设他们的启动模式是标准的(不使用任何意图标志)。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
(默认情况下,如果它们属于同一个应用程序),那么活动将在与活动相同的任务中创建(即:它将表现得好像活动有)。但是,如果活动和活动有不同的,那么活动taskAffinity
1
2
1
2
launchMode="standard"
1
2
taskAffinity
2
将作为新任务中的根活动启动。现在您将有 3 个任务,如下所示: Task1 包含x->y
、 Task2 包含1
和 Task3 包含2
。
如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 或 1 -> 2?
如上所述,这取决于taskAffinity
. 如果taskAffinity
Activity1
和2
相同,从主屏幕启动应用程序 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
)的任务,因为taskAffinity
trumps 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 时,这将完成活动taskAffinity
taskAffinity
2
1->2->3
2
2
2
这将完成第三个任务,将用户返回到顶部包含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
并且在后台。
笔记
我意识到这很复杂。我的回答是出自我的脑海,我并没有尝试实际实现所有这些组合并进行检查(但是,我过去已经实现了许多这样的案例,并且我确实知道它是如何工作的)。原因是您所描述的大部分内容在现实世界中都不会完成,因此这些示例只是理论上的,并不实用。在现实生活中,您几乎不需要使用singleTask
或singleInstance
启动模式,除非您正在构建自己的主屏幕替换,或者您需要仔细控制应用程序在其他应用程序启动时的行为方式。在大多数情况下,您永远不会拥有多个启动模式为singleTask
或的活动singleInstance
。
如果您使用singleInstance
或者singleTask
您需要了解其taskAffinity
工作原理,并且您还需要确保声明为“singleTask”或“singleInstance”的每个活动都有不同的应用程序图标(可能还有应用程序标签)。否则,由于最近任务列表中显示这些任务的方式,用户将无法返回到正确的任务。