使用集合让一切井井有条

彩虹网

任务是用户在尝试执行某些操作时与之互动的一系列 activity执行某些操作这些 activity 排列在一个称为返回堆栈,按每个 activity 打开的顺序排列。

例如,电子邮件应用可能有一个 activity 来显示新邮件列表。当用户选择消息,系统会打开一个新的活动来查看该消息。这项新活动已添加返回堆栈。然后,当用户点按“返回”或做出“返回”手势时,这个新 activity从堆栈中弹出

任务及其返回堆栈的生命周期

大多数任务都从设备主屏幕上启动。当用户触摸屏幕时应用启动器中或主屏幕上的应用或快捷方式的图标;该应用的任务进入前台。如果应用程序不存在任务,则系统会创建一项新任务,并且主activity作为堆栈中的根 activity。

在当前 activity 启动另一个 activity 时,新 activity 会推送到顶部并且会获得焦点上一个 activity 仍保留在堆栈中,停止。当某个 activity 停止时,系统会保留其界面。当用户执行返回操作时,当前 activity 为从堆栈顶部弹出并销毁。通过之前的 activity 会恢复,而其界面的前一状态会恢复。

以下位置中的活动:从未被重新排列,只会按原样推送到堆栈中和从堆栈中弹出由当前 activity 启动并被用户关闭返回按钮或手势因此,返回堆栈以采用后进先出的对象结构。图 1 显示了一个带有被推送到返回堆栈并从返回堆栈弹出的 activity。

使用集合让一切井井有条

图 1. 有关任务中的每个新 Activity 如何添加到返回堆栈的图示。当用户点按或手势时返回,当前 activity 被销毁,前一个 activity继续。

当用户继续点按或做出“返回”手势时,堆栈中的每个 activity会弹出上一个窗口,直到用户返回首页屏幕或任务开始时正在运行的任何 activity。当所有从堆栈中移除 activity,则任务将不存在。

根启动器 activity 的返回点按行为

根启动器 activity 是声明 intent 的 activity和过滤条件和。这些 activity 独一无二,因为它们充当着从 Google Play 下载的应用启动器,用于。

当用户从根启动器 activity 中点按或做出“返回”手势时,系统处理事件的方式会有所不同,具体取决于设备正在运行。

Android 11 及更低版本上的系统行为

系统完成 activity。

Android 12 及更高版本上的系统行为

系统会将 activity 及其任务移至后台,而不是以及结束活动此行为与默认系统行为一致,使用主屏幕按钮或手势离开应用。

在大多数情况下,这种行为意味着用户可以更快地恢复您的应用而不是从开始必须从冷启动时间状态。

如果您需要提供自定义返回导航,我们建议使用 AndroidX Activity API,而不是替换onBackPressed()。AndroidX Activity API 会自动遵循如果没有组件拦截系统,则相应的系统行为点按背面。

但是,如果您的应用替换 用于处理返回导航并完成 activity,更新您的实现以调用一直到super.onBackPressed(),而不是完成。正在呼叫super.onBackPressed() 在以下情况下会将 activity 及其任务移至后台:并且能为用户提供更加一致的导航体验。

后台任务和前台任务

使用集合让一切井井有条

图 2. 两个任务:任务 B 在在前台运行,而任务 A 在后台等待继续。

任务是一个有机整体,在用户开始新任务或转到主屏幕。在后台运行时,所有 activity停止,但任务的返回堆栈仍然保持不变,即任务失去焦点,如图 2 所示。答然后,任务可以返回到前台,以便用户可以从离开的位置继续关闭。

假设当前任务 A 的以下任务流程其堆栈中有三个 activity,包括当前 activity 下的两个:

用户使用主屏幕按钮或手势,然后从应用启动器。

出现主屏幕时,任务 A 进入后台。当新的应用启动时,系统会为该应用启动一个具有自己的堆栈的任务(任务 B)活动数。

与该应用互动后,用户再次返回主屏幕并选择应用程序。

现在,任务 A 进入前台,其堆栈中的所有三个 activity并且堆栈顶部的 activity 将恢复。此时,用户还可以通过前往主屏幕并选择应用图标来切换回任务 B或是从最近使用的应用列表中screen。

。注意: 多个任务可同时在后台运行。但是,如果用户同时运行多个后台任务,那么系统可能会开始销毁后台活动来恢复内存。如果发生这种情况,该活动状态会丢失。多个 activity 实例

使用集合让一切井井有条

图 3. 一个 activity 可以多次实例化。

由于返回堆栈中的 activity 永远不会重新排列,因此如果您的应用可让用户从多个 activity 启动特定 activity,新的创建该 activity 的实例并将其推送到堆栈,而不是将之前该 activity 的所有实例置于顶部。因此,应用中的 activity 可能会多次实例化,即使如图 3 所示。

如果用户使用“返回”按钮向后导航按钮或手势,activity 实例就会按其顺序显示每个对象都有自己的界面状态。不过,您可以将此行为。了解有关详情,请参阅管理任务。

多窗口环境

当应用在多窗口模式中同时运行时环境,在 Android 7.0 (API) 中受支持级别 24)及更高版本,系统会单独管理每个窗口的任务。每个窗口中可以包含多个任务同样,在 Android 设备上运行的 Android 应用也应如此Chromebook:系统会在按窗口统计

