如何防止在android中增长活动堆栈

时间:2013-05-15 03:07:45

标签: android

我在某处读到,每次调用startActivity()转换到新屏幕时,都会创建该活动的新实例。这立即给我一个红旗。

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

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

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

3 个答案:

答案 0 :(得分:2)

  

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

大多数情况下,您可能不希望有两个相同Activity的实例,但我认为有些人可能会

  

这不是什么大问题,不应该教程解决它

这绝对是Android开发人员需要了解和理解如何使用的东西。我想你可能在教程中看不到很多,因为他们中的大多数教你基础知识来帮助你入门。当开发人员不熟悉Android时,他们通常有足够的知识来学习框架。他们通常会告诉你如何做几个屏幕(这通常是有人可能需要的)。他们希望您通过阅读文档和使用SO

等网站了解更多详细信息
  

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

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

通过询问这些问题,您似乎走在正确的轨道上。想一想什么能给用户带来最佳和最自然的体验,并在Intent Docs中找到适合您情况的正确旗帜

我希望这能为你解决一些问题。如果您不明白,请随时提出

答案 1 :(得分:2)

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

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

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

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

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

  • singleTop ”与标准相同,但如果目标任务已在堆栈顶部具有此活动的实例,则不会创建新活动。相反,现有活动将接收对onNewIntent()的调用。

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

  • singleInstance ”与singleTask相同,不同之处在于它是其堆栈中唯一的活动。如果它尝试启动新活动,则新活动将启动新任务。与FLAG_ACTIVITY_NEW_TASK在意图中相同。

答案 2 :(得分:1)

我个人发现android中的历史回写堆栈比最终用户更有帮助。使用后退按钮通常无法满足用户的期望。

如果您想将活动用作主要构造,可以使用几个选项。

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

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

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