Android的活动堆栈不工作作为文档中阐明的 - 在任务堆栈中最后一项活动未显示(Android

2019-06-25 10:46发布

根据Android的文档:

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

“当用户离开按Home键任务,当前活动停止,其任务进入后台,系统保留在任务的每一次活动的状态。如果用户稍后通过选择启动器图标恢复任务始于任务,任务涉及到前台,并在堆栈的顶部重新开始活动。”

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

  1. 活性A作为主要活动。
  2. 常见的,普通的意图实例 - 即获取一个开始,通过“startActivity”活动B。
  3. 我打开应用程序的第一次,一个被加载。
  4. 我在点击按钮和B的双头呆。
  5. 我按Home键。
  6. 我再次打开的应用程序,为第二次,和B预计将显示

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

不过,我不是在我的应用程序看到这一点。

没有一个在顶部或最近一个 - 如果我点击“Home键”,然后继续我的应用程序,按下启动器图标,它将与主要活动开始。

我编码在三星Galaxy Tab的Android 2.2.1 - 我在Android清单最常用的选项 - 事情是,我处理这样不同的意图额外10个不同的活动 - 和Dispatcher类的方法 - 或保存每个活动状态 - 听起来很苛刻。

我使用的Eclipse IDE与ADT 12版; 我发现了一些很有趣的:

当我运行从Eclipse IDE中的应用程序,与我的设备连接,我没有看到这种行为。 该应用程序表现为在文档中阐明。 事实上,我看到这个后,才部署了我的apk在谷歌Play应用程序库; 并下载它来测试。

我的问题是,已经有人找到了真正的原因,为什么会这样? 是文档错了吗? 还是失去了一些东西? 这是Android上的错误吗?

我已经做了另一项研究是:

当我尝试我的应用程序,从谷歌Play下载,因为APK,如果我进入我的应用程序的第二次,我得到了“主要”活动,而不是最后一个双头呆的。 我按HOME。 按HOME键之后,我进入应用管理设置为Android,找到我的应用程序,然后点击“强行停止”。 这样做后,应用程序的文档表现为说。

有人帮助! :)

Answer 1:

这是Android的平台中的错误:

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

解决方法是,放置这在主要活动的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天寻找出这一点。



Answer 2:

我只是要解释失败的原因,以及如何以编程方式重现此错误,因此您可以在您的测试套件包括这样的:

  1. 当您启动通过Eclipse或市场应用的应用程序,它意图标志启动:FLAG_ACTIVITY_NEW_TASK。

  2. 当通过发射器(家)推出,它使用标志:FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_BROUGHT_TO_FRONT | FLAG_ACTIVITY_RESET_TASK_IF_NEEDED,并用行动“MAIN”类和“ 启动器 ”。

如果您想重现这一在测试时,使用以下步骤:

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()的解决方法,这将重现该问题。 我们使用这个在我们的自动测试,以确保这个错误不会再发生。

希望这可以帮助!



Answer 3:

该文档是正确的,唯一可能的问题,我能想到的,是造成这是要测试的设备,如果它按预期工作在模拟器上(这是普通的Android),它可以工作在至少90%的机器人会的,其生产故障为了这个,我相信不是Android系统。



文章来源: Android Activity Stack is not working as stated in the docs - last activity in task stack not shown