FLAG_ACTIVITY_CLEAR_TOP 和 android:launchMode="singleInstance"

问题描述 投票:0回答:2

我想我刚刚发现了一个非常奇怪的错误...但这可能只是我从未听说过的某种功能。

在我的应用程序中,当您尝试使用以下代码将堆栈“清理”到某个点时,如果 AndroidManifest 上有任何带有 android:launchMode="singleInstance" 的 Activity:

    Intent intent = new Intent(this, Xpto.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP
            | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

转到该活动。但是当你按回车键时,又回到了之前的状态。本来应该已经完成了...

示例:

A -> B -> C

然后从 C 我用 Intent.FLAG_ACTIVITY_SINGLE_TOP| 调用 A Intent.FLAG_ACTIVITY_CLEAR_TOP 在清单上有一个 singleInstance。它转到 A,但仅将其带到前面。并且没有完成 C 和 B。

有人可以解释这种行为吗?

我调用的 Xpto 类当时是堆栈的根活动。

android android-intent android-activity
2个回答
3
投票

阅读此主题:

http://groups.google.com/group/android-developers/browse_thread/thread/5eb400434e2c35f4

看来:

“上例中当前运行的 Activity B 实例将 要么接收您在 onNewIntent() 中开始的新意图 方法,或者本身完成并以新意图重新启动。如果它 已声明其启动模式为“多重”(默认),并且您有 没有在相同的意图中设置 FLAG_ACTIVITY_SINGLE_TOP ,那么它将是 完成并重新创建;对于所有其他启动模式或者如果 设置 FLAG_ACTIVITY_SINGLE_TOP 然后这个 Intent 将被传递到 当前实例的 onNewIntent()。 ”

这意味着您需要将 launchMode 设置为多个实例,并且仅使用 FLAG_ACTIVITY_CLEAR_TOP。

Intent intent = new Intent(this, Xpto.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);

在您描述的场景中,当您启动活动 A(这是根活动)时,活动 B 和 C 尚未完成。文档描述了使用 singleInstance 的启动模式并且设置了 FLAG_ACTIVITY_SINGLE_TOP 标志,活动 B 和 C 将不会完成。如果您希望完成活动 B 和 C,则必须将启动模式设置为多个实例,并且不要设置标志 FLAG_ACTIVITY_SINGLE_TOP。


0
投票

我偶然发现了这个问题并决定回答它,尽管它已经很老了。准确的答案是,具有 singleInstance 启动模式的 Activity 始终在新任务中启动,并且将成为该任务中的唯一 Activity。例如,如果您的 Activity A 具有 singleInstance 启动模式,则它将存在于其自己的单独任务中。如果您随后打开活动 B 和 C,它们将在不同的任务中开始。如果您重新打开活动 A,活动 B 和 C 将保留在其任务中,而包含 A 的任务将被带到前台,并且意图将传递给其 onNewIntent() 方法。

© www.soinside.com 2019 - 2024. All rights reserved.