我的活动堆栈是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,这不是我的预期。
有什么想法吗?
感谢。
答案 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的哪个实例带到前面?