如何只允许一个 Activity 实例,而不会弄乱返回堆栈导航?

Posted

技术标签:

【中文标题】如何只允许一个 Activity 实例,而不会弄乱返回堆栈导航?【英文标题】:How to allow only one instance of an Activity, without messing up the back stack navigation? 【发布时间】: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 中完成您的活动。 【参考方案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。我会试试看。 是的。就是这样。 解释一下这段代码的作用可能会很有用。

以上是关于如何只允许一个 Activity 实例,而不会弄乱返回堆栈导航?的主要内容,如果未能解决你的问题,请参考以下文章

android中的activity的启动方式有哪几种

数组分配中的 C++ 堆内存只会弄乱第一个数组而不是第二个数组

如何修复 Bootstrap 使其不会弄乱登录表单和页脚?

如何使这个 MySQL 函数不会弄乱我的字符集?

让 Flask 的 url_for 在 AWS 负载均衡器中使用“https”方案,而不会弄乱 SSLify

Android 只开启一个Activity实例