18

看来,如果在手机屏幕锁定时某个活动在前台,广播事件和/或唤醒锁将导致该活动的 onResume 被调用,无论它们是否用于您的应用程序。即使您不以任何方式与手机互动,也会发生这种情况。不要解锁,不要触摸,不要做任何事情,你的 onResume 会被一遍遍的调用,没有对应的 onPause。

我们注意到这一点是因为我们在 onResume 上记录了一个跟踪事件,并且我们注意到一些设备收到了大量这些 onResume 事件。我们能够重现并注意到每当任何应用程序似乎接收到意图时都会发生这种情况(例如 SugarSync、Google Voice 或我们自己的应用程序中的被动位置侦听器)。

我们在运行 ICS 的 Galaxy Nexus 和 Galaxy S3 上注意到了这一点。有趣的是,我们无法在 Jelly Bean 上重现该问题。

有人对这里可能发生的事情有任何指示吗?

4

1 回答 1

20

我在几部运行 Gingerbread 和 ICS 的手机上观察到了相同的行为。你的描述和我看到的相符。出于某种原因,即使屏幕仍处于锁定状态,活动也会触发 onResume。也许它恢复对某些操作系统级别的事件?

android 文档的最佳方向似乎来自onResume定义中的这一段:

请记住,onResume 并不是您的活动对用户可见的最佳指标;系统窗口(例如键盘保护)可能位于前面。使用 onWindowFocusChanged(boolean) 确定您的活动对用户可见(例如,恢复游戏)。

在开发 Activity 时,请记住 onResume 可能会被快速连续调用多次,而无需任何直接的用户交互。因此,基本上,不要在 onResume 中放置任何只能运行一次或旨在触发用户立即响应的代码。您必须自己决定 onResume 或 onWindowFocusChanged 是否更适合您想要做的事情。

于 2012-12-21T17:18:20.733 回答