2010-09-01 19 views
6

Mam problem z nabyciem WakeLock. Wygląda na to, że nie działa. Próbuję uzyskać FULL_WAKE_LOCK, ale żaden wyświetlacz nie zostanie włączony ani moja aplikacja nie będzie w stanie wykonywać zadań.Android WakeLock

Używam następujące uprawnienia: android.permission.WAKE_LOCK

Mój kod nabywać wygląda tak:

PowerManager pm = (PowerManager) getBaseContext().getSystemService(Context.POWER_SERVICE); 
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ACQUIRE_CAUSES_WAKEUP, "My Tag"); 
wl.acquire(); 

Co robię źle?

Edycja: Dodano kolejną flagę ACQUIRE_CAUSES_WAKEUP ... ale żadne zmiany w zachowaniu

Edit2: Wszystko staram się robić to, aby odtwarzać muzykę i budzić moje urządzenie się po pewnym zdarzeniu. Muzyka działa perfekcyjnie, ale urządzenie pozostaje czarne.

Odpowiedz

1

Gdzie zdobywasz blokadę wybudzania? Będziesz musiał ją zdobyć w odbiorcy intencji, a nie w usłudze/działalności, którą zaczynasz.

+0

jestem pozyskania go w anctivity bo mają aktywność ustawiony jako odbiornik – Coxer

+0

Nie jestem pewien, czy rozumiem. Aktywność nie może być BroadcastReceiver, ponieważ BroadcastReceiver jest klasą abstrakcyjną, a nie interfejsem (brak dziedziczenia wielokrotnego w Javie). Czy masz na myśli prywatny statyczny program BroadcastReceiver w klasie aktywności? Wszystko, co mówię, to, że musisz wziąć blokadę wake onReceive() w BroadcastReceiver nie w onCreate() działania, które zaczynasz od usługi. –

7

WakeLock to Nieefektywny sposób na utrzymanie ekranu. Zamiast tego użyj WindowManager, aby wykonać magię. Następująca jedna linia wystarczy WakeLock. Do tego potrzebne jest również zezwolenie WakeLock. Również ten kod jest skuteczniejszy niż wakeLock.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

Nie trzeba ręcznie uruchamiać WakeLock ręcznie. Ten kod pozwoli systemowi Android obsługiwać blokadę automatycznie. Kiedy twoja aplikacja znajduje się na pierwszym planie, wtedy odbywa się WakeLock, a system Android automatycznie uruchamia blokadę.

Ale jeśli chce zwolnić flagę, można zrobić to z:

getWindow().clearFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 
+0

W moich testach działa to tylko po wywołaniu go w metodzie onCreate działania. Na przykład. jeśli dodasz FLAG_KEEP_SCREEN_ON w onCreate, spróbuj je później usunąć, ale nie ma żadnego efektu i na odwrót. Testowane na ICS 4.0.3 –

+0

możesz go używać w dowolnym miejscu. Musisz użyć kontekstu. –

3
private static PowerManager.WakeLock lockStatic = null; 
private static String LOCK_NAME_STATIC = "MyWakeLock"; 

public static void acquireStaticLock(Context context) { 
    getLock(context).acquire(); 
} 

synchronized private static PowerManager.WakeLock getLock(Context context) { 
    if (lockStatic == null) { 
     PowerManager mgr = (PowerManager) context 
       .getSystemService(Context.POWER_SERVICE); 
     lockStatic = mgr.newWakeLock(PowerManager.FULL_WAKE_LOCK, 
       LOCK_NAME_STATIC); 
     lockStatic.setReferenceCounted(true); 
    } 

    return (lockStatic); 
} 

Zastosowanie:

połączeń acquireStaticLock() kiedy trzeba acuire the blokadę

Zadzwoń pod getLock(this).release(); wewnątrz działalności, gdy musisz zwolnić blokadę

dodać także zgodę w pliku minifest:

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

Musisz zdefiniować LOCK_NAME_STATIC, aby użyć powyższego kodu. Na przykład. prywatny static String LOCK_NAME_STATIC = "MyWakeLock"; –