我有一项服务需要在服务中发生某些事情时延长系统屏幕超时(没有用户交互。)理想情况,我可以重置“用户活动计时器”使用PowerManager的userActivity(long when,boolean noChangeLights)方法。但是,只需要权限即可授予系统应用程序。
所以,我所做的是使用ON_AFTER_RELEASE标志获取SCREEN_BRIGHT_WAKE_LOCK唤醒锁。根据文档,使用此标志“释放WakeLock时将重置用户活动计时器,导致照明保持更长时间”。
这有效,但我有一些问题。
1)如果在默认屏幕超时后释放唤醒锁,则屏幕不再变暗。示例:屏幕超时为15秒。该服务将唤醒锁定保持30秒,然后释放它,使屏幕保持额外的15秒。屏幕在15秒后关闭,它不会像往常一样变暗。
2)如果在屏幕变暗并即将关闭时释放唤醒锁,有时它会闪烁一秒亮,然后立即再次变暗(而不是从昏暗中直接变亮)。如果获取唤醒锁并在调光期间释放多个连锁,这可能会很快发生很多次,导致屏幕闪烁。
如何实现我真正想要的,即重置“用户活动计时器”,就像用户触摸设备一样?
答案 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,你必须选择一个符合你需要的值。