gpt4 book ai didi

Android 任务和进程,SingleTask 和 SingleInstance

转载 作者:行者123 更新时间:2023-12-04 05:31:29 25 4
gpt4 key购买 nike

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

在我读到 SingleTask 和 SingleInstance 之后,我越来越困惑。

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

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

假设他们的启动模式是标准的(不使用任何 Intent 标志)。其中 x 是应用 A 的 Main Activity; 1 是应用程序 B 的主要 Activity 。

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

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

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

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

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

5)启动app B,然后1 -> 2 -> 3,按home键,现在启动app A,然后x -> y -> 2然后按back键放下2.现在启动app B,它包含哪些 Activity ? 1 -> 3 还是 1 -> 2 -> 3?

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

最佳答案

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?



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

How about if we launch app B now? What activities will app B contain?



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

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

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?



在 Activity 点 y启动 Activity 1 ,这将创建一个新任务。因此,您将有一项包含 Activity x->y 的任务。第二个任务包含 1 .当 Activity 1启动 Activity 2发生的事情不仅仅取决于 launchMode的 Activity 。即使 Activity 2已声明 launchMode="singleTask" ,如果 taskAffinity Activity 2taskAffinity 相同 Activity 1 (默认情况下,如果它们属于同一个应用程序)然后 Activity 2将在与 Activity 1 相同的任务中创建(即:它的行为就像 Activity 2launchMode="standard" 一样)。但是,如果 Activity 1和 Activity 2有不同 taskAffinity ,然后 Activity 2将作为新任务中的根 Activity 启动。现在您将有 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 .如果 taskAffinity Activity 12都是一样的,从HOME界面启动app B,会带出包含 1->2的任务。到前台。如果 taskAffinity Activity 的不同,从主屏幕启动应用程序B会带来包含 Activity 1的任务。到前台。

4) Launch app B, then 1 -> 2 -> 3 -> 1, will 2 and 3 be destroyed?



23不会被破坏。
假设 1 , 23都有 launchMode="singleTask"那么它(再次)取决于 taskAffinity设置。假设所有 Activity 都具有相同的 taskAffinity ,那么您将有一个包含 1->2->3->1 的任务(您将有 2 个 Activity 实例 1 )因为 taskAffinity王牌 launchMode .

如果所有 Activity 都有不同 taskAffinity ,然后在 1->2->3 之后您将有 3 个独立的任务,每个任务包含一个 Activity 。然后,当 Activity 3开始 Activity 1 ,这只会带来包含 Activity 1 的任务到前台和 不会创建 Activity 的新实例 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 的所有 Activity 都具有相同的 taskAffinity然后在 1->2->3 之后你将有一项任务。用户按下 HOME 按钮此任务将转到后台。现在用户启动应用程序 A 创建一个新任务。后 x->y第二个任务包含这两个 Activity 。现在 Activity y开始 Activity 2 .由于此 Activity 有 launchMode="singleTask"并且有一个不同的 taskAffinity从任务中的其他 Activity (它们都有 taskAffinity 的App A)中,Android 将创建一个 Activity 为 2 的新任务。作为根。 Android 无法使用包含 1->2->3 的现有任务因为该任务不包含 Activity 2作为其根。当用户在 2 中按 BACK 时,这将完成 Activity 2这将完成第三个任务,将用户返回到包含 x->y 的第二个任务。有 Activity y在上面。现在按 HOME 并启动应用程序 B 将带来包含 1->2->3 的现有第一个任务。到前台。

但是,如果app B的所有activity都不同 taskAffinity ,然后在 1->2->3 之后您将有 3 个单独的任务,每个任务都包含一个 Activity 。用户按下 HOME 并启动 App A 创建一个新任务(现在你有 4 个任务)。后 x->y第四个任务包含这两个 Activity 。现在 Activity y开始 Activity 2 . Android 只是简单地带来包含 Activity 的任务 2到前台。用户按下 BACK 按钮, Activity 结束 2以及它所在的任务(因为该任务现在是空的),将用户返回到上一个任务,即包含 x->y 的任务。从应用程序 A. 从主屏幕启动应用程序 B 将简单地带来包含 Activity 的任务 1到前台。您现在有 3 个任务:Task1 包含 Activity 1并且在前台,Task2 包含 Activity 3并且在后台,Task3 包含 x->y并且在后台。

备注

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

如果您使用 singleInstancesingleTask你需要知道如何 taskAffinity工作,您还需要确保为每个声明为“singleTask”或“singleInstance”的 Activity 具有不同的应用程序图标(可能还有应用程序标签)。否则,由于最近任务列表中的显示方式,用户将无法返回到正确的任务。

关于Android 任务和进程,SingleTask 和 SingleInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18611543/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com