FLAG_ACTIVITY_CLEAR_TOP无法正常工作

Sar*_*ran 2 android android-intent android-activity

我在清单中有4个活动A,B,C,D,E,每个活动都声明为android:launchMode="singleInstance",A parentActivity为B,而B为C的父活动。

现在用户像这样导航到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);
Run Code Online (Sandbox Code Playgroud)

我需要的?(也根据文档,如果我理解正确,应该会发生这种情况)

  • 活动D和E应该从堆栈中清除
  • 应恢复活动C的意图(由于设置了singleInstance,因此不会重新创建它)

    我想要这个堆栈:C | B | 一种

发生了什么?

  • 继续接受活动的活动C
  • 活动D和E 不会从堆栈中清除。我可以一次又一次单击“后退”按钮以查看E,D,B,A。

    我得到这个堆栈:C | E | D | B | 一种

PS:我的问题与非常相似,但是那里给出的答案不适合这个问题。我在其他地方找到的一些答案:

  1. 我不能使用NEW_TASK标志,因为我需要保持堆栈中的A,B处于活动状态。
  2. 我不能在D上使用startActivityForResult()然后再完成()这实际上是一个hack,因为我在E中还有其他决定性因素,例如根据用户输入将意图传递给其他活动。
  3. 我无法在向E传递意图时完成(D)活动D,而在击中C时却完成E(事件E),这实际上可以解决问题。但是,如果在E上按了back,我希望它返回D,而不是C。
  4. 当我startactivity(intent)在设置标志后立即尝试对E进行finish()时,它只是完成E,而不完成D。

Sar*_*ran 5

Artem Mostyaev的评论解决了这个难题!使用singleTask

那到底是什么错误呢?

singleInstance将用作launchMode和时,以及启动活动时,Android会确保在新任务中启动它,就像NEW_TASK添加了标志一样,它本身是其中的唯一活动。

因此,当用户导航到E时,堆栈就不再像[A | B | C | D | E]而是有五个不同的任务,例如[A] [B] [C] [D] [E]。

当我尝试使用E> C时CLEAR_TOP,它确实在任务中搜索了C并试图清除C之后的所有活动。但是C永远不在E所在的任务中。

因此,它尝试启动一个新的活动C,但是正如我所设定launchModesingleInstance,它别无选择,只能使[C]领先,同时保持其他任务不变。

那么如何singleTask工作?

它创建了我想要的堆栈[A | B | C | D | E]并按CLEAR_TOP预期工作。做完了!

  • 很好的解释!比我的好:) (2认同)