4

简单来说,我编写了一个带有 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) 上测试时遇到了这个错误

编辑:即使适用于 Android 的 CNN 应用程序仍然存在这个问题......它属于操作系统吗?

4

2 回答 2

0

看着你的评论,你一开始新的活动就会终止你的活动。

例如,如果你这样做:

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

启动新活动的活动被终止,无法使用后退按钮访问。

去除那个

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

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

于 2011-11-09T18:34:16.300 回答
0

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

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

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

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

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

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

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

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

祝你好运!

于 2011-11-10T04:06:37.643 回答