如何检查活动是否可见? onResume是不够的

时间:2012-08-22 10:08:52

标签: android android-activity android-lifecycle

我的一项活动是嵌入VideoView来播放一些内容。我分别在onPause()onResume()中实现了暂停/恢复视频,但令我惊讶的是,在用户真正看到该活动之前调用了onResume

确切地说,情况如下:

  • 活动在屏幕上,正在播放视频
  • 用户使用电源按钮锁定手机
  • 活动被调用onPause(),视频停止
  • 用户按下电源按钮
  • 活动在用户解锁屏幕之前调用onResume()(从而恢复视频)

我在Android 2.2,2.3和4.0中证实了这一行为。我想它是故意这样做的,让活动准备在锁定屏幕消失后立即重绘。

如何检测活动实际出现在用户身上的那一刻?我试图等待onWindowFocusChanged(true)被叫,它似乎有效,但它并没有让我觉得非常安全。

2 个答案:

答案 0 :(得分:8)

您需要等待onWindowFocusChanged事件以及OnResume事件。这是Android 4.1+中不再出现的众所周知的问题。详情请见http://android-developers.blogspot.co.uk/2011/11/making-android-games-that-play-nice.html

答案 1 :(得分:0)

一般情况onResume应该足够了,但对于您的特殊情况,我认为您应该恢复不在onResume()上的视频,而是在用户解锁屏幕时。

要实现这一目标,您需要制作一个BroadcastReceiver来监听名为Intent.ACTION_USER_PRESENT的意图,并在onReceive中恢复您的视频。

  

Intent.ACTION_USER_PRESENT:
  设备唤醒后用户在场时发送   (例如当键盘消失时)   这是一个可以保护的意图   只能由系统发送。