使用FLAG_ACTIVITY_REORDER_TO_FRONT将活动置于最前面

时间:2011-02-11 00:02:19

标签: android

我的活动堆栈是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 个答案:

答案 0 :(得分:18)

使用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)

你需要找到另一种方法来达到预期的效果(因为这篇文章差不多有2年了,我认为你已经找到了另一种方法)。

答案 1 :(得分:1)

在我的应用中,我的情况完全相同。

我的解决方案是创建一个不可见的启动活动X,它重定向到A

所以你的堆栈看起来像这样:

X A1 B A2

在任何时候我需要回到A1,我会回到X(使用FLAG_ACIVITY_CLEAR_TOP),然后它将启动A。

答案 2 :(得分:-5)

在调用startActivity之前,您正在调用finish()。你怎么认为它应该在它已经完成后开始活动?

另外,它应该如何知道A的哪个实例带到前面?