2010-09-01 23 views
6

Ho un problema con l'acquisizione di un WakeLock. Sembra non funzionare. Sto cercando di acquisire un FULL_WAKE_LOCK ma né il display viene abilitato né la mia app è in grado di eseguire attività.Android WakeLock

sto usando la seguente autorizzazione: android.permission.WAKE_LOCK

Il mio codice acquisiscono simile a questo:

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

Che cosa sto facendo di sbagliato?

Edit: aggiunto un altro bandiera ACQUIRE_CAUSES_WAKEUP ... ma nessun cambiamento nel comportamento

Edit2: Tutto quello che sto cercando di fare è, per riprodurre musica e di svegliare il mio dispositivo in alto sopra un determinato evento. La musica funziona in modo perfetto ma il dispositivo rimane nero.

risposta

1

Dove stai acquistando la sveglia? Dovrai acquistarlo nel destinatario dell'intenzione, non nel servizio/attività che il tuo intento inizia.

+0

sto acquisizione di esso in un anctivity perché ho un'attività impostato come ricevitore – Coxer

+0

io non sono sicuro di aver capito. Un'attività non può essere un BroadcastReceiver poiché BroadcastReceiver è una classe astratta non un'interfaccia (nessuna eredità multipla in Java). Vuoi dire che hai un BroadcastReceiver statico privato sulla classe di attività? Tutto quello che sto dicendo è che devi attivare la sveglia su onReceive() nel BroadcastReceiver non in onCreate() dell'attività che inizi dal servizio. –

7

WakeLock è un modo inefficiente di mantenere lo schermo acceso. Usa invece il WindowManager per fare la magia. La seguente riga sarà sufficiente per WakeLock. Anche il permesso WakeLock è necessario perché funzioni. Anche questo codice è efficiente rispetto a wakeLock.

getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON); 

Non è necessario resettare manualmente il WakeLock. Questo codice consentirà al sistema Android di gestire il blocco automaticamente. Quando l'applicazione è in primo piano, viene attivato WakeLock e il sistema Android rilascia automaticamente il blocco.

Ma se si vuole liberare la bandiera, si può fare con:

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

Nei miei test, funziona solo se lo si chiama nel metodo onCreate dell'attività. Per esempio. se aggiungi FLAG_KEEP_SCREEN_ON in onCreate, prova a rimuoverlo in un secondo momento, non c'è effetto e viceversa. Testato su ICS 4.0.3 –

+0

puoi utilizzarlo ovunque. Devi usare il contesto. –

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); 
} 

Usage:

chiamata acquireStaticLock() quando è necessario acuire la serratura

Chiamare l'attività getLock(this).release(); quando è necessario rilasciare il blocco

aggiungere anche l'autorizzazione nel file di minifest:

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

Devi definire LOCK_NAME_STATIC per utilizzare il codice sopra. Per esempio. stringa statica privata LOCK_NAME_STATIC = "MyWakeLock"; –

Problemi correlati