生命周期回顾

Activity 和任务的默认行为总结如下:

。注意: 如需详细了解如何针对 Android 设计应用的导航结构,请参阅设计导航图。管理任务

Android 通过以下方式管理任务和返回堆栈:所有 activity 都在同一任务中相继启动,最后一个为第一个,输出堆栈。这对于大多数应用都非常有效,您通常无需担心activity 与任务的关联方式,或任务在后端的存在方式堆栈。

不过,您可能会决定要中断正常行为。例如,您可能希望应用中的某个 activity 在 activity 被触发时启动新任务,开始,而不是放置在当前任务中。或者,当您启动则您可能需要调出它的现有实例,而不是在返回堆栈之上创建新实例的方法。或者,您可能希望返回堆栈中清除除根 activity 之外的所有 activity当用户离开任务时触发。

您可以使用 清单元素和标记。

注意: 大多数应用都不会中断 activity 的默认行为,并且任务。如果您确定 activity 有必要修改默认行为,要谨慎,并测试 activity 的易用性在启动期间以及从其他 activity 和任务返回该 activity 时返回按钮或手势此外,测试导航行为可能不符合用户预期的内容。

以下是可用于管理任务的主要 属性:

以下是您可以使用的主要 intent 标志:

以下部分讨论如何使用这些清单属性和 intent 标志来定义 activity 与任务的关联方式以及在返回堆栈中的行为

此外,还讨论了与任务和活动在“最近使用的应用”屏幕中进行显示和管理。通常,您可以让系统定义任务和 activity 在“最近使用的应用”屏幕,您无需修改此行为。有关信息,请参阅“最近使用的应用”屏幕。

定义启动模式

通过启动模式,您可以定义如何关联新的 activity 实例与当前任务相关联。您可以通过两种方式定义启动模式:

因此,如果 activity A 启动 activity B,activity B 可以在其清单中定义activity A 可以使用 intent 标志,请求 activity B 如何与当前任务关联。

如果两者activity 定义了 activity B 与任务的关联方式,然后 activity A 的请求(如 intent 中所定义)优先于 activity B 的请求,如在其清单中定义的任何订单。

注意 :某些适用于清单文件的启动模式不如标记。同样,某些启动模式可用作无法在清单中定义 intent。使用清单文件定义启动模式

在清单文件中声明 Activity 时,您可以指定使用 元素的 属性。

您可以为 launchMode 属性指定五种启动模式:

"standard"

默认模式。系统会在任务中创建新的 activity 实例以及将 intent 传递给它。活动可以是实例化多次,每个实例可以属于不同的任务,以及一个任务可以有多个实例。

"singleTop"

如果当前任务的顶部已存在 activity 的实例,系统会通过调用方法,而不是创建新的 Activity 实例。此活动为实例化多次,每个实例可以属于不同的任务,一个任务可以有多个实例(但前提是顶部的 activity不是 activity 的现有实例)。

例如,假设任务的返回堆栈由根 activity A 和activity B、activity C 和 activity D 在顶部(因此堆栈为 A-B-C-D,D 在顶部)。intent。如果 D 具有默认的 "standard" 启动模式,系统会启动该类的新实例,并且堆栈会变为 A-B-C-D-D。不过,如果 D 的启动模式为 "singleTop",则 D 的现有实例通过 onNewIntent() 接收 intent,因为它位于堆栈顶部,而堆栈仍旧是 A-B-C-D。如果另一方面intent 到达类型 B 的 activity,则系统会将 B 的新实例添加到堆栈中,即使其启动模式为 "singleTop"。

注意 :创建 activity 的新实例后,用户可以点按或点按“返回”手势,返回到上一个 activity。但当现有处理新的 intent 的 activity 实例时,用户无法点按或点按手势“返回”,以返回到新 intent 之前的 activity 状态出现在 onNewIntent() 中。

"singleTask"

系统会在新任务的根位置创建 activity 或找到具有同一相似性的现有任务上的 activity。如果已存在,则系统会将intent(通过调用其方法,而不是创建新实例。同时,所有其他其上的 activity 会被销毁。

注意: 虽然 activity 在新任务中启动,但返回按钮和手势仍会让用户返回到上一个 activity。

"singleInstance"。

此行为与 "singleTask" 相同,只是系统不会启动任何其他将 activity 放入包含该实例的任务中。activity 始终是是其任务中的唯一一个成员。由此活动启动的所有活动都会在一个单独的任务。

"singleInstancePerTask"。

activity 只能作为任务的根 activity(第一个 activity)运行activity,因此只能有一个实例此 activity 的实际情况。与 singleTask 启动模式相比,以下代码在不同任务的多个实例中启动 activity,如果或标志已设置。

。注意: "singleTask" 和 "singleInstancePerTask" 会移除所有活动 位于任务启动 activity 上方。例如,假设 任务由根 activity A 与 activity B 和 activity C 组成。任务是 A-B-C, C 键 。收到 A 类 activity 的 intent。如果 A 的启动模式是 "singleTask" 或 "singleInstancePerTask",A 的现有实例 通过 onNewIntent() 接收 intent。 任务 B 和 C 已完成,任务 A 现在完成。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。