Pregunta

Estoy usando Wakelock en mi solicitud para evitar que el teléfono durmiendo cuando la aplicación es visible.

El problema viene cuando hay un cambio de orientación y el sistema destruye y vuelve a crear la aplicación en modo horizontal. Si el temporizador ha expirado wakelock en el fondo el sistema toma la liberación de wakelock como una oportunidad para apagar la pantalla.

Editar:. Debo mencionar que me he fijado Wakelock onResume, y la liberación de onPause - como yo lo entiendo, es necesario liberar a continuación, para evitar que la aplicación se escape el wakelock

Necesito wakelock para continuar a través del cambio de orientación.

A continuación he esbozado una solución a esto. ¿Es esta la mejor forma de manejar la situación, y hay alguna alternativa?


Crear un servicio que mantiene wakelock (en lugar de la actividad) y cuando la actividad desenlaza el servicio se inicia un temporizador de cuenta atrás (por ejemplo, 10 segundos) en el que se dará a conocer wakelock cuando expira el temporizador si la actividad no vuelva a enlazar. Si se trataba de un simple cambio de orientación de la actividad se vuelva a enlazar dentro de esos 10 segundos y así mantener wakelock, si no lo hace, se dará a conocer wakelock.

Gracias.

¿Fue útil?

Solución

En lugar de un WakeLock, tratar getWindow().setFlags() usando la bandera WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.

  

Si el temporizador ha expirado en wakelock   al fondo el sistema toma el   liberación de wakelock como una oportunidad   para apagar la pantalla.

No debería. Por definición, el usuario ha interactuado con el dispositivo, por lo que la pantalla debe permanecer durante esa razón, independiente de cualquier otra cosa.

Otros consejos

Aquí es cómo lo hice ...

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK|PowerManager.ON_AFTER_RELEASE, "DoNotDimScreen");

Seguido por ...

wl.acquire();

... cuando se necesita realmente para activar el bloqueo del paso.

La bandera 'PowerManager.ON_AFTER_RELEASE' asoma el temporizador de la actividad del usuario para que la pantalla permanece encendida durante un poco más de tiempo cuando se libera este bloqueo estela, que será el caso cuando su actividad está destruida en un cambio de orientación.

funciona bien para mí!

Lo hice por la liberación de la realidad nunca wakelock. En su lugar, adquiero con tiempo de espera.

private PowerManager.WakeLock wl;

protected void onStart(Bundle savedInstanceState) {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK, "Words counter");
    // disable reference counting, as acquire/release calls are not paired
    wl.setReferenceCounted(false);
    wl.acquire();
}

protected void onStop() {
    // acquire for few seconds to keep lock until onStart is called with new orietnation
    wl.acquire(3000);
}

Las ventajas sobre otros métodos:

  • Se puede utilizar con el SCREEN_DIM_WAKE_LOCK
  • simple (sin necesidad de jugar con isFinishing (), etc.)
  • No meter la actividad del usuario después de un cambio de orientación. Es decir. pantalla atenuada permanece atenuado
  • Si suelta (por ejemplo, el tiempo ha terminado, pero el usuario se mantuvo en la actividad), se libera inmediatamente. No hay necesidad de esperar a que el tiempo de espera por defecto.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top