我有一个服务,当服务中发生某些事情(没有用户交互)时,它需要在超时时扩展系统屏幕。理想情况下,我可以使用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),您必须选择一个适合您需求的值。