Android活动堆栈未按照文档中的说明工作-未显示任务堆栈中的最后一个活动

Android活动堆栈未按照文档中的说明工作-未显示任务堆栈中的最后一个活动,android,android-activity,stack,Android,Android Activity,Stack,根据Android文档: “当用户按“主页”按钮离开任务时,当前活动停止,其任务进入后台。系统保留任务中每个活动的状态。如果用户稍后通过选择启动任务的启动器图标来恢复任务,则该任务将出现在前台并在堆栈顶部恢复活动。” 如果我理解正确,这意味着: 活动A作为主要活动 在A中开始的活动B,通过“startActivity”-常见的普通意图实例 我第一次打开应用程序时,会加载一个 我点击A中的按钮,B被打开 我按home键 我再次打开应用程序,这是第二次,预计会显示B ……对吗? 我想这是应该期待的

根据Android文档:

“当用户按“主页”按钮离开任务时,当前活动停止,其任务进入后台。系统保留任务中每个活动的状态。如果用户稍后通过选择启动任务的启动器图标来恢复任务,则该任务将出现在前台并在堆栈顶部恢复活动。”

如果我理解正确,这意味着:

  • 活动A作为主要活动
  • 在A中开始的活动B,通过“startActivity”-常见的普通意图实例
  • 我第一次打开应用程序时,会加载一个
  • 我点击A中的按钮,B被打开
  • 我按home键
  • 我再次打开应用程序,这是第二次,预计会显示B
  • ……对吗? 我想这是应该期待的正确行为

    但是,我在我的应用程序中没有看到这一点

    如果我点击“主页按钮”,然后通过按下启动程序图标继续我的应用程序,它将以主要活动开始,而不是顶部或最新的活动

    我在三星Galaxy Tab Android 2.2.1上编码-我在Android清单中有最常见的选项-事情是我用不同的额外目的处理10个不同的活动-和调度类方法-或保存每个活动状态-听起来要求很高

    我将Eclipse IDE与ADT版本12一起使用;我发现了一些非常有趣的东西:

    当我在设备连接的情况下从Eclipse IDE运行应用程序时,我没有看到这种行为。应用程序的行为如文档中所述。 事实上,我是在Google Play应用程序库中部署我的apk并下载测试后才看到这一点的

    我的问题是,有人找到了这一切发生的真正原因吗? 文档是否有误?或者遗漏了什么? 这是安卓上的一个bug吗

    我做的另一项研究是:

    当我以APK的身份尝试从google play下载的应用程序时,如果我第二次进入我的应用程序,我将获得“主”活动,而不是最后一次打开的活动。我按home。 按home键后,我输入android应用程序管理设置,找到我的应用程序并单击“强制停止”。 执行此操作后,应用程序的行为如文档中所述


    有人帮帮忙!:)

    文档是对的,我能想到的唯一可能的问题是导致这个问题的原因是你正在测试的设备,如果它在模拟器(Android股票)上按预期工作它至少能在90%的机器人上工作,这是制造商的错,我相信不是Android。

    这是Android平台的一个缺陷:

    解决方法是,将其放在主要活动的onCreate方法中:

    if (!isTaskRoot())
    {
        final Intent intent = getIntent();
        final String intentAction = intent.getAction(); 
        if (intent.hasCategory(Intent.CATEGORY_LAUNCHER) && intentAction != null && intentAction.equals(Intent.ACTION_MAIN))
        {
            Log.w(LOG_TAG, "Main Activity is not the root.  Finishing Main Activity instead of launching.");
            finish();
            return;       
        }
    }
    
    摘自:


    …花了3天的时间来寻找这个问题。

    我将解释它失败的原因,以及如何以编程方式重现此错误,以便您可以将其合并到测试套件中:

  • 当您通过Eclipse或Market应用程序启动应用程序时,它会启动意图标志:FLAG_ACTIVITY_NEW_TASK

  • 当通过启动器(主)启动时,它使用标志:FLAG_ACTIVITY_NEW_TASK|FLAG_ACTIVITY_TO_FRONT|FLAG_ACTIVITY_RESET_TASK_(如果需要),并使用动作“MAIN”和类别“launcher”

  • 如果您希望在测试用例中重现此情况,请使用以下步骤:

    adb shell am start -f 0x10000000 -n com.testfairy.tests.regression.taskroot/.MainActivity 
    
    然后做任何需要的事情来进入另一个活动。出于我的目的,我只放置了一个按钮来启动另一个活动。然后,返回启动器(主页),并执行以下操作:

    并用以下方法模拟通过发射器发射:

    adb shell am start -a "android.intent.action.MAIN" -c "android.intent.category.LAUNCHER" -f 0x10600000 -n com.testfairy.tests.regression.taskroot/.MainActivity
    
    如果您没有采用isTaskRoot()解决方法,这将重现问题。我们在自动测试中使用此方法以确保此错误不再发生


    希望这有帮助!

    感谢您的回复。我怀疑我可能会得到与通过eclipse安装应用程序时相同的行为。也许我应该尝试通过emulator命令上传APK,看看会发生什么……是的,我在emulator上有预期的行为……但为什么它在设备上会发生变化,你读过“强制停车”吗“我提到的行动?真奇怪。到目前为止,我已经在2部HTC手机上测试了2.3.X和2.1…以及一部LG手机上测试了2.3.X…但我没有得到预期的行为…当我按home并返回应用程序时,它会加载主活动,而不是堆栈顶部的最新活动:你的活动中没有调用finish的内容,对吗?该应用程序刚刚从应用程序堆栈中删除。看到我的答案,我简直不敢相信,但是的,这是android平台上的一个bug…看起来它已经被报告了两次。。。这真的是随机和令人沮丧的。。。我以为这和设备型号或其他什么有关。。。感谢您跟进SmartLemon:请确保您的清单尽可能“简单”-不要在活动标签上添加任何启动修改器…完美答案,轻松解决了我们3天的问题。非常感谢。该死的,我一直在想过去两天发生了什么,如果我找不到答案,我可能会花更多的时间。。谢谢你,伙计!当您将用户重定向到应用程序之外的某个位置时,例如gps设置和用户使用“后退”按钮返回应用程序时,它似乎也适用。。我想知道为什么重新创建了活动,但没有提供状态包
    adb shell am start -a "android.intent.action.MAIN" -c "android.intent.category.LAUNCHER" -f 0x10600000 -n com.testfairy.tests.regression.taskroot/.MainActivity