首页 文章

具有singleTask启动模式的活动及其在后台堆栈中的位置

提问于
浏览
3

在官方的在线Android guide on tasks and back stack中,如果有人能帮助我解决这个问题,那就更加感激了 .

首先,有以下声明:

堆栈中的活动永远不会重新排列,只能在当前活动启动时从堆栈推送并弹出到堆栈中,并在用户使用“返回”按钮离开时弹出 .

然后描述了singleTask启动模式,有以下声明:

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

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

在该页面上有关于此事的另一个评论:

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

因此,该指南指出,调用singleTask活动会以某种方式将其推向前进 . 但是,如果这项活动不是最重要的,那又怎么可能呢?活动是否已恢复,或者只是在没有向用户显示的情况下接收对其onNewIntent()方法的调用?我真的不明白 .

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

1 回答

  • 2

    我会尽力回答你的问题 .

    首先,

    堆栈中的活动永远不会重新排列,只能在当前活动启动时从堆栈推送并弹出到堆栈中,并在用户使用“返回”按钮离开时弹出 .

    这实际上是错误的 . 通常情况下,堆栈中的活动永远不会重新排列,但您可以使用 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() 活动 . However ,如果 singleTask 活动已在其任务中启动了其他活动,则所有其他活动将完成(即:任务被剥离回其根 Activity )在 singleTask 活动的现有实例上调用 onNewIntent() 之前 .

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

相关问题