【问题标题】:Activities with singleTask launch mode and their position in the back stack具有 singleTask 启动模式的活动及其在后台堆栈中的位置
【发布时间】:2015-07-22 22:22:15
【问题描述】:

在官方在线Androidguide on tasks and back stack中,有一条我觉得自相矛盾的信息。如果有人能帮我弄清楚,我将不胜感激。

首先,有以下声明:

堆栈中的 Activity 永远不会重新排列,只会从堆栈中压入和弹出 - 当由当前 Activity 启动时压入堆栈,并在用户使用后退按钮离开时弹出。

然后描述singleTask启动模式,有如下语句:

系统创建一个新任务并在新任务的根目录下实例化活动。但是,如果 Activity 的实例已经存在于单独的任务中,系统会通过调用其 onNewIntent() 方法将 Intent 路由到现有实例,而不是创建新实例。

好吧,如果我理解正确的话,singleTask 活动只能是它们的任务的根,因为它们是这样创建的,并且活动从不交换后堆栈中的位置。但是这样的活动在收到对其 onNewIntent() 方法的调用时会如何反应?

那个页面上还有一个关于这个问题的评论:

作为另一个示例,Android 浏览器应用程序声明 Web 浏览器活动应始终在其自己的任务中打开 - 通过在元素中指定 singleTask 启动模式。这意味着如果您的应用程序发出打开 Android 浏览器的意图,它的活动不会与您的应用程序放在同一任务中。相反,要么为浏览器启动一个新任务,要么,如果浏览器已经在后台运行了一个任务,则该任务被提出来处理新的意图。

因此,指南指出调用 singleTask 活动会以某种方式将其向前推进。但是,如果该活动不在其任务之上,这怎么可能是真的呢?活动是否恢复,或者它只是接收到对其 onNewIntent() 方法的调用而不向用户显示?我真的不明白。

PS:一个几乎相同的question 已经在一年多前被问过,但没有给出正确的答案。因此,虽然从技术上讲,我的问题是重复的,但我有重新提出的冲动,因为它确实值得一个清晰明确的答案。

【问题讨论】:

    标签: android android-intent android-activity back-stack launchmode


    【解决方案1】:

    我会尽力回答你的问题。

    首先,

    堆栈中的活动永远不会重新排列,只会推送和弹出 from the stack—当由当前启动时压入堆栈 活动并在用户使用“后退”按钮离开时弹出。

    这实际上是错误的。通常,堆栈中的活动永远不会重新排列,但您可以使用Intent.FLAG_ACTIVITY_REORDER_TO_FRONT 将现有的Activity 从堆栈中的其他位置带到前面。例如,您的活动堆栈如下所示:A->B->C->D 其中A 是根活动(在堆栈的底部),D 是前台最顶层的活动(显示)。如果D 现在这样做:

    Intent intent = new Intent(this, B.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(intent);
    

    这会将活动B 的现有实例移动到任务的前面,这样它就不会显示在屏幕上。活动堆栈现在看起来像这样:A->C->D->B。

    接下来你问这个:

    系统创建一个新任务并在 新任务的根。但是,如果活动的一个实例已经 存在于单独的任务中,系统将意图路由到 现有实例通过调用其onNewIntent() 方法,而不是 而不是创建一个新实例。

    好吧,如果我理解正确的话,singleTask 活动只能是它们任务的根源,因为它们是以这种方式创建的,并且活动永远不会在后台堆栈中交换位置。但是这样的活动在收到对其onNewIntent() 方法的调用时会如何反应?

    一般来说,singleTask 活动是其任务的根。如果已经存在一个带有singleTask 活动的现有任务,并且您使用startActivity() 启动这样的活动,那么该任务将被提前(以便它显示在屏幕上)并且onNewIntent() 将被调用在该活动的现有实例上。 但是,如果singleTask 活动在其任务中启动了其他活动,则所有其他活动都将完成(即:任务被剥离回其根Activity)在onNewIntent() 之前在 singleTask 活动的现有实例上调用。

    在某些情况下,singleTask 活动不是其任务的根源,然后所有赌注都被取消(即:行为不符合记录)。如果singleTask 活动与应用程序中已在任务中处于活动状态的其他活动具有相同的taskAffinity,则可能会发生这种情况。在这种情况下,Android 会忽略 singleTask 启动模式,并将 Activity 视为具有 standard 启动模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 1970-01-01
      • 2020-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多