【问题标题】:What is difference between using Intent flag "CLEAR_TOP" and launchMode="singleTask"?使用 Intent 标志“CLEAR_TOP”和 launchMode="singleTask" 有什么区别?
【发布时间】:2018-10-21 16:50:13
【问题描述】:

使用Intent 标志"FLAG_ACTIVITY_NEW_TASK" & "FLAG_ACTIVITY_CLEAR_TOP"launchMode="singleTask" 有什么区别?以及将意图标志设置为FLAG_ACTIVITY_SINGLE_TOP 和将launchMode 设置为"singleTop" 有什么区别。

【问题讨论】:

  • 您阅读过相关文档吗?
  • @TimCastelijns 我已经阅读了 5 6 篇关于此的中等文章和 android 开发者文档。他们对一切都有很好的解释。但是我想问一下设置launchModes和将Intentflags设置为活动时的行为差异。

标签: android android-intent android-activity intentfilter


【解决方案1】:

我从您回复蒂姆的评论中理解了您的问题。所以你想知道

设置启动模式和设置时的行为差异 活动的意图标志

您的这个问题的答案是您在 AndroidManifest.xml 文件中为 Activity 设置了 launchMode,但是特定的启动行为可以通过 Intentruntime 以某些方式进行更改标志FLAG_ACTIVITY_SINGLE_TOPFLAG_ACTIVITY_NEW_TASKFLAG_ACTIVITY_MULTIPLE_TASK

现在让我们来谈谈您在主要问题中提到的另外两个问题。

使用 Intent 标志“FLAG_ACTIVITY_NEW_TASK”有什么区别 &“FLAG_ACTIVITY_CLEAR_TOP”和launchMode="singleTask"?

FLAG_ACTIVITY_NEW_TASK

当我们通过意图设置此标志并启动该活动时。在这种情况下,该活动将成为此历史堆栈上新任务的开始。任务(从启动它的活动到下一个任务活动)定义了用户可以移动到的活动的原子组。这意味着它将创建一个单独的历史堆栈。例如,在您的应用程序中,您有一个设置图标,当您单击该图标时,您将转到设置活动,您可以在其中进行更多活动。这里记录的所有动作都将仅从您的设置活动开始。

FLAG_ACTIVITY_CLEAR_TOP

顾名思义,如果您在现有的任务中使用此标志启动一个活动(请理解任务,那么一切都会很容易理解),在这种情况下,所有活动都在此活动上方的堆栈将被关闭,这将成为任务中的最后一个活动或最旧的活动。

单任务

当您启动一个您设置了launchMode = "singleTask" 的活动并且已经有一个以该活动开始的任务正在运行,那么当前任务将被带到最前面,而不是启动一个新实例。

你的第二个问题

将意图标志设置为有什么区别 FLAG_ACTIVITY_SINGLE_TOP 并将launchMode 设置为“singleTop”?

FLAG_ACTIVITY_SINGLE_TOPlanuchMode = "singleTop"

两者具有相同的行为,标志在运行时设置,并且在 AndroidManifest.xml 中的启动模式一开始。行为是,带有 this 的活动将是任务顶部的唯一活动。如果它已经在历史堆栈的顶部运行,则该活动将不会再次启动。

注意:了解该行为的最佳方法是遵循任何教程并进行实际检查。玩弄代码并查看行为。

这里有一些有用的链接:

启动模式:https://developer.android.com/reference/android/R.styleable#AndroidManifestActivity_launchMode

意图标志:https://developer.android.com/reference/android/content/Intent

【讨论】:

  • 我在 Play 商店中发现了这个应用程序,它对于理解启动模式和标志等概念(包括亲和力)非常有用。 play.google.com/store/apps/…
【解决方案2】:

单任务:- 一个带有 singleTask launchMode 的 Activity 只允许在系统中有一个实例(也就是 Singleton)。如果系统中存在Activity实例,则整个Task持有该实例将被移动到顶部,而Intent将通过onNewIntent()方法传递。否则,将创建新的活动并将其放置在正确的任务中。您可以通过以下网址获取更多信息:- https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en

flag — FLAG_ACTIVITY_CLEAR_TOP:如果正在启动的 Activity 已经在当前任务中运行,则不会启动该 Activity 的新实例,而是销毁其上的所有其他 Activity(调用 onDestroy 方法)和此意图通过 onNewIntent 方法传递到 Activity 的恢复实例(现在在顶部)。 注意:对于 FLAG_ACTIVITY_CLEAR_TOP,如果 launchMode 未在 AndroidManifest 中定义或设置为 Activity 的“标准”,则 Activity 及其顶部将被弹出,并且该 Activity 的新实例被放置在顶部。所以,onNewIntent 方法没有被调用。

这是不可取的,大多数时候我们希望重用 Activity 并刷新它的视图状态,比如列表中的数据,当它到达返回堆栈的顶部时,而不是销毁然后重新创建它。

您可以通过以下网址获取更多信息:- https://blog.mindorks.com/android-task-and-back-stack-review-5017f2c18196

【讨论】:

    【解决方案3】:

    我认为FLAG_ACTIVITY_CLEAR_TOP 的Android 文档https://developer.android.com/reference/android/content/Intent#FLAG_ACTIVITY_CLEAR_TOP 很好地解释了这种差异。 https://inthecheesefactory.com/blog/understand-android-activity-launchmode/en 很好地解释了启动模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-21
      • 2012-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-03-19
      • 2014-11-04
      相关资源
      最近更新 更多