3

我在某处读到,每次调用 startActivity() 转换到新屏幕时,都会创建该活动的新实例。这立即向我提出了一个危险信号。

为了寻找防止此问题的方法,我阅读了有关使用 FLAG_ACTIVITY_REORDER_TO_FRONT 的信息。但是,我有点担心,在我看到的用于在您的应用程序中打开新屏幕的任何教程中都没有使用此方法。所以我想我可能会遗漏一些东西。我的意思是你不是总是想确保你没有创建重复的活动吗?这不是什么大不了的事,教程不应该解决吗?

我只是想确保我能正确理解和处理这个问题,并使用常用的方式在屏幕之间进行转换。

我了解在某些情况下您打开一个屏幕,做某事,然后使用 finish() 关闭它并返回。但是如果一个应用程序有一个复杂的 4 级层次结构,并且用户需要能够在屏幕之间跳转?

4

3 回答 3

2

我的意思是你不是总是想确保你没有创建重复的 Activity

大多数时候你可能不希望有两个相同的实例,Activity但我想在某些情况下有人可能

这不是什么大不了的事,教程不应该解决它

这绝对是 Android 开发者需要了解和了解如何使用的东西。我想你可能不会在教程中看到很多它,因为它们中的大多数都会教你入门的基础知识。当开发人员刚接触 Android 时,他们通常有足够的知识来了解该框架。他们通常会向您展示如何做几个屏幕(这通常是某人可能需要的)。他们希望您通过阅读文档和使用诸如 SO 之类的网站来了解更多详细信息

我了解在某些情况下您打开一个屏幕,做某事,然后使用 finish() 关闭它并返回。但是如果一个应用程序有一个复杂的 4 级层次结构,并且用户需要能够在屏幕之间跳转?

是的,很多时候你不会变得太深,因为越深越容易产生“迷失”的感觉。这就是为什么我喜欢尽可能使用Activitieswith a 的Dialog Theme原因。它给人的感觉是你实际上并没有离开你所在的屏幕。但是,这并不能真正回答您的问题。有许多标志可以用来Intents防止堆栈增长。您提到的那个有效,如果我需要从堆栈中清除所有内容并返回到一个,我也Intent.FLAG_ACTIVITY_CLEAR_Top经常使用它。应用程序、用户和开发人员之间可能存在许多不同的情况,以至于您如何转换和处理流程或导航仅取决于您(实际上是用户)的需求。ActivitiesActivity

通过提出这些问题,您似乎走在了正确的轨道上。想想什么会给用户最好和最自然的体验,并在Intent Docs中找到适合您情况的正确标志

我希望这能为你澄清一点。如果您有不明白的地方,请随时提问

于 2013-05-15T03:33:29.017 回答
2

您通常希望避免创建重复的活动,恕我直言,默认行为是允许它是 Android 系统中的一个错误。

(有时您确实希望允许它,例如您编写了一个“获取文件名”活动,并且可能有多个应用程序调用它。)

您可以在两个地方控制活动的创建:在清单中,以及在启动它的意图的标志中。

在清单中, <activity> 标记具有属性android:launchMode,它可以是以下之一:

  • 标准”默认。可以多次实例化,可以属于任何任务,可以出现在堆栈的任何位置。通常是调用 startActivity() 的任务的一部分,除非使用了 FLAG_ACTIVITY_NEW_TASK。创建该类的新实例以响应每个新意图。

  • " singleTop " 与标准相同,只是如果目标任务在栈顶已经有该活动的实例,则不会创建新活动。相反,现有活动将收到对 onNewIntent() 的调用。

  • singleTask ” 只能有一个。它是新堆栈的第一个活动,因此是活动堆栈的根。如果有更多意图,它们将被发送到 onNewIntent()。

  • singleInstance ” 与 singleTask 相同,只是它是其堆栈中的唯一活动。如果它尝试启动一个新活动,新活动将启动一个新任务。就像 FLAG_ACTIVITY_NEW_TASK 在意图中一样。

于 2013-05-15T04:16:30.170 回答
1

我个人发现 android 中的历史回溯堆栈比对最终用户的帮助更令人困惑。使用后退按钮通常不能达到用户的预期。

如果您想使用活动作为主要结构,有几个选项可供您使用。

  1. 对于工作流类型活动(例如捕获表单),使用 Intent.FLAG_ACTIVITY_NEW_TASK 开始第一个活动,最后使用 FLAG_ACTIVITY_CLEAR_TASK

  2. 对于通常是返回点的顶级活动,使用 Intent.FLAG_ACTIVITY_CLEAR_TOP 启动活动。这基本上检查该活动是否已经在堆栈中的某个位置,以及它是否弹出堆栈中它上面的每个活动并恢复原始活动。

顶级活动的另一种可能方法是使用一个顶级活动并使用片段来移动,例如选项卡浏览器等。然后将活动用于实际的单独任务。

于 2013-05-15T03:53:42.323 回答