使用标志ON_AFTER_RELEASE释放唤醒锁的问题

时间:2013-12-02 21:56:09

标签: android android-activity timer wakelock

我有一项服务需要在服务中发生某些事情时延长系统屏幕超时(没有用户交互。)理想情况,我可以重置“用户活动计时器”使用PowerManager的userActivity(long when,boolean noChangeLights)方法。但是,只需要权限即可授予系统应用程序。

所以,我所做的是使用ON_AFTER_RELEASE标志获取SCREEN_BRIGHT_WAKE_LOCK唤醒锁。根据文档,使用此标志“释放WakeLock时将重置用户活动计时器,导致照明保持更长时间”。

这有效,但我有一些问题。

1)如果在默认屏幕超时后释放唤醒锁,则屏幕不再变暗。示例:屏幕超时为15秒。该服务将唤醒锁定保持30秒,然后释放它,使屏幕保持额外的15秒。屏幕在15秒后关闭,它不会像往常一样变暗。

2)如果在屏幕变暗并即将关闭时释放唤醒锁,有时它会闪烁一秒亮,然后立即再次变暗(而不是从昏暗中直接变亮)。如果获取唤醒锁并在调光期间释放多个连锁,这可能会很快发生很多次,导致屏幕闪烁。

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

1 个答案:

答案 0 :(得分:0)

对于您的1),首先它取决于设备或操作系统。在我使用Android 4.0.X的一些旧设备上,它在唤醒锁定释放调用之后处于昏暗阶段。在较新的设备4.3和4.4上它立即熄灭,没有暗淡的阶段。我所知道的是获取2个唤醒锁,SCREEN_BRIGHT_WAKE_LOCK没有ON_AFTER_RELEASE,SCREEN_DIM_WAKE_LOCK带有ON_AFTER_RELEASE。有了这个,我在所有设备上释放两个锁后都处于暗淡阶段。 示例代码:

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;
    }                   
}

我用5分钟(5 * 60 * 1000)定义了Globals.ALARM_TIMEOUT,你必须选择一个符合你需要的值。

相关问题