2

我在我的应用程序中使用 Wakelock 来防止手机在应用程序可见时进入睡眠状态。

当方向发生变化并且系统在横向模式下销毁并重新创建应用程序时,就会出现问题。如果wakelock 计时器在后台已过期,系统会将wakelock 的释放作为关闭屏幕的机会。

编辑:我应该提到我正在设置唤醒锁 onResume,并释放 onPause - 据我了解,有必要释放然后以防止应用程序泄漏唤醒锁。

我需要唤醒锁来继续改变方向。

下面我概述了一个解决方案。这是处理它的首选方法吗,还有其他选择吗?


创建一个持有唤醒锁(而不是活动)的服务,当活动解除绑定时,服务会启动一个倒计时计时器(例如 10 秒),如果活动没有重新绑定,它将在计时器到期时释放唤醒锁。如果是简单的方向更改,则 Activity 将在那 10 秒内重新绑定并保持唤醒锁,如果没有,唤醒锁将被释放。

谢谢。

4

3 回答 3

4

代替 a WakeLock,尝试getWindow().setFlags()使用WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON标志。

如果wakelock 计时器在后台已过期,系统会将wakelock 的释放作为关闭屏幕的机会。

它不应该。根据定义,用户已经与设备进行了交互,因此屏幕应该保持打开状态,与其他任何东西无关。

于 2010-01-13T17:27:16.590 回答
0

这就是我是如何做到的......

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");

其次是...

wl.acquire();

...当您需要实际激活唤醒锁时。

'PowerManager.ON_AFTER_RELEASE' 标志会触发用户活动计时器,因此当此唤醒锁被释放时,屏幕会停留更长时间,当您的活动因方向改变而被破坏时,就会出现这种情况。

对我来说没问题!

于 2014-02-05T00:20:56.750 回答
0

我实际上从不释放唤醒锁来做到这一点。相反,我通过超时获取它。

private PowerManager.WakeLock wl;

protected void onStart(Bundle savedInstanceState) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Words counter");
    // disable reference counting, as acquire/release calls are not paired
    wl.setReferenceCounted(false);
    wl.acquire();
}

protected void onStop() {
    // acquire for few seconds to keep lock until onStart is called with new orietnation
    wl.acquire(3000);
}

与其他方法相比的优势:

  • 可与SCREEN_DIM_WAKE_LOCK
  • 简单(无需使用 isFinishing() 等)
  • 方向改变后不戳用户活动。即变暗的显示保持变暗
  • 如果你释放(例如时间结束但用户仍然在活动中),它会立即释放。无需等待默认超时。
于 2014-06-30T10:24:12.047 回答