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



在Android官方在线任务和后台指南中,有一条信息我觉得自相矛盾。所以,如果有人能帮我弄清楚,我将不胜感激。

首先,有以下声明:

堆栈中的活动从不重新排列,只从堆栈中推送和弹出——当当前活动启动时推送到堆栈上,当用户使用"上一步"按钮离开堆栈时弹出。

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

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

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

在那一页上还有另一条关于此事的评论:

另一个例子是,Android浏览器应用程序通过在元素中指定singleTask启动模式,声明web浏览器活动应始终在其自己的任务中打开。这意味着,如果您的应用程序发出打开Android浏览器的意图,则其活动不会与您的应用软件放在同一任务中。相反,为浏览器启动一个新任务,或者,如果浏览器已经有一个任务在后台运行,则该任务会提前处理新意图。

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

附言:一年多前就已经有人问过一个几乎相同的问题,但没有给出正确的答案。因此,虽然从技术上讲,我的问题是重复的,但我觉得有必要重新问一遍,因为它确实应该得到一个明确无误的答案。

我会尽力回答您的问题。

首先,

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

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

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

相关内容

  • 没有找到相关文章

最新更新