如果在手机屏幕被锁定时活动位于前台,广播事件和/或唤醒锁将导致该活动的onResume被调用,无论它们是否适用于您的应用。即使您没有以任何方式与手机互动,也会发生这种情况。不要解锁它,不要触摸它,不要做任何事情,并且在没有相应的onPause的情况下反复调用你的onResume。
我们注意到了这一点,因为我们在onResume上记录了一个跟踪事件,我们注意到有些设备正在获取这些onResume事件的TON。我们能够重新发现并注意到每次任何应用程序似乎都收到了意图(例如SugarSync,Google Voice或我们自己的应用程序中的被动位置监听器)时就会发生这种情况。
我们在运行ICS的Galaxy Nexus和Galaxy S3上注意到了这一点。有趣的是,我们无法在Jelly Bean上重现这个问题。
任何人都有指向这里可能发生的事情的指示?
答案 0 :(得分:19)
我在运行Gingerbread和ICS的几款手机上观察到相同的行为。您的描述与我所看到的相符。由于某种原因,即使屏幕仍处于锁定状态,活动也会触发onResume。也许它恢复到某些操作系统级事件?
来自android文档的最佳方向似乎来自onResume定义中的这一段:
请记住,onResume不是您的活动对用户可见的最佳指标;诸如键盘锁之类的系统窗口可以在前面。使用onWindowFocusChanged(boolean)可以确定您的活动对用户可见(例如,恢复游戏)。
在开发Activity时,请记住onResume可以连续多次调用,无需任何直接的用户交互。所以基本上,不要在onResume中放置任何只能运行一次的代码,或者设计用于触发用户的即时响应。您必须自己决定onResume或onWindowFocusChanged是否更适合您想要做的事情。