如何使用不同的Intent启动Activity时,如何阻止它的多个实例

如何使用不同的Intent启动Activity时,如何阻止它的多个实例

当我使用Google Play商店应用程序(以前称为Android Market)上的“打开”按钮启动时,我在应用程序中遇到了一个错误。似乎从Play商店启动它与使用Intent图标的手机应用程序菜单启动它不同。这导致启动相同活动的多个副本,这些副本彼此冲突。

例如,如果我的应用程序由活动ABC组成,那么此问题可能会导致一堆ABCA。

我尝试使用android:launchMode="singleTask"所有活动来解决这个问题,但每当我点击HOME按钮时,它都会产生不必要的副作用,即将活动堆栈清除为root。

预期的行为是: ABC - > HOME - >当应用程序恢复时,我需要:ABC - > HOME - > ABC

是否有一种很好的方法可以防止启动相同类型的多个活动,而无需在使用HOME按钮时重置为根活动?


墨色风雨
浏览 816回答 3
3回答

jeck猫

将此添加到onCreate,你应该很高兴:// Possible work around for market launches. See https://issuetracker.google.com/issues/36907463// for more details. Essentially, the market launches the main activity on top of other activities.// we never want this to happen. Instead, we check if we are the root and if not, we finish.if (!isTaskRoot()) {    final Intent intent = getIntent();    if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && Intent.ACTION_MAIN.equals(intent.getAction())) {        Log.w(LOG_TAG, "Main Activity is not the root.  Finishing Main Activity instead of launching.");        finish();        return;           }}

芜湖不芜

我只想解释它失败的原因,以及如何以编程方式重现此错误,以便将其合并到测试套件中:当您通过Eclipse或Market App启动应用程序时,它会使用意图标志启动:FLAG_ACTIVITY_NEW_TASK。通过启动器(home)启动时,它使用标志:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,并使用操作“ MAIN ”和类别“ LAUNCHER ”。如果您想在测试用例中重现这一点,请使用以下步骤:adb shell am start -f 0x10000000 -n com.testfairy.tests.regression.taskroot/.MainActivity 然后做任何事情来进行其他活动。为了我的目的,我只是放了一个按钮来启动另一个活动。然后,回到启动器(主页):adb shell am start -W -c android.intent.category.HOME -a android.intent.action.MAIN并模拟通过启动器启动它:adb shell am start -a "android.intent.action.MAIN" -c "android.intent.category.LAUNCHER" -f 0x10600000 -n com.testfairy.tests.regression.taskroot/.MainActivity如果您尚未合并isTaskRoot()解决方法,则会重现该问题。我们在自动测试中使用它来确保此错误不再发生。希望这可以帮助!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android