2013-12-02 2 views
0

У меня есть служба, которая должна продлить тайм-аут экрана системы, когда что-то происходит в сервисе (взаимодействие с пользователем отсутствует) В идеале, я мог бы просто сбросить «активность пользователя» таймер "с помощью метода userActivity PowerManager (long when, boolean noChangeLights). Однако для этого требуется разрешение только для системных приложений.Проблемы с выпуском wakelock с флагом ON_AFTER_RELEASE

Итак, я сделал, чтобы получить wakelock SCREEN_BRIGHT_WAKE_LOCK с флагом ON_AFTER_RELEASE. Согласно документации, с этим флагом «таймер активности пользователя будет сброшен при освобождении WakeLock, в результате чего подсветка будет оставаться немного дольше».

Это работает, но у меня есть некоторые проблемы.

1) Если громкоговоритель освобожден после таймаута по умолчанию, экран больше не тускнеет. Пример: Тайм-аут экрана равен 15 с. Служба хранит wakelock в течение 30 секунд, а затем освобождает его, заставляя экран оставаться на дополнительные 15 секунд. Экран просто выключается через 15 секунд, он не тускнет первым, как обычно.

2) Если громкоговоритель отпущен, когда экран погас, и он погаснет, иногда он мгновенно вспыхивает ярким светом, а затем сразу же затемняется (вместо того, чтобы выходить из тусклого света и светить сразу). Это может произойти во много раз быстрее, вызвав мерцание экрана, если wakelock будет получен и выпущен несколько тимов в течение периода затемнения.

Как я могу достичь того, что я действительно хочу, чтобы сбросить «таймер активности пользователя», как если бы пользователь коснулся устройства?

ответ

0

Для вашего 1), сначала это зависит от устройства или ОС. На некоторых из моих старых устройств с Android 4.0.X он работал с тусклой фазой после вызова релиза Wakelock. На более новых устройствах 4.3 и 4.4 он немедленно отключается, без тусклой фазы. То, что я знаю, - это 2 wakelocks, 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; 
    }     
} 

Я определил Globals.ALARM_TIMEOUT с 5 минут (5 * 60 * 1000), вы должны выбрать значение, которое соответствует вашим потребностям.