GMs*_*soF 8 android launchmode android-activity
我已阅读Google Android Developer页面,但任务的概念(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是app A的主要活动; 1是应用程序B的主要活动.
1)启动应用程序A,然后x-> y - > 1,按主页按钮,再次启动应用程序A,我们将看到活动y或1?
2)启动app A然后x - > 1 - > y - > 2 - > z - > 3,按home键,启动app 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)启动应用B,然后1 - > 2 - > 3 - > 1,2和3将被销毁吗?
5)启动应用程序B,然后1 - > 2 - > 3,按主页按钮,立即启动应用程序A,然后按x - > y - > 2然后按返回按钮2.立即启动应用程序B,它包含哪些活动?1 - > 3只或1 - > 2 - > 3?
谢谢任何人的回复和帮助!
Dav*_*ser 16
假设他们的启动模式是标准(不使用任何意图标志).而x是app A的主要活动; 1是应用程序B的主要活动.
1)启动应用程序A,然后x-> y - > 1,按主页按钮,再次启动应用程序A,我们将看到活动y或1?
你会看到活动1.您可以包含单个任务x->y->1与活动1在该任务的活动堆栈的顶部.按HOME时,此任务将移至后台.当您再次启动应用程序时,Android会找到任务堆栈并将其(完整)带回前台,向您显示堆栈中的顶级活动(在本例中1).
2)启动app A然后x - > 1 - > y - > 2 - > z - > 3,按home键,启动app A,它将包含所有活动(x - > 1 - > y - > 2 - > z - > 3),还是只包含x - > y - > z?
如上所述,您只有一个任务.按HOME时,任务包含x->1->y->2->z->3并移动到后台.当您再次启动App A时,任务将被提前(完整),您将看到3顶部的活动.
如果我们现在推出应用B怎么样?应用B包含哪些活动?
那么,这样的问题是不正确的.你真正想知道的是"这项任务包含哪些活动?",但答案如下:
如果从HOME屏幕启动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活动1和活动2相同,则从HOME屏幕启动应用程序B会将包含的任务1->2带到前台.如果taskAffinity活动的不同,从HOME屏幕启动应用程序B会将包含活动的任务1带到前台.
4)启动应用B,然后1 - > 2 - > 3 - > 1,2和3将被销毁吗?
不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)启动应用程序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.由于此活动具有launchMode="singleTask"并且taskAffinity与任务中的其他活动(它们都具有taskAffinityApp A)不同,因此Android将创建以活动2为根的新任务.Android无法使用包含的现有任务,1->2->3因为该任务不包含活动2作为其根.当用户按下BACK时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按钮,完成活动2及其所在的任务(因为该任务现在为空),将用户返回到上一个任务,该任务是包含x->y来自应用程序A的任务.从HOME屏幕启动应用程序B只会带来包含1前台活动的任务.您现在有3个任务:Task1包含活动1并且在前台,Task2包含活动3并且在后台,Task3包含x->y并且在后台.
笔记
我意识到这很复杂.我的回答是从我的头脑,我没有尝试实际实现所有这些组合和检查(但是,我已经实施了许多这些案例,我知道它是如何工作的).原因是你描述的大部分内容都不会在现实世界中完成,因此这些例子只是理论上的而不实际的.在现实生活中,您几乎不需要使用singleTask或singleInstance启动模式,除非您正在构建自己的HOME屏幕替换,或者您需要仔细控制应用程序在其他应用程序启动时的行为方式.在大多数情况下,您将永远不会有多个具有singleTask或的启动模式的活动singleInstance.
如果您使用singleInstance或singleTask需要了解其taskAffinity工作原理,您还需要确保为每个声明为"singleTask"或"singleInstance"的活动设置不同的应用程序图标(可能还有app标签).如果没有,由于最近任务列表中显示的方式,用户将无法返回正确的任务.
| 归档时间: |
|
| 查看次数: |
4630 次 |
| 最近记录: |