根据Android文档:
http://developer.android.com/guide/topics/fundamentals/tasks-and-back-stack.html
“当用户通过按Home键离开任务时,当前活动停止并且其任务进入后台。系统保留任务中每个活动的状态。如果用户稍后通过选择恢复任务启动任务的启动器图标,任务到达前台并恢复堆栈顶部的活动。“
如果我理解正确,这意味着:
...对吧? 我想这是正确的行为......
但是,我的应用程序中没有看到这一点。
如果我点击“主页按钮”然后恢复我的应用程序,按启动器图标,它将从主要活动开始 - 而不是顶部或最新活动。
我在Samsung Galaxy Tab Android 2.2.1上进行编码 - 我在Android清单中有最常见的选项 - 我处理的是10个不同的活动,具有不同的意图附加功能 - 以及Dispatcher类方法 - 或保存每个活动状态 - 听起来非常苛刻。
我正在使用带有ADT版本12的Eclipse IDE;我找到了一些非常有趣的东西:
当我从Eclipse IDE运行应用程序时,连接了我的设备,我没有看到这种行为。该应用程序的行为与文档中所述的相同。 事实上,我只是在将我的apk部署到Google Play应用程序存储库后才看到这个;并将其下载到测试中。
我的问题是,是否有人发现了这种情况发生的真正原因? 文档错了吗?还是遗失了什么? 这是Android上的错误吗?
我所做的另一项研究是:
当我尝试从谷歌播放下载的应用程序作为APK时,如果我第二次进入我的应用程序,我会得到“主要”活动,而不是最后一个打开。我按回家。 按下主页后,我输入android的应用程序管理设置,找到我的应用程序并单击“强制停止”。 执行此操作后,应用程序的行为与文档中所述的相同。
有人帮忙! :)
答案 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)
我只想解释它失败的原因,以及如何以编程方式重现此错误,以便将其合并到测试套件中:
当您通过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()解决方法,则会重现该问题。我们在自动测试中使用它来确保此错误不再发生。
希望这有帮助!
答案 2 :(得分:1)
文档是正确的,我能想到的唯一可能的问题是导致这是您正在测试的设备,如果它在模拟器(Android版本)上按预期工作,它应该至少可以工作90% Androids,它的制造商的错误,我相信不是Android。