2012-07-30 44 views
14

看起来,如果在电话屏幕锁定时某个活动位于前台,广播事件和/或唤醒锁定将导致该活动的onResume被调用,无论它们是有意的为您的应用程序或不。即使您不以任何方式与手机进行交互,也会发生这种情况。不要解锁它,不要触摸它,不要做任何事情,并且你的onResume会被反复调用而没有相应的onPause。onResume在电话屏幕被锁定时被反复呼叫

我们注意到这一点,因为我们记录了一个跟踪事件onResume,并且我们注意到有些设备正在获取这些onResume事件的TON。我们可以复制并注意到,每当任何应用似乎收到意图(例如SugarSync,Google Voice或我们自己的应用中的被动位置监听器)时,都会发生这种情况。

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

任何人都有可能在这里发生的事情的任何指针?

+1

同样在这里。 Galaxy Tab ICS。 – 2013-09-02 13:45:33

+2

Yup,运行4.4.4的Nexus 5每隔200毫秒关闭一次屏幕,调用'onResume()'。 – 2014-07-07 16:40:56

回答

16

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

从Android文档的最佳方向似乎是从本段的onResume定义:

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

在开发您的活动时,请记住,可以快速连续多次调用onResume,而无需任何直接的用户交互。所以基本上,不要把任何代码放在只能运行一次的onResume中,或者设计为触发用户的即时响应。你必须自己决定onResume还是onWindowFocusChanged对于你想要做的更好。