【问题标题】:How to allow only one instance of an Activity, without messing up the back stack navigation?如何只允许一个 Activity 实例,而不会弄乱返回堆栈导航?
【发布时间】:2020-04-06 18:46:50
【问题描述】:

假设我有以下活动:

  • 一个;
  • 乙;
  • C 和;
  • D;

我希望 Activity C 只有一个实例。

如果用户进行以下导航:

A→C→B→D→C→B→C

我应该在我的项目中做什么,当用户开始通过其导航返回时,结果如下:

A ← B ← D ← B ← C


我尝试在应用程序的AndroidManifest 上的 C 活动中使用 launchMode 的所有可用标志值,但它们都没有给出预期的结果。


我的示例AndroidManifest 活动条目就这么简单:

<activity
    android:name="A" />

<activity
    android:name="B" />

<activity
    android:name="C"
    android:launchMode="singleTask" />

<activity
    android:name="D" />

【问题讨论】:

  • 您能在此处添加清单代码吗?
  • @Sunny,我刚刚编辑了问题:)
  • 每当你从 C 启动任何活动而不是完成 C 时。
  • @ShivamYadav,如果我这样做,在执行以下导航 A → C → B 并开始返回后,我将无法从 B 返回 C =/
  • @AugustoCarmo ,另一种解决方案是使用 startActivityForResult 并在活动 C 的 OnResult 中完成您的活动。

标签: android android-activity android-manifest single-instance launchmode


【解决方案1】:

使用FLAG_ACTIVITY_REORDER_TO_FRONT:

Intent intent = new Intent(this, C.class);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
startActivity(intent);

根据文档:

如果在传递给 Context#startActivity 的 Intent 中设置,此标志将 导致启动的活动被带到其任务的前面 历史堆栈(如果它已经在运行)。

例如,考虑一个由四个活动组成的任务:A、B、C、 D. 如果 D 调用 startActivity() 的 Intent 解析为 活动B的组件,那么B将被带到前面 历史堆栈,结果顺序为:A、C、D、B。此标志将 如果还指定了 FLAG_ACTIVITY_CLEAR_TOP,则将被忽略。

【讨论】:

  • 非常感谢您的回答,@SaurabhThorat :)。这就是全部吗? :o。我会试试看。
  • 是的。就是这样。
  • 解释一下这段代码的作用可能会很有用。
猜你喜欢
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2020-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多