Assume that their launch mode are Standard (Not using any intent
flag). And x is Main Activity of app A; 1 is Main Activity of app B.
1) Launch app A, then x-> y -> 1, press home button, launch app A
again, we will see activity y or 1?
您将看到活动1.您有一个任务包含x-> y-> 1,活动1位于该任务的活动堆栈顶部.按HOME时,此任务将移至后台.当您再次启动应用程序时,Android会找到任务堆栈并将其(完整)带回前台,向您显示堆栈中的顶级活动(在本例中为1).
2) Launch app A then x -> 1 -> y -> 2 -> z -> 3, press home button,
launch app A, it will contain all the activities (x -> 1 -> y -> 2 ->
z -> 3), or it contains x -> y -> z only?
如上所述,您只有一个任务.当您按HOME时,任务包含x-> 1-> y-> 2-> z-> 3并移动到后台.当您再次启动App A时,任务将被提前(完整),您将在顶部看到活动3.
How about if we launch app B
now? What activities will app B contain?
那么,这样的问题是不正确的.你真正想知道的是“这项任务包含哪些活动?”,但这里是答案:
如果从HOME屏幕启动App B,则将启动新任务.此任务将包含单个活动,即1.此任务与其他任务(仍在后台)无关.后台任务包含来自2个不同应用程序的活动这一事实无关紧要.
Now let’s say activities 1, 2, 3 are SingleTask; x,y,z still Standard:
3) Launch app A, then x -> y -> 1 -> 2, press home button, launch app
A, it will contain x -> y only or it contains x -> y -> 1 -> 2?
在活动y启动活动1时,这将创建一个新任务.因此,您将拥有一个包含活动x-> y的任务和一个包含1的第二个任务.当活动1启动活动2时,所发生的事情不仅仅取决于活动的launchMode.即使活动2被声明为launchMode =“singleTask”,如果活动2的taskAffinity与活动1的taskAffinity相同(默认情况下,如果它们属于同一个应用程序),则将创建活动2在与活动1相同的任务中(即:它的行为就像活动2具有launchMode =“standard”).但是,如果活动1和活动2具有不同的taskAffinity,则活动2将作为新任务中的根活动启动.现在你将有3个任务,如下所示:Task1包含x-> y,Task2包含1,Task3包含2.
How about if we launch app B now? app B will contain 1 only or 1 -> 2?
如上所述,这取决于taskAffinity.如果活动1和2的taskAffinity相同,则从HOME屏幕启动应用程序B将使包含1-> 2的任务进入前台.如果活动的taskAffinity不同,则从HOME屏幕启动应用程序B会将包含活动1的任务带到前台.
4) Launch app B, then 1 -> 2 -> 3 -> 1, will 2 and 3 be destroyed?
2号和3号不会被销毁.
假设1,2和3都具有launchMode =“singleTask”,那么它(再次)取决于taskAffinity设置.假设所有活动都具有相同的taskAffinity,那么您将拥有一个包含1-> 2-> 3-> 1的任务(您将拥有2个活动1的实例),因为taskAffinity胜过launchMode.
如果所有活动都有不同的taskAffinity,那么在1> 2-> 3之后,您将拥有3个单独的任务,每个任务包含一个活动.然后,当活动3开始活动1时,这只会将包含活动1的任务带到前台,并且不会创建活动1的新实例.
5) Launch app B, then 1 -> 2 -> 3, press home button, launch app A
now, then x -> y -> 2 then press back button to drop 2. Launch app B
now, what activities it contains? 1 -> 3 only or 1 -> 2 -> 3?
同样,这取决于taskAffinity.如果应用B的所有活动具有相同的taskAffinity,则在1-> 2-> 3之后,您将拥有一项任务.用户按下HOME按钮,此任务将转到后台.现在,用户启动应用A创建新任务.在x-> y之后,第二个任务包含这两个活动.现在活动y开始活动2.由于此活动具有launchMode =“singleTask”并且与任务中的其他活动具有不同的taskAffinity(它们都具有App A的taskAffinity),Android将创建一个以活动2为根的新任务. Android无法使用包含1-> 2-> 3的现有任务,因为该任务不包含活动2作为其根.当用户按下2中的BACK时,这将完成活动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按钮,完成活动2及其所在的任务(因为该任务现在为空),将用户返回到上一个任务,该任务包含来自应用程序A的x-> y从中启动应用程序B. HOME屏幕将简单地将包含活动1的任务带到前台.您现在有3个任务:Task1包含活动1并且在前台,Task2包含活动3并且在后台,Task3包含x-> y并且在后台.
笔记
我意识到这很复杂.我的回答是从我的头脑,我没有尝试实际实现所有这些组合和检查(但是,我过去已经实现了许多这些案例,我确实知道它是如何工作的).原因是你描述的大部分内容都不会在现实世界中完成,因此这些例子只是理论上的而不实际的.在现实生活中,您几乎不需要使用singleTask或singleInstance启动模式,除非您正在构建自己的HOME屏幕替换,或者您需要仔细控制应用程序在其他应用程序启动时的行为方式.在大多数情况下,您将永远不会有多个具有singleTask或singleInstance启动模式的活动.
如果您使用singleInstance或singleTask,则需要了解taskAffinity的工作原理,并且还需要确保为每个声明为“singleTask”或“singleInstance”的活动设置不同的应用程序图标(可能还有app标签) .如果不是,由于最近任务列表中显示的方式,用户将无法返回正确的任务.