Best Practices für Wakelocks beachten

Die Verwendung einer Wakelock kann die Geräteleistung beeinträchtigen. Wenn Sie einen Wake Lock verwenden müssen, ist es wichtig, dies richtig zu tun. In diesem Dokument werden einige Best Practices beschrieben, mit denen Sie häufige Probleme mit Wakelocks vermeiden können.

Wake-Lock richtig benennen

Wir empfehlen, den Namen des Pakets, der Klasse oder der Methode in das Wakelock-Tag aufzunehmen. So lässt sich bei einem Fehler die Stelle im Quellcode, an der der Wakelock erstellt wurde, leichter finden. Hier einige zusätzliche Tipps:

  • Geben Sie im Namen keine personenidentifizierbaren Informationen an, z. B. eine E-Mail-Adresse. Wenn das Gerät personenidentifizierbare Informationen 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 hartcodierten String.
  • Fügen Sie Wakelock-Tags keinen Zähler oder eindeutige Kennungen hinzu. Der Code, der eine 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.

Solange ein Wakelock aktiv ist, verbraucht das Gerät Strom. Der Nutzer des Geräts sollte sich dessen bewusst sein. Wenn du eine Wakelock verwendest, solltest du dem Nutzer daher eine Benachrichtigung anzeigen. In der Praxis bedeutet das, dass Sie die Wakelock in einem Dienst im Vordergrund abrufen und halten sollten. Dienste im Vordergrund müssen eine Benachrichtigung anzeigen.

Wenn ein Dienst im Vordergrund nicht die richtige Wahl für Ihre App ist, sollten Sie wahrscheinlich auch keinen Wakelock verwenden. Weitere Möglichkeiten, Aufgaben auszuführen, während Ihre App nicht im Vordergrund ist, finden Sie in der Dokumentation Choose the right API to keep the device awake.

Logik einfach halten

Achte darauf, dass die Logik zum Erwerben und Freigeben von Wakelocks so einfach wie möglich ist. Wenn die Wake-Lock-Logik an komplexe Zustandsautomaten, Zeitüberschreitungen, Executor-Pools oder Callback-Ereignisse gebunden ist, kann ein kleiner Fehler in dieser Logik dazu führen, dass der Wake-Lock länger als erwartet gehalten wird. Diese Fehler sind schwer zu diagnostizieren und zu beheben.

Prüfen, ob die Wakelock immer freigegeben wird

Wenn du einen Wake-Lock verwendest, musst du dafür sorgen, dass jeder Wake-Lock, den du erwirbst, ordnungsgemäß freigegeben wird. Das ist nicht immer so einfach, wie es klingt. Der folgende Code hat 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 hierbei ist, dass die Methode doTheWork() die Ausnahme MyException auslösen kann. In diesem Fall wird die Ausnahme von der Methode doSomethingAndRelease() nach außen weitergegeben und erreicht den Aufruf release() nie. Das Ergebnis ist, dass die Wakelock-Sperre zwar erworben, aber nicht freigegeben wird, was sehr schlecht ist.

Im korrigierten Code sorgt doSomethingAndRelease() dafür, dass die Wakelock-Sperre auch dann aufgehoben 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();
    }
}