如果后台堆栈中已经存在,则恢复 Activity 而不是启动

Posted

技术标签:

【中文标题】如果后台堆栈中已经存在,则恢复 Activity 而不是启动【英文标题】:Resume the Activity instead of Starting if already exists in back stack 【发布时间】:2013-02-27 20:12:20 【问题描述】:

经过很多步骤后,我有一个Activity_1,比如说

Activity_2 > Activity_3 .... 在某些Activity_n 我更改了一些与Activity_1 相关的数据并使用

Intent intent = new Intent(Activity_n.this, Activity_1.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

刷新内容。但后来我可以一路回到我开始的Activity_1,那里有旧数据。

相反,我希望使用上面的代码调用初始 Activity_1onResume()。或适当的标记

FLAG_ACTIVITY_CLEAR_TOP

考虑一个由以下活动组成的任务:A、B、C、D。如果 D 调用 startActivity() 的 Intent 解析为 活动B,然后C和D将完成,B收到给定的 意图,导致堆栈现在是:A,B。

这是文档所说的,但不是我得到的。

【问题讨论】:

【参考方案1】:

你可以加这两行试试

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

在你的清单文件中写入 Activity

<activity
     android:name=".SettingsActivity"
     android:launchMode="singleInstance"
     android:screenOrientation="portrait" >
</activity>

“singleTask”和“singleInstance”活动只能开始一个任务。它们始终位于活动堆栈的根部。此外,设备一次只能保存一个 Activity 实例——只能完成一个这样的任务。

您可以使用 SingleTask 或 SingleInstance

"singleTask" - 系统在新任务的根目录创建活动并将意图路由到它。但是,如果 Activity 的实例已经存在,系统会通过调用其 onNewIntent() 方法将 Intent 路由到现有实例,而不是创建一个新实例。

"singleInstance" - 与"singleTask" 相同,只是系统不会在持有该实例的任务中启动任何其他活动。 Activity 始终是其任务中唯一且唯一的成员。

参考此链接http://developer.android.com/guide/topics/manifest/activity-element.html

【讨论】:

但这是我正在使用的片段。到目前为止,我一直在使用 FragmentonResume()。其中不包含像onNewIntent() 这样的任何东西。但是没有办法清除整个后台堆栈并调用新的 Activity 看到我已经添加了两行你可以尝试这种方式 singleInstance 和 singleTask “不适用于大多数应用程序,因为它们会导致用户可能不熟悉并且与大多数其他应用程序非常不同的交互模型。”我建议寻找另一种解决方案,因为这些更适合与小部件等一起使用。 android:launchMode="singleInstance" 对我来说已经足够了【参考方案2】:
intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

访问:http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_REORDER_TO_FRONT

【讨论】:

这是launchmode="SingleInstance" 的一个更好的版本。我一直在寻找这面旗帜。 这对我来说很好用。就我而言,我需要从后台打开一个活动并避免两次启动该活动。我只在这种情况下需要这种行为。【参考方案3】:

如果存在则从后台恢复Activity,如果不存在则创建一个新的

android:launchMode="singleTask"

将此行添加到您应用的 AndroidManifest.xml 并使用正常的Intent 启动 Activity。

【讨论】:

以上是关于如果后台堆栈中已经存在,则恢复 Activity 而不是启动的主要内容,如果未能解决你的问题,请参考以下文章

如何以挂起的意图启动 Activity 并清除所有后台堆栈?

Android 任务栈

调用 Activity.Recreate() 后维护我的 Activity 后台堆栈的最佳方法是啥?

活动回栈 FLAG_ACTIVITY_NEW_TASK

从后台堆栈恢复片段时的 savedInstanceState

如何将动态解析的活动名称添加到后台堆栈(不使用 PARENT_ACTIVITY)?