2012-04-27 32 views
7

Mi actividad se ejecuta con un bloqueo parcial de activación porque está manejando continuamente los datos recibidos de Bluetooth. El bloqueo de estela está configurado de este modo:Cómo activar la pantalla durante el bloqueo parcial de activación

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

Cuando se producen determinados eventos que quiero en la pantalla para que el usuario puede ver el estado. Quiero que la pantalla se encienda automáticamente, no con la pulsación de un usuario. Sin embargo, todos los intentos de hacer esto han fallado. Cuando la pantalla se apaga mientras se ejecuta con un bloqueo parcial de activación, mis intentos de volver la pantalla hacia atrás y permitir que el usuario vea la actividad actual han fallado. He intentado simular la actividad del usuario:

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

banderas Ajuste de la ventana:

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

E incluso liberar el bloqueo raíz y empezar con otro que debe encender la pantalla:

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

¿Hay algo que me falta aquí? No estoy tratando de abrir una nueva actividad, sino simplemente mostrar mi actual al usuario. ¿Alguien más ha podido hacer esto? Gracias por cualquier ayuda que pueda darme.

Respuesta

9

Finalmente pude resolver este problema después de ver un código de demostración de Lance en HTC (gracias por cierto).

El secreto parece ser crear un bloqueo de activación total adicional con ACQUIRE_CAUSES_WAKEUP establecido. No lanzo el bloqueo de activación parcial original, pero cuando quiero encender la pantalla, creo el nuevo bloqueo de activación total, hago mis cosas y luego libero el nuevo bloqueo de activación total. ¡Esto realmente funciona!

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(); 
Cuestiones relacionadas