Die Verwendung eines Wakelocks kann die Geräteleistung beeinträchtigen. Wenn Sie ein Wakelock verwenden müssen, ist es wichtig, dies richtig zu tun. In diesem Dokument werden einige Best Practices behandelt, mit denen Sie häufige Fallstricke bei der Verwendung von Wakelocks vermeiden können.
Wakelock richtig benennen
Wir empfehlen, den Paket-, Klassen- oder Methodennamen in das Wakelock-Tag aufzunehmen. So lässt sich bei einem Fehler leichter die Stelle im Quellcode finden, an der das Wakelock erstellt wurde. Hier sind einige zusätzliche Tipps:
- Geben Sie im Namen keine personenidentifizierbaren Informationen wie eine E‑Mail-Adresse an. Wenn das Gerät personenidentifizierbare Informationen im Wakelock-Tag erkennt, wird anstelle des von Ihnen angegebenen Tags
_UNKNOWNprotokolliert. - Rufen Sie den Klassen- oder Methodennamen nicht programmatisch ab, z. B. durch Aufrufen von
getName(). Wenn Sie den Namen programmatisch abrufen, kann er von Tools wie ProGuard verschleiert werden. Verwenden Sie stattdessen einen fest codierten String. - Fügen Sie Wakelock-Tags keinen Zähler oder keine eindeutigen IDs hinzu. Der Code, der ein Wakelock erstellt, sollte bei jeder Ausführung dasselbe Tag verwenden. So kann das System die Wakelock-Nutzung jeder Methode zusammenfassen.
Achten Sie darauf, dass Ihre App im Vordergrund sichtbar ist
Wenn ein Wakelock aktiv ist, verbraucht das Gerät Strom. Der Nutzer des Geräts sollte darüber informiert sein. Wenn Sie ein Wakelock verwenden, sollten Sie dem Nutzer daher eine Benachrichtigung anzeigen. In der Praxis bedeutet das, dass Sie das Wakelock in einem Dienst im Vordergrund abrufen und beibehalten sollten. Für Vordergrunddienste ist die Anzeige einer Benachrichtigung erforderlich.
Wenn ein Dienst im Vordergrund nicht die richtige Wahl für Ihre App ist, sollten Sie wahrscheinlich auch kein Wakelock verwenden. Weitere Möglichkeiten, Aufgaben auszuführen, während Ihre App nicht im Vordergrund ist, finden Sie in der Dokumentation zur Auswahl der richtigen API, um das Gerät wach zu halten.
Logik einfach halten
Die Logik zum Abrufen und Freigeben von Wakelocks sollte so einfach wie möglich sein. Wenn Ihre Wakelock-Logik an komplexe Zustandsautomaten, Zeitüberschreitungen, Executor-Pools oder Callback-Ereignisse gebunden ist, kann ein kleiner Fehler in dieser Logik dazu führen, dass das Wakelock länger als erwartet beibehalten wird. Diese Fehler sind schwer zu diagnostizieren und zu beheben.
Prüfen, ob das Wakelock immer freigegeben wird
Wenn Sie ein Wakelock verwenden, müssen Sie darauf achten, dass jedes abgerufene Wakelock ordnungsgemäß freigegeben wird. Das ist nicht immer so einfach, wie es klingt. Der folgende Code enthält beispielsweise ein Problem:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
Java
void doSomethingAndRelease() throws MyException {
wakeLock.acquire();
doTheWork(); // can potentially throw MyException
wakeLock.release(); // does not run if an exception is thrown
}
Das Problem ist, dass die Methode doTheWork() die Ausnahme MyException auslösen kann. In diesem Fall gibt die Methode doSomethingAndRelease() die Ausnahme weiter und der Aufruf release() wird nie erreicht. Das Ergebnis ist, dass das Wakelock abgerufen, aber nicht freigegeben wird, was sehr schlecht ist.
Im korrigierten Code gibt doSomethingAndRelease() das Wakelock auch dann frei, wenn eine Ausnahme ausgelöst wird:
Kotlin
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
Java
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}