Question

J'utilise Wakelock dans mon application pour empêcher le téléphone de dormir lorsque l'application est visible.

Le problème vient quand il y a un changement d'orientation et le système détruit et recrée l'application en mode paysage. Si la minuterie de wakelock a expiré en arrière-plan le système prend la libération de wakelock l'occasion d'éteindre l'écran.

Modifier. Je dois dire que je suis en train Wakelock onResume, et la libération OnPause - si je comprends bien, il est nécessaire de libérer ensuite pour empêcher l'application de fuir la wakelock

J'ai besoin wakelock de continuer à travers le changement d'orientation.

Ci-dessous je vous ai présenté une solution à cela. Est-ce la meilleure façon de le manipuler, et sont-il des alternatives?


Créer un service qui tient wakelock (plutôt que l'activité) et lorsque l'activité délie le service démarre un compte à rebours (pour dire 10 secondes) dans lequel il libérera wakelock lorsque la minuterie expire si l'activité ne redéfinissez pas. S'il était un simple changement d'orientation de l'activité se redéfinissez au sein de cette 10 secondes et ainsi maintenir wakelock, si elle n'a pas, wakelock sera publié.

Merci.

Était-ce utile?

La solution

Au lieu d'un WakeLock, essayez getWindow().setFlags() en utilisant le drapeau WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON.

  

Si la minuterie de wakelock a expiré en   l'arrière-plan du système prend la   libération de wakelock comme une opportunité   pour éteindre l'écran.

Il ne devrait pas. Par définition, l'utilisateur a interagi avec l'appareil, de sorte que l'écran doit rester pour cette raison, indépendamment de toute autre chose.

Autres conseils

Voici comment je l'ai fait ...

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

Suivi par ...

wl.acquire();

... quand vous devez activer effectivement le verrou de réveil.

Le drapeau « PowerManager.ON_AFTER_RELEASE » pokes la minuterie d'activité de l'utilisateur afin que l'écran reste allumé pendant un peu plus longtemps lorsque ce verrou de sillage est libéré, ce qui sera le cas lorsque votre activité est détruite sur un changement d'orientation.

OK pour moi Works!

Je l'ai fait en libérant le fait jamais wakelock. Au lieu de cela, j'acquiers avec délai d'attente.

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

Les avantages par rapport aux autres méthodes:

  • Utilisable avec le SCREEN_DIM_WAKE_LOCK
  • simple (pas besoin de jouer avec isFinishing () etc.)
  • Ne percez pas l'activité de l'utilisateur après le changement d'orientation. C'est à dire. affichage estompé reste estompé
  • Si vous relâchez (par exemple, le temps est révolu, mais l'utilisateur est resté dans l'activité), il est immédiatement libéré. Pas besoin d'attendre pour le délai par défaut.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top