Best Practices für Wakelocks beachten

Die Verwendung eines Wakelocks kann die Geräteleistung beeinträchtigen. Wenn Sie einen Wake Lock verwenden müssen, ist es wichtig, dass Sie dies richtig tun. In diesem Dokument werden einige Best Practices beschrieben, mit denen Sie häufige Wakelock-Fehler 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 der Wakelock erstellt wurde. Hier sind einige zusätzliche Tipps:

  • Lassen Sie alle personenidentifizierbaren Informationen wie E‑Mail-Adressen im Namen weg. Wenn das Gerät personenbezogene Daten im Wake Lock-Tag erkennt, wird _UNKNOWN anstelle des von Ihnen angegebenen Tags protokolliert.
  • Rufen Sie den Klassen- oder Methodennamen nicht programmatisch ab, z. B. durch Aufrufen von getName(). Wenn Sie versuchen, den Namen programmatisch abzurufen, wird er möglicherweise durch Tools wie Proguard verschleiert. Verwenden Sie stattdessen einen fest codierten String.
  • Fügen Sie den Wakelock-Tags keinen Zähler oder keine eindeutigen Kennungen hinzu. Der Code, der einen Wakelock erstellt, sollte bei jeder Ausführung dasselbe Tag verwenden. So kann das System die Wakelock-Nutzung der einzelnen Methoden aggregieren.

Ihre App muss im Vordergrund sichtbar sein

Wenn ein Wakelock aktiv ist, verbraucht das Gerät Strom. Der Nutzer des Geräts sollte darüber informiert werden. Wenn Sie einen Wakelock verwenden, sollten Sie dem Nutzer daher eine Benachrichtigung anzeigen. In der Praxis bedeutet das, dass Sie den Wakelock in einem Dienst im Vordergrund abrufen und halten sollten. Vordergrunddienste sind erforderlich, um eine Benachrichtigung anzuzeigen.

Wenn ein Dienst im Vordergrund nicht die richtige Wahl für Ihre App ist, sollten Sie wahrscheinlich auch keine Wakelocks verwenden. In der Dokumentation Die richtige API auswählen, um das Gerät aktiv zu halten finden Sie weitere Möglichkeiten, Aufgaben auszuführen, wenn Ihre App nicht im Vordergrund ist.

Einfache Logik verwenden

Die Logik zum Abrufen und Freigeben von Wake Locks sollte so einfach wie möglich sein. Wenn Ihre Wakelock-Logik an komplexe Zustandsautomaten, Zeitüberschreitungen, Executor-Pools oder Callback-Ereignisse gebunden ist, kann jeder subtile Fehler in dieser Logik dazu führen, dass der Wakelock länger als erwartet gehalten wird. Diese Fehler sind schwer zu diagnostizieren und zu beheben.

Prüfen, ob das Wakelock immer freigegeben wird

Wenn Sie einen Wakelock verwenden, müssen Sie darauf achten, dass jeder Wakelock, den Sie erhalten, ordnungsgemäß freigegeben wird. Das ist nicht immer so einfach, wie es sich anhört. 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 besteht darin, dass die Methode doTheWork() die Ausnahme MyException auslösen kann. Wenn dies der Fall ist, gibt die Methode doSomethingAndRelease() die Ausnahme nach außen weiter und sie erreicht den release()-Aufruf nie. Das Ergebnis ist, dass der Wakelock zwar aktiviert, aber nicht deaktiviert wird, was sehr schlecht ist.

Im korrigierten Code wird durch doSomethingAndRelease() dafür gesorgt, dass der Wakelock auch dann freigegeben wird, 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();
    }
}