使用FLAG_ACTIVITY_REORDER_TO_FRONT将活动带到前台

19

我的活动栈是A1 B A2,其中A2位于顶部。

A1和A2是同一个活动A的实例。现在在A2中,我想让A2退出并将A1至于最前面,因此最终堆栈应该是B A1。我应该如何实现?

我当前在A2中执行的代码是:

        finish();

        intent = new Intent(this, A.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_PREVIOUS_IS_TOP);
        startActivity(intent);
以上代码将B置于最前面,所以最终堆栈是A1 B,这不是我预期的结果。 有什么想法吗? 谢谢。
3个回答

23

使用Intent标志无法实现您想要的功能。

原因是由于FLAG_ACTIVITY_REORDER_TO_FRONT的工作方式。当您使用此标志时,Android会从堆栈前面开始扫描您的活动堆栈,从前往后查找所需活动的实例,直到它到达堆栈的底部/根。一旦找到指定活动的实例,它就会将该实例置于前端(即:如果有多个指定活动的实例,则会将最近的实例置于前端)。

在您的情况下,活动堆栈如下:

A1, B, A2 (front of task)
尝试重新排列活动A时,Android首先找到实例A2并将其重新排序到任务的前面。当然,它已经在任务的前面,所以这实际上没有做任何事情。
当然,您已经在此活动上调用了finish()并且尝试过(使用FLAG_ACTIVITY_PREVIOUS_IS_TOP)告诉Android不考虑当前活动来决定要做什么,但所有这些都被忽略了。 Android将A2视为活动A的最新实例,并将其重新排序到前面。然后A2完成,活动B成为任务的前面。用户看到“B”,活动堆栈如下:
A1, B (front of task)

由于这篇文章已经快两年了,我认为你已经找到了另一种达成预期结果的方法,因此你需要寻找其他方式。


4
我通过扩展A类创建了一个新类。 - Kai

1
在我的应用中,我有完全相同的情况。我的解决方案是创建一个不可见的启动活动X,它重定向到A。因此,您的堆栈将如下所示:X A1 B A2。任何时候我需要回到A1,我会倒带到X(使用FLAG_ACIVITY_CLEAR_TOP),然后启动A。

-5
你在调用 startActivity 之前就调用了 finish()。你认为在已经结束后再启动活动是怎么样的呢?
此外,它应该如何知道要将 A 的哪个实例带到前面?

8
您可以调用finish()方法,然后继续进行其他工作,包括启动其他活动。这样做没有问题。调用finish()方法并不会立即结束活动,它只是告诉 Android 您希望该活动结束。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接