2012-04-27 12 views
7

L'attività viene eseguita con un wake wake parziale poiché gestisce continuamente i dati Bluetooth ricevuti. Il blocco scia è impostato in questo modo:Come attivare lo schermo durante il risveglio parziale

powerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "MyWakeLock"); 
    wakeLock.acquire(); 

Quando si verificano determinati eventi che voglio sul display in modo che l'utente può visualizzare lo stato. Voglio che il display si accenda automaticamente, non da una pressione di un tasto utente. Tuttavia tutti i tentativi di fare ciò sono falliti. Quando il display si spegne durante l'esecuzione con un parziale wake lock, i miei tentativi di riaccendere il display e lasciare che l'utente veda l'attività corrente hanno fallito. Ho provato fingendo l'attività degli utenti:

PowerManager NewPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
    NewPowerManager.userActivity(1, false); 

bandiere Impostazione per la finestra:

Window win = getWindow(); 
    win.setFlags(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON, WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); 

E anche rilasciando il blocco della veglia e di iniziare un altro che dovrebbe accendere lo schermo:

if (wakeLock != null) 
    { 
     wakeLock.release(); // release the wakelock 
    } 
PowerManager.WakeLock TempWakeLock = powerManager.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | 
    PowerManager.ACQUIRE_CAUSES_WAKEUP, "TempWakeLock"); 
    // tried | PowerManager.ON_AFTER_RELEASE to no avail 
    TempWakeLock.acquire(); 

C'è qualcosa che mi manca qui? Non sto cercando di aprire una nuova attività, ma semplicemente di visualizzare la mia attuale per l'utente. Qualcun altro è stato in grado di farlo? Grazie per l'aiuto che mi puoi dare.

risposta

9

Sono finalmente riuscito a risolvere questo problema dopo aver visto qualche codice demo da Lance su HTC (grazie comunque).

Il segreto sembra essere quello di creare un ulteriore scia completa con set ACQUIRE_CAUSES_WAKEUP. Non rilascerò il wake lock parziale originale, ma quando voglio accendere il display creo il nuovo wake lock completo, faccio le mie cose, quindi rilascio il nuovo full wake lock. Questo funziona davvero!

PowerManager TempPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE); 
PowerManager.WakeLock TempWakeLock = TempPowerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP | 
PowerManager.ON_AFTER_RELEASE, "TempWakeLock"); 
TempWakeLock.acquire(); 

// do the work that needs the visible display... 

// Release the newest wakelock and fall back to the old one 
TempWakeLock.release(); 
Problemi correlati