2013-08-30 3 views
1

У меня есть приложение, которое воспроизводит телевизионные потоки и должно быть включено все время. я приобрести замок бодрствование в OnCreate()Android Power Manager Wake Lock

pm = (PowerManager) getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG); 
wl.acquire(); 

, а затем выпустить в OnDestroy()

if (wl != null) { 
    wl.release(); 
    wl = null; 
} 

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

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

Является ли это лучшей практикой для управления Android Power Manager Wake Lock?

Любые мнения приветствуются.

+4

Опубликуйте LogCat !! – Nargis

ответ

0

попробовать это:

wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "My Tag"); 

и не забудьте разрешения:

<uses-permission android:name="android.permission.WAKE_LOCK" /> 
+0

спасибо, но я не могу использовать DIM. В противном случае это то же самое, что и мое решение. – MartinC

1

дополнительные, чтобы silvia_aut ответ, попробуйте

if (wakelock.isHeld()) 
     wakelock.release(); 
+0

внесите это, увидим, спасибо – MartinC

+0

Если вы сделаете это так, ваши переменные pm и wl могут быть локальными. Получите ваш экземпляр, как будто у вас уже есть wl = pm.newWakeLock (PowerManager.SCREEN_BRIGHT_WAKE_LOCK, TAG); 'и просто посмотрите, удерживается он или нет. – TomBoo

+0

Да, вот что я сделал. Спасибо, я рад обратной связи. – MartinC

1

Затем используйте это в OnCreate после setContentView:

getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); 

Должен помочь.

+0

Я предполагаю, что это решает тот факт, что старые константы Power Manager устарели. Мое главное - это то, что лучше всего использовать для блокировки слежения. Когда пользователь нажал кнопку «Питание», блокировка «разблокировки» отпустилась через фреймворк. Я предполагаю, что этого не происходит, когда вы уменьшаете приложение за спиной или кнопкой дома. Это? – MartinC

+0

Основываясь на опыте, этой строки кода достаточно, чтобы держать wakelock для вашей деятельности. Он удерживает замок, пока окно видно. Вам не нужно самостоятельно обращаться к замку следа на жизненном цикле. – josephus

+0

спасибо. Как вы можете видеть, @Ritesh Gune говорит противоположное ... – MartinC

3

Как вы говорите, вы освобождаете замок от onPause() и приобретаете в onResume(). Это хорошая практика, но вместе с этим я предлагаю вам освободить wakelock в onUserLeaveHint().

onUserLeaveHint()

@Override 
protected void onUserLeaveHint() { 

try { 
    // your code. 

    // release the wake lock 
    wl.release(); 

    }catch(Exception ex){ 
    Log.e("Exception in onUserLeaveHint", ex.getMessage); 
    } 
    super.onUserLeaveHint(); 
} 
+0

ОК, имейте это в виду. Увидим, спасибо – MartinC