FLAG_ACTIVITY_CLEAR_TOP 和 android:launchMode="singleInstance"

net*_*ein 5 android android-intent android-activity

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

在我的应用程序中,当您尝试使用以下代码将堆栈“清理”到某个点时,如果 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);
Run Code Online (Sandbox Code Playgroud)

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

例子:

A -> B -> C

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

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

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

小智 3

从阅读这个线程:

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

看起来:

“上例中当前运行的 Activity B 实例将要么接收您在其 onNewIntent() 方法中启动的新意图,要么自行完成并使用新意图重新启动。如果它已将其启动模式声明为“ multiple”(默认)并且您没有在相同的 Intent 中设置 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);
Run Code Online (Sandbox Code Playgroud)

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