导航原则

在不同屏幕和应用之间导航是用户体验的核心部分。以下原则为跨应用提供一致且直观的体验设置了基线。导航组件旨在默认实现这些原则,确保用户在应用之间移动时可以应用相同的启发式方法和模式。

固定起点

您构建的每个应用都有一个固定的起点。这是用户从启动器启动应用时看到的第一个屏幕。这个起点也是用户在从启动器退出后按返回键时看到的最后一个屏幕。让我们以 Sunflower 应用 为例。

图 1. 列表屏幕是 Sunflower 应用的起点。

从启动器启动 Sunflower 应用时,用户看到的第一个屏幕是“列表屏幕”,即花园中植物的列表。这也是他们在退出应用之前看到的最后一个屏幕。如果他们在列表屏幕上按返回键,他们会返回到启动器。

当您的应用首次启动时,会为用户创建一个 新任务,应用会显示其起点。这成为被称为“返回堆栈”的基础目标,也是您的应用导航状态的基础。堆栈的顶部是当前屏幕,堆栈中的先前目标表示您访问过的历史记录。返回堆栈始终在堆栈底部包含应用的起点。

更改返回堆栈的操作始终对堆栈的顶部进行操作,通过将新目标推送到堆栈的顶部或从堆栈的顶部弹出最顶部的目标来实现。导航到目标会将该目标推送到堆栈的顶部。

导航组件会为您管理所有返回堆栈排序,尽管您也可以选择自己管理返回堆栈。

向上和返回在应用的任务中相同

图 2. 向上和返回按钮

返回按钮显示在屏幕底部的系统导航栏中,用于按逆时序顺序导航到用户最近操作过的屏幕历史记录。按下返回按钮时,当前目标会从返回堆栈的顶部弹出,然后您会导航到上一个目标。

向上按钮显示在屏幕顶部的 应用栏 中。在应用的任务中,向上和返回按钮的行为相同。

向上按钮永远不会退出您的应用

如果用户位于应用的起始目的地,则“向上”按钮不会出现,因为“向上”按钮永远不会退出应用。但是,“后退”按钮会显示出来,并且会退出应用。

当您的应用使用另一个应用的任务中的 深度链接 启动时,“向上”按钮会将用户带回您的应用的任务,并通过 模拟后退栈,而不是带回触发深度链接的应用。“后退”按钮会将您带回另一个应用。

无论是 深度链接 还是手动导航到特定目的地,您都可以使用“向上”按钮在目的地之间导航,返回到起始目的地。

当深度链接到您的应用任务内的目的地时,您的应用任务的任何现有后退栈都会被移除,并替换为深度链接的后退栈。

再次以向日葵应用为例,假设用户之前从启动器屏幕启动了应用,并导航到了苹果的详细信息屏幕。查看“最近”屏幕会显示一个任务存在,最顶层的屏幕是苹果的详细信息屏幕。

图 3. 用户在向日葵应用中的导航和由此产生的后退栈。

此时,用户可以点击“主页”按钮将应用置于后台。接下来,假设该应用有一个深度链接功能,允许用户直接按名称启动到特定的植物详细信息屏幕。通过此深度链接打开应用会完全替换图 3 中显示的当前向日葵后退栈,并用新的后退栈代替,如图 4 所示。

图 4. 遵循深度链接会替换向日葵应用的现有后退栈。

请注意,向日葵后退栈被一个以鳄梨详细信息屏幕为顶部的合成后退栈所替换。我的花园屏幕,即起始目的地,也被添加到后退栈中。原始的向日葵后退栈已消失,包括应用对用户之前位于苹果详细信息屏幕的了解。所有这些都很重要,因为合成后退栈必须是真实的。它应该与通过有机导航应用可以实现的后退栈相匹配。

为了满足这一需求,创建的合成后退栈是一个基于 NavGraph 的简化后退栈。对于没有嵌套的简单 NavGraph,它将包含起始目的地和深度链接目的地。对于更复杂的 嵌套导航图,合成后退栈还将包含深度链接目的地祖先的所有嵌套图的起始目的地。

导航组件 支持深度链接,并在链接到导航图中的任何目的地时为您重新创建一个真实的后退栈。