2016-09-08 5 views
0

я реализовал wakelock в моем приложении с кодом ниже:Android WakeLock не работают при первом запуске

PowerManager powerManager = (PowerManager)getSystemService(POWER_SERVICE); 
PowerManager.WakeLock wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK,"MyWakelockTag"); 
wakeLock.acquire(); 

Я хочу, чтобы предотвратить экран от идти, когда пользователь находится в моем приложении. Странно, что при первом запуске приложения (сразу после установки) он не работает, и экран отключается, однако после этого, если я закрою приложение и запустил его снова, wakelock работает и не позволяет приложению уходить.
я заметил, что в первый раз, когда я получаю эту ошибку в моем журнале:

WakeLock finalized while still held: MyWakelockTag 

Но в следующих походах я не получаю эту ошибку и все работает.

Я не понимаю, что вызывает эту проблему при первом запуске, и я буду признателен, если кто-то может мне помочь в этом.
Thanks

+0

Покажите мне весь свой код, потому что если есть проблема с указанным кодом, он не будет работать второй раз. Есть некоторые проблемы с его позиционированием. Измените свой вопрос, чтобы выяснить всю проблему. –

+0

добавили это разрешение? '' –

+0

@SyedDaniyalNasir Спасибо, я уверен, что мой код вызывает каждый прогон, но я заметил, что в первом запуске я получаю эту ошибку: WakeLock финализирован в то время как все еще держался: MyWakelockTag , но я не понимаю его в следующих прогонах – m0j1

ответ

0

Хорошо, я считаю, что нашел проблему.

The WakeLock подсчитывается по ссылке. Это означает, что если произойдет второе получение(), это просто вызовет счетчик ссылок. Каждый вызов приобрести() должен быть защищен с помощью вызова isHeld(), как в:

if ((keepScreenOn != null) && (keepScreenOn.isHeld() == false)) { 
keepScreenOn.acquire(); 
} 

Я предположил, приобретающий() на замок я держал не сделал ничего такого множественным приобретать() вызовы вызвали проблему , Поскольку счетчик ссылок не равен нулю, GC генерирует ошибку.

0

Ошибка я получаю в первом запуске приложения было:

WakeLock finalized while still held: MyWakelockTag 

Решение было добавить эту строку в OnDestroy:

if(wakeLock.isHeld()){ 
wakeLock.release(); 
} 
Смежные вопросы