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

时间:2012-06-13 00:05:07

标签: android android-activity stack

根据Android文档:

http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html

“当用户通过按Home键离开任务时,当前活动停止并且其任务进入后台。系统保留任务中每个活动的状态。如果用户稍后通过选择恢复任务启动任务的启动器图标,任务到达前台并恢复堆栈顶部的活动。“

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

  1. 活动A为主要活动。
  2. 通过“startActivity”开始在A中启动的活动B - 普通的普通意图实例。
  3. 我第一次打开应用程序,A被加载。
  4. 我点击A中的按钮,B是开放的。
  5. 我按下主页按钮。
  6. 我第二次打开应用程序,预计会显示B
  7. ...对吧? 我想这是正确的行为......

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

    如果我点击“主页按钮”然后恢复我的应用程序,按启动器图标,它将从主要活动开始 - 而不是顶部或最新活动。

    我在Samsung Galaxy Tab Android 2.2.1上进行编码 - 我在Android清单中有最常见的选项 - 我处理的是10个不同的活动,具有不同的意图附加功能 - 以及Dispatcher类方法 - 或保存每个活动状态 - 听起来非常苛刻。

    我正在使用带有ADT版本12的Eclipse IDE;我找到了一些非常有趣的东西:

    当我从Eclipse IDE运行应用程序时,连接了我的设备,我没有看到这种行为。该应用程序的行为与文档中所述的相同。 事实上,我只是在将我的apk部署到Google Play应用程序存储库后才看到这个;并将其下载到测试中。

    我的问题是,是否有人发现了这种情况发生的真正原因? 文档错了吗?还是遗失了什么? 这是Android上的错误吗?

    我所做的另一项研究是:

    当我尝试从谷歌播放下载的应用程序作为APK时,如果我第二次进入我的应用程序,我会得到“主要”活动,而不是最后一个打开。我按回家。 按下主页后,我输入android的应用程序管理设置,找到我的应用程序并单击“强制停止”。 执行此操作后,应用程序的行为与文档中所述的相同。

    有人帮忙! :)

3 个答案:

答案 0 :(得分:9)

这是android平台上的一个错误:

http://code.google.com/p/android/issues/detail?id=2373

解决方法是,将其置于主Activity的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;       
    }
}

摘自:

How to prevent multiple instances of an activity when it is launched with different intents

......花了3天的时间来寻找这个。

答案 1 :(得分:2)

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

  1. 当您通过Eclipse或Market App启动应用时,它会使用意图标记启动:FLAG_ACTIVITY_NEW_TASK。

  2. 通过启动器(home)启动时,它使用标志:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,并使用操作“ MAIN ”和类别“ LAUNCHER ”。

  3. 如果您想在测试用例中重现这一点,请使用以下步骤:

    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()解决方法,则会重现该问题。我们在自动测试中使用它来确保此错误不再发生。

    希望这有帮助!

答案 2 :(得分:1)

文档是正确的,我能想到的唯一可能的问题是导致这是您正在测试的设备,如果它在模拟器(Android版本)上按预期工作,它应该至少可以工作90% Androids,它的制造商的错误,我相信不是Android。