假设他们的启动模式是标准的(不使用任何意图
旗帜)。 x 是应用程序 A 的 Main Activity; 1 是应用程序 B 的主要 Activity。
1)启动应用程序A,然后x-> y -> 1,按home按钮,启动应用程序A
再次,我们将看到活动 y 或 1?
你会看到活动1
。您有一个任务,其中包含x->y->1
有活动1
在该任务的活动堆栈的顶部。当您按 HOME 时,此任务将移至后台。当您再次启动应用程序时,Android 会找到任务堆栈并将其(完整地)带回前台,向您显示堆栈上的顶部活动(在本例中)1
).
2)启动应用程序A,然后x -> 1 -> y -> 2 -> z -> 3,按home按钮,
启动应用程序 A,它将包含所有活动 (x -> 1 -> y -> 2 ->
z -> 3),或者仅包含 x -> y -> z?
如上所述,您有一个任务。当您按 HOME 时,任务包含x->1->y->2->z->3
并移至后台。当您再次启动应用程序 A 时,任务将被提前(完整),您将看到活动3
on top.
如果我们启动应用程序 B 怎么样?
现在?应用程序 B 将包含哪些活动?
嗯,这样的问题是不正确的。你真正想知道的是“这会发生什么活动?task包含?”,但答案是:
如果从主屏幕启动应用程序 B,您将开始一个新任务。该任务将包含一个活动,即1
。此任务与其他任务(仍在后台)无关。后台任务包含来自 2 个不同应用程序的活动这一事实是无关紧要的。
现在假设活动 1、2、3 是 SingleTask; x,y,z 仍为标准:
3)启动应用程序A,然后x -> y -> 1 -> 2,按home按钮,启动应用程序
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
had launchMode="standard"
)。然而,如果活动1
和活动2
有不同的taskAffinity
,然后活动2
将作为新任务中的根活动启动。现在您将有 3 个任务,如下所示: Task1 包含x->y
,任务2包含1
任务 3 包含2
.
如果我们现在启动应用程序 B 怎么样?应用程序 B 将仅包含 1 还是 1 -> 2?
如上所述,这取决于taskAffinity
。如果taskAffinity
活动的1
and 2
是相同的,从主屏幕启动应用程序 B 将带来包含以下内容的任务1->2
到前台。如果taskAffinity
活动的不同,从主屏幕启动应用程序 B 将带来包含活动的任务1
到前台。
4)启动应用B,然后1 -> 2 -> 3 -> 1,2和3会被销毁吗?
No. 2
and 3
不会被破坏。
假如说1
, 2
and 3
都有launchMode="singleTask"
那么它(再次)取决于taskAffinity
设置。假设所有活动都有相同的taskAffinity
,那么你将有一个任务包含1->2->3->1
(您将有 2 个活动实例1
) 因为taskAffinity
trumps launchMode
.
如果所有活动都有不同taskAffinity
, 然后1->2->3
您将有 3 个独立的任务,每个任务包含一个活动。然后,当活动3
开始活动1
,这只会带来包含活动的任务1
到前台和不会创建新的 Activity 实例1
.
5) 启动应用程序B,然后1 -> 2 -> 3,按home按钮,启动应用程序A
现在,然后 x -> y -> 2 然后按后退按钮放下 2。启动应用程序 B
现在,它包含哪些活动?仅 1 -> 3 还是 1 -> 2 -> 3?
再次强调,这取决于taskAffinity
。如果应用程序 B 的所有 Activity 都具有相同的taskAffinity
然后1->2->3
你将有一项任务。用户按下 HOME 按钮此任务将转到后台。现在用户启动应用程序 A 创建一个新任务。后x->y
第二个任务包含这两项活动。现在活动y
开始活动2
。由于本次活动已launchMode="singleTask"
并且有不同的taskAffinity
来自任务中的其他活动(它们都有taskAffinity
App A), Android 将创建一个带有 Activity 的新任务2
作为根。 Android 无法使用包含以下内容的现有任务1->2->3
因为该任务不包含活动2
作为它的根。当用户按 BACK 时2
,这将完成活动2
这将完成第三个任务,将用户返回到第二个任务,其中包含x->y
有活动y
在上面。现在按 HOME 并启动应用程序 B 将带来现有的第一个任务,其中包含1->2->3
到前台。
但是,如果应用程序 B 的所有 Activity 都有不同的taskAffinity
, 然后1->2->3
您将有 3 个独立的任务,每个任务包含一个活动。用户按 HOME 并启动应用程序 A 创建一个新任务(现在您有 4 个任务)。后x->y
第四个任务包含这两项活动。现在活动y
开始活动2
。 Android只是带来包含activity的任务2
到前台。用户按下“后退”按钮,这完成了活动2
以及它所在的任务(因为该任务现在是空的),将用户返回到上一个任务,该任务包含x->y
从应用程序 A。从主屏幕启动应用程序 B 只会带来包含活动的任务1
到前台。您现在有 3 个任务: Task1 包含活动1
并且位于前台,Task2 包含活动3
并且在后台,Task3 包含x->y
并且在后台。
NOTES
我意识到这很复杂。我的答案来自我的头脑,我没有尝试实际实现所有这些组合并进行检查(但是,我过去已经实现了许多这样的案例,并且我确实知道它是如何工作的)。原因是您所描述的大部分内容在现实世界中都不会完成,因此这些示例仅是理论而非实践。在现实生活中你几乎不需要使用singleTask
or singleInstance
启动模式,除非您正在构建自己的主屏幕替代品或者您需要仔细控制应用程序的行为方式当它被其他应用程序启动时。在大多数情况下,您永远不会有超过一个启动模式为singleTask
or singleInstance
.
如果你使用singleInstance
or singleTask
你需要知道如何taskAffinity
有效,您还需要确保声明为“singleTask”或“singleInstance”的每个活动都有不同的应用程序图标(可能还有应用程序标签)。否则,由于最近任务列表中的显示方式,用户将无法返回到正确的任务。