我有 4 个 Activity A、B、C、D、E,每个 Activity 都声明为 android:launchMode="singleInstance"
,A 是 B 的 parentActivity
,B作为 C 的父 Activity,在 list 中。
现在用户像这样导航到 E:A > B > C > D > E。 我在 E 中有一个带有以下 onClickListener 的按钮
Intent intent = new Intent(E.this, C.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
我需要什么?(同样根据文档,如果我理解正确,应该会发生这种情况)
- Activity D 和 E 应该从堆栈中清除
- Activity C 应该恢复接收 Intent (因为设置了 singleInstance,它不会被新创建)
I want this stack: C | B | A
发生了什么?
- Activity C 恢复接收 Intent
- Activity D 和 E 未从堆栈中清除。我可以一次又一次地点击后退按钮来查看 E、D、B、A。
I get this stack: C | E | D | B | A
PS:我的问题与this非常相似但是,那里给出的答案不适合这个问题。我在那里和其他地方找到的一些答案:
- 我不能使用 NEW_TASK 标志,因为我需要让堆栈中的 A、B 保持 Activity 状态。
- 我不能在 D 上使用 startActivityForResult() 然后 finish() 它实际上是一种 hack,因为我在 E 中有其他决定性因素,例如根据用户输入将 Intent 传递给其他一些 Activity 。<
- 我无法在向 E 传递 Intent 时完成 () Activity D,然后在点击 C 时完成 () E,这实际上可以解决问题。但是,如果在 E 上按下后退,我希望它返回到 D 而不是 C。
- 当我在设置标志后执行
startactivity(intent)
后立即在 E 上尝试 finish() 时,它只是完成了 E,但没有完成 D。
最佳答案
Artem Mostyaev 的评论解决了这个难题!使用 singleTask
So what exactly was the mistake?
当 singleInstance
用作 launchMode
,并且当一个 Activity 启动时,Android 确保它在一个新任务中启动,就像 NEW_TASK
一样。添加了标志,它本身是其中唯一的 Activity 。
所以当用户导航到 E 时,堆栈永远不会像 [ A |乙 |丙 | D | E] 相反,有五个不同的任务,例如 [A] [B] [C] [D] [E]。
当我用 CLEAR_TOP
尝试 E > C 时, 它确实在它的任务中搜索了 C 并试图清除 C 之后的所有 Activity 。但是 C 从来没有出现在 E 所在的任务中。
所以它尝试启动一个新的 Activity C,但是当我设置 launchMode
时至 singleInstance
,除了将 [C] 放在前面而其他任务保持不变外,它别无选择。
So how
singleTask
worked?
它像我想要的那样创建了堆栈 [ A |乙 |丙 | D | E] 和 CLEAR_TOP
按预期工作。完成!
关于android - FLAG_ACTIVITY_CLEAR_TOP 没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36111261/