Frage

Ich verwende WakeLock in meiner Anwendung das Telefon, um zu verhindern schlafen, wenn die App sichtbar ist.

Das Problem kommt, wenn es eine Orientierungsänderung ist und das System zerstört und neu erstellt die App im Querformat. Wenn der WakeLock Timer im Hintergrund abgelaufen ist das System nimmt die Freisetzung von WakeLock als Chance auf den Bildschirm auszuschalten.

Edit:. Ich sollte erwähnen, dass ich WakeLock onResume setze und onPause Freigabe - wie ich es verstehe, ist es notwendig, dann lassen Sie die App aus undichten die WakeLock zu verhindern

Ich brauche WakeLock durch die Orientierungsänderung fortzusetzen.

Im Folgenden werde ich eine Lösung für dieses skizziert habe. Ist dies der bevorzugte Weg, es zu handhaben, und gibt es Alternativen?


Erstellen Sie eine Dienstleistung, die WakeLock hält (und nicht die Aktivität) und, wenn die Aktivität entbindet der Dienst startet einen Countdown-Timer (für etwa 10 Sekunden), in dem es WakeLock freigeben, wenn die Zeit abgelaufen ist, wenn die Aktivität nicht rebind tut. Wenn es eine einfache Orientierungsänderung war die Aktivität innerhalb dieser 10 Sekunden erneut gebunden werden und so WakeLock halten, wenn dies nicht der Fall, wird WakeLock freigegeben werden.

Danke.

War es hilfreich?

Lösung

Statt eines WakeLock, versuchen getWindow().setFlags() die WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON Flag verwendet.

  

Wenn der WakeLock Timer abgelaufen ist in   der Hintergrund nimmt das System die   Freisetzung von WakeLock als Chance   Zum Ausschalten des Bildschirms.

Es sollte nicht. Per Definition hat der Benutzer mit dem Gerät interagiert, so dass der Bildschirm aus diesem Grund bleiben sollte, unabhängig von irgendetwas anderes.

Andere Tipps

Hier ist, wie ich es getan hätte ...

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

Gefolgt von ...

wl.acquire();

... wenn Sie tatsächlich benötigen, um die Spur Sperre aktivieren.

Die ‚PowerManager.ON_AFTER_RELEASE‘ Flag stochert die Benutzeraktivität Timer so bleibt der Bildschirm auf ein wenig mehr, wenn diese wake Sperre aufgehoben wird, was der Fall sein wird, wenn Sie Ihre Aktivitäten auf einer Änderung der Orientierung zerstört wird.

Works OK für mich!

Ich habe es von eigentlich nie die WakeLock freigibt. Stattdessen habe ich erwerben es mit Timeout.

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

Vorteile gegenüber anderen Methoden:

  • Verwendbar mit der SCREEN_DIM_WAKE_LOCK
  • Einfache (keine Notwendigkeit, mit isFinishing zu spielen () usw.)
  • keine Benutzeraktivität nach Orientierungsänderung stecken. D. h gedimmten Display bleibt gedimmt
  • Wenn Sie freigeben (zum Beispiel der Zeit ist vorbei, aber der Benutzer blieb in der Aktivität), wird es sofort freigegeben. Keine Notwendigkeit für Standard-Timeout warten.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top