释放带有标志ON_AFTER_REEASE的唤醒锁时出现问题



我有一个服务,当服务中发生某些事情(没有用户交互)时,它需要在超时时扩展系统屏幕。理想情况下,我可以使用PowerManager的userActivity(long-when,boolean noChangeLights)方法重置"用户活动计时器"。然而,这需要一个只有系统应用程序才能被授予的权限。

因此,我所做的是获取一个带有ON_AFTER_REEASE标志的SCREEN_BRIGHT_WAKE_LOCK唤醒锁。根据文件,有了这个标志,"当WakeLock释放时,用户活动计时器将重置,从而使照明保持更长时间"。

这行得通,但我有一些问题。

1) 如果在默认屏幕超时后释放唤醒锁,屏幕将不再变暗。示例:屏幕超时为15s。该服务将唤醒锁定保持30秒,然后将其释放,导致屏幕多停留15秒。屏幕在15秒后关闭,不像往常一样先变暗。

2) 如果在屏幕变暗并即将熄灭时释放唤醒锁,有时它会闪烁一秒钟,然后立即再次变暗(而不是从变暗状态直接变亮)。如果在调光期间多次获取并释放唤醒锁,这种情况可能会快速发生多次,从而导致屏幕闪烁。

我如何才能实现我真正想要的,即重置"用户活动计时器",就好像用户触摸了设备一样?

对于您的1),首先它取决于设备或操作系统。在我的一些安卓4.0.X旧设备上,它在唤醒释放后的一个暗淡阶段工作。在更新的设备4.3和4.4上,它会立即熄灭,没有暗淡的相位。我所知道的是aquire 2唤醒锁,SCREEN_BRIGHT_WAKE_LOCK不带ON_AFTER_LEASE,SCREEN_DIM_WAKE_LOCK带ON_AFTSER_REEASE。这样,在释放所有设备上的两个锁后,我的相位变暗了。样本代码:

private WakeLock alarmWakeLock = null;
private WakeLock alarmWakeLockDim = null;
public void wakeUp()
{
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    alarmWakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | 
         PowerManager.ACQUIRE_CAUSES_WAKEUP , "WakeLock");
    if ((alarmWakeLock != null) && (alarmWakeLock.isHeld() == false))
        alarmWakeLock.acquire(Globals.ALARM_TIMEOUT);
    alarmWakeLockDim = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
         PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.ON_AFTER_RELEASE, "WakeLockDim");
    if ((alarmWakeLockDim != null) && (alarmWakeLockDim.isHeld() == false))
         alarmWakeLockDim.acquire(Globals.TALARM_TIMEOUT);
}
public void sleep()
{
    if ( alarmWakeLock != null && alarmWakeLock.isHeld() )
    {
        alarmWakeLock.release();
        alarmWakeLock = null;
    }
    if ( alarmWakeLockDim != null && alarmWakeLockDim.isHeld() )
    {
        alarmWakeLockDim.release();
        alarmWakeLockDim = null;
    }                   
}

我定义了Globals。ALARM_TIMEOUT与5分钟(5*60*1000),您必须选择一个适合您需求的值。

最新更新