2

根据 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是openend。
  5. 我按主页按钮。
  6. 我第二次再次打开应用程序,预计会显示 B

...正确的?我想这是期望的正确行为......

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

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

我在三星 Galaxy Tab Android 2.2.1 上进行编码 - 我在 Android 清单中有最常见的选项 - 事情是我处理 10 个不同的活动,具有不同的意图额外内容 - 以及 Dispatcher 类方法 - 或保存每个活动状态 -听起来要求很高。

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

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

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

我做过的另一项研究是:

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

有人帮忙!:)

4

3 回答 3

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;       
    }
}

摘自:

当以不同的意图启动活动时如何防止活动的多个实例

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

于 2012-06-14T22:21:26.783 回答
2

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

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

  2. 通过启动器(主页)启动时,它使用标志: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() 解决方法,这将重现问题。我们在我们的自动测试中使用它来确保这个错误不再发生。

希望这可以帮助!

于 2014-04-05T15:10:17.823 回答
1

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

于 2012-06-13T01:15:11.710 回答