Android 具有单任务启动模式的活动及其在后堆栈中的位置

Android 具有单任务启动模式的活动及其在后堆栈中的位置,android,android-intent,android-activity,back-stack,launchmode,Android,Android Intent,Android Activity,Back Stack,Launchmode,在官方的在线安卓系统中,我发现有一条信息自相矛盾。所以,如果有人能帮我解决这个问题,我将不胜感激 首先,有以下声明: 堆栈中的活动从不重新排列,只在当前活动启动时从堆栈中推送到堆栈上,然后在用户使用“后退”按钮离开堆栈时弹出 然后描述了单任务启动模式,有如下语句: 系统创建一个新任务,并在新任务的根节点实例化活动。但是,如果活动的实例已存在于单独的任务中,系统将通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例 好吧,如果我理解正确的话,单任务活动只能是它们任务的根,

在官方的在线安卓系统中,我发现有一条信息自相矛盾。所以,如果有人能帮我解决这个问题,我将不胜感激

首先,有以下声明:

堆栈中的活动从不重新排列,只在当前活动启动时从堆栈中推送到堆栈上,然后在用户使用“后退”按钮离开堆栈时弹出

然后描述了单任务启动模式,有如下语句:

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

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

关于这件事,在那一页上还有一句话:

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

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


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

我将尝试回答您的问题

首先,

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

这其实是错误的。通常情况下,堆栈中的活动不会重新排列,但您可以使用
Intent.FLAG\u Activity\u REORDER\u to\u front
将现有的
活动从堆栈中的其他位置带到前面。例如,您的活动堆栈如下所示: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
启动模式,并将活动视为具有
标准启动模式