FLAG_ACTIVITY_CLEAR_TOP无法按预期工作

时间:2016-03-20 07:28:36

标签: 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);

我需要什么?(同样根据文档,如果我理解正确,这应该发生)

  • 活动D和E应从堆栈中清除
  • 活动C应该恢复接收意图(因为设置了singleInstance,它不会被新创建)
      

    我想要这个堆栈:C | B |甲

发生了什么?

  • 恢复活动C接收意图
  • 活动D和E从堆栈中清除 NOT 。我可以再次点击后退按钮看E,D,B,A。
      

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

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

  1. 我无法使用NEW_TASK标志,因为我需要将A,B保持在堆栈中。
  2. 我不能在D上使用startActivityForResult()然后完成()它实际上是一个hack,因为我在E中有其他决定性因素,例如根据用户输入将意图传递给其他一些活动。
  3. 我不能完成()活动D,同时向E提供意图,然后在击中C时完成()E,这实际上可以解决问题。但是,如果在E上按下后退,我希望它返回到D而不是C.
  4. 当我在设置标志后{E = 1}}尝试完成()后,它只完成E,但不是D。

2 个答案:

答案 0 :(得分:5)

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

  

究竟是什么错误

singleInstance用作launchMode时,以及启动活动时,Android会确保在新任务中启动它,就好像添加了NEW_TASK标志一样它内部唯一的活动。

因此,当用户导航到E时,堆栈永远不会像[A | B | C | D | E] 相反,有五个不同的任务,如[A] [B] [C] [D] [E]。

当我尝试E>在CLEAR_TOP的情况下,它确实在其任务中搜索了C并尝试清除C之后的所有活动。但是C在E所在的任务中从未出现过。

所以它尝试启动一个新的活动C,但是当我将launchMode设置为singleInstance时,它除了将[C]保持在前面而没有触及其他任务之外别无他法。

  

那么singleTask如何运作?

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

答案 1 :(得分:1)

问题出在android:launchMode="singleInstance"。根据singleInstance的documentation

  

如果此活动尝试启动新活动,则该新活动将启动   在一项单独的任务中启动。

因此,您的活动D作为新任务启动,这就是为什么不删除它。