【问题标题】:Install via OTA, app starts from splash when minimize and re-enter通过OTA安装,最小化并重新进入时应用程序从启动开始
【发布时间】:2011-10-24 08:29:04
【问题描述】:

简单来说,我编写了一个包含 Splash、Home、Child1 和 Child2 的应用程序,流程如下:Splash -> Home -> Child1 -> Child2。我们可以从 Child2 回到 Child1,从 Child1 回到 Home,从 Home 回到退出应用程序。

听起来很简单。我可以在这些屏幕之间正确导航。

当我通过 OTA 安装应用程序时出现问题。进入 Splash -> Home -> Child1 -> Child2 后。留在 Child2,我按 HOME 按钮最小化应用程序,然后通过选择应用程序图标重新进入应用程序。但是当重新进入应用程序时,它不会在 Child2 处恢复,而是从 Splash -> Home 开始。我无法理解这里发生了什么。它应该在 Child2 处恢复。

更令人惊讶的是,在主屏幕上,当我按下 BACK 按钮以存在应用程序时,现在 Child2 被恢复(o_O)。从 Child2 开始,现在我可以返回 Child1,然后返回 Home,然后再次返回存在的应用程序。

所有这些问题都发生在我通过 OTA 安装应用程序时,但当我通过电缆安装时应用程序正常工作。

谁能告诉我在我的情况下会发生什么?任何帮助表示赞赏

非常感谢。

P/S:我在 Nexus 1 (Android 2.2) 和 Nexus S(Android 2.3.x) 上测试时遇到了这个错误

编辑:即使CNN app for Android 仍然有这个问题......它属于操作系统吗?

【问题讨论】:

  • 您在开始活动时使用哪些标志?听起来您的应用程序正在被系统杀死以释放资源。
  • 因为 Splash 是第一个 Activity 所以我只调用: Intent intent = new Intent(Splash.this, Home.class);开始活动(意图);完成();

标签: android installation ota


【解决方案1】:

我猜这与task affinity 有关。不仅仅是 CNN 应用程序,所有应用程序的行为都是如此,因为一些开发人员(比如我!)不了解任务概念的工作原理。我不会骗你,即使我一直不明白这一点。

我相信这是因为当您从 Market 启动应用时,您的应用成为 Market 任务的一部分。因此,您有一个“属于”市场任务的实例。您可以从中正常导航。当您按 Home 时,所有问题都会发生,因为...

如果您从 Launcher 启动 Activity,则会为该应用启动一个任务,为您提供该应用的 2 个“实例”,一个属于上一个市场任务,另一个属于您自己的应用程序(您是自己任务的根)。

在这个新任务上,您可以向后导航,最终您将到达前一个任务,该任务具有您的应用的另一个实例。您将到达您停止的点(考虑活动的常规启动模式)。有时,这很奇怪,因为我们通常认为一个应用程序只有一个实例,而这不是它的工作方式,也不是它应该如何工作的方式。我将其与在打开两个 Windows 的 Windows 中启动两次应用程序进行了粗略的比较。在 Android 中,这个类比是相似的(至少对我而言)。

当您从另一个应用程序启动您的应用程序时,这一切都很好,当任务概念感觉自然时。

但是,在这种情况下,它变得很奇怪,因为当我们从市场启动活动时,我们希望实例与启动器中的实例相同(从那里启动时)。我们自然不期望用于下载应用程序的市场将拥有我们安装的应用程序,并且我们(显然)希望与市场应用程序分开使用(我认为市场不应该拥有任务使用“打开”按钮时)。

为了解决这个问题,我相信你可以摆弄allowTaskReparenting。但是,如果确实是导致此问题的原因,我不建议这样做,因为这可能会破坏任务系统的其他合法用途。

最后,这就是我相信任务的工作方式,这就是我对这个问题的来源的猜测。我可能是错的,所以如果这个答案以后变得无用,请原谅我(如果你找到另一个原因来回答这个问题)。

祝你好运!

【讨论】:

    【解决方案2】:

    查看您的评论,您一开始新的活动就会终止活动..

    例如如果你这样做:

    startActivity(intent);
    finish(); // THIS WILL KILL THE ACTIVITY -> MAKING IT UNREACHABLE
    

    启动新 Activity 的 Activity 已被终止,无法使用返回按钮访问。

    删除

    finish(); // REMOVE THIS TO KEEP IT ON THE ACTIVITY STACK
    

    在您调用 startActivity(intent) 之后,您的所有活动都应保留在内存中。因此,当您返回时,它们将可以到达。注意:对于 Splash,您确实应该调用 finish(),因为您不想在成功启动后返回 Splash 活动!

    【讨论】:

    • 这不是问题。他只退出启动画面,这是正确的行为。他所描述的是完全不同的行为。
    猜你喜欢
    • 2021-06-11
    • 1970-01-01
    • 2014-09-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多