【磨叽教程】Android进阶教程之任务栈

副标题:Activity的几种启动模式详解

任务是用户在执行某项工作时与之互动的一系列 Activity 的集合。

这些 Activity 按照每个 Activity 打开的顺序排列在一个返回堆栈中形成任务栈

例如:
在电子邮件应用可能有一个 Activity 来显示新邮件列表。
当用户选择一封邮件时,系统会打开一个新的 Activity 来显示该邮件。
这个新的 Activity 会添加到任务堆栈中。如果用户按"返回"按钮,这个 Activity 即结束并从堆栈中退出。

版本差异:
Android 7.0(API 级别 24)及更高版本支持多窗口环境,当应用在这种环境中同时运行时,系统会单独管理每个窗口的任务;而每个窗口可能包含多项任务。
大多数任务都从设备主屏幕上启动。当用户轻触应用启动器中的图标(或主屏幕上的快捷方式)时,该应用的任务就会转到前台运行。如果该应用没有任务存在(应用最近没有使用过),则会创建一个新的任务,并且该应用的“主”Activity 将会作为堆栈的根 Activity 打开。
在当前 Activity 启动另一个 Activity 时,新的 Activity 将被推送到堆栈顶部并获得焦点。
上一个 Activity 仍保留在堆栈中,但会停止。
当 Activity 停止时,系统会保留其界面的当前状态。
当用户按"返回"按钮时,当前 Activity 会从堆栈顶部退出(该 Activity 销毁)。
上一个 Activity 会恢复(界面会恢复到上一个状态)。
堆栈中的 Activity 永远不会重新排列,只会被送入和退出。
在当前 Activity 启动时被送入堆栈,在用户使用返回按钮离开时从堆栈中退出。
因此,返回堆栈按照“后进先出”的结构运作。
下图借助一个时间轴直观地显示了这种行为。该时间轴显示了 Activity 之间的进展以及每个时间点的当前返回堆栈。在这里插入图片描述
如果用户继续按"返回",则堆栈中的 Activity 会逐个退出,以显示前一个 Activity,直到用户返回到主屏幕(或任务开始时运行的 Activity)。移除堆栈中的所有 Activity 后,该任务将不复存在。也就是我们所说的"退出该应用"。
任务是一个整体单元,当用户开始一个新任务或通过主屏幕按钮进入主屏幕时,任务可移至“后台”。
在后台时,任务中的所有 Activity 都会停止,但任务的返回堆栈会保持不变。
当其他任务启动时,当前任务只是失去了焦点。

在这里插入图片描述

图示: 两个任务:任务 B 在前台接收用户互动,任务 A 在后台等待恢复。

如图所示。这样一来,任务就可以返回到“前台”,以便用户可以从他们离开的地方继续操作。

举例来说,假设当前任务(任务 A)的堆栈中有 3 个 Activity,用户按主屏幕按钮,然后从应用启动器中启动新应用(任务 B)。主屏幕出现后,任务 A 转到后台。当新应用启动时,系统会启动该应用的任务(任务 B),该任务具有自己的 Activity 堆栈。若用户再次返回到主屏幕并选择最初启动任务 A 的应用。那么,任务 A 进入前台,其堆栈中的所有三个 Activity 都完好如初,堆栈顶部的 Activity 恢复运行。同理,用户仍可通过这种方式切换到任务 B。

这就是在 Android 上进行多任务处理的一个例子。

注意:多个任务可以同时在后台进行。但是,如果用户同时运行很多后台任务,系统可能会为了恢复内存而开始销毁后台 Activity,导致
Activity 状态丢失。

由于返回堆栈中的 Activity 不会被重新排列,如果您的应用中有一个特殊的Activity允许用户从多个 Activity 中启动,那么系统便会创建该特殊 Activity 的新实例并将其推送到堆栈中(而不是将该 Activity 的某个先前的实例移至堆栈顶部)。这样一来,应用中的一个 Activity 就可能被多次实例化(甚至是从其他任务对其进行实例化)。
在这里插入图片描述

单个 Activity 会被多次实例化。

因此,如果用户使用"返回"按钮向后导航,Activity 的每个实例将按照它们被打开的顺序依次重新显示出来(每个实例都有自己的界面状态)。

不过,如果您不希望某个 Activity 被实例化多次,那么下节继续,现在我们先给这节做个总结:(更多内容请关注”计算机自学平台“公众号)

1、当 Activity A 启动 Activity B 时,Activity A 会停止,但系统会保留其状态(例如滚动位置和输入到表单中的文本)。如果用户在 Activity B 中按返回按钮,系统会恢复 Activity A 及其状态。
2、当用户通过按主屏幕按钮离开任务时,当前 Activity 会停止,其任务会转到后台。系统会保留任务中每个 Activity 的状态。如果用户稍后通过点按该任务的启动器图标来恢复该任务,该任务会进入前台并恢复堆栈顶部的 Activity。
3、如果用户按返回按钮,当前 Activity 将从堆栈中退出并销毁。堆栈中的上一个 Activity 将恢复。Activity 被销毁后,系统不会保留该 Activity 的状态。
4、Activity 可以多次实例化,甚至是从其他任务对其进行实例化。

猜你喜欢

转载自blog.csdn.net/farley119/article/details/107897614