Stosowanie sprawdzonych metod dotyczących blokady aktywacji

Używanie blokady wybudzania może pogorszyć wydajność urządzenia. Jeśli musisz użyć blokady wybudzania, ważne jest, aby zrobić to prawidłowo. W tym dokumencie znajdziesz sprawdzone metody, które pomogą Ci uniknąć typowych problemów z blokadami wybudzania.

Nadaj blokadzie wybudzania odpowiednią nazwę

Zalecamy, aby w tagu wakelock umieścić nazwę pakietu, klasy lub metody. Dzięki temu w przypadku wystąpienia błędu łatwiej będzie znaleźć w kodzie źródłowym miejsce, w którym utworzono blokadę wybudzania. Oto kilka dodatkowych wskazówek:

  • Nie podawaj w nazwie żadnych informacji umożliwiających identyfikację, takich jak adres e-mail. Jeśli urządzenie wykryje informacje umożliwiające identyfikację w tagu blokady wybudzania, zamiast określonego tagu rejestruje _UNKNOWN.
  • Nie pobieraj nazwy klasy ani metody programowo, np. przez wywołanie getName(). Jeśli spróbujesz uzyskać nazwę programowo, może ona zostać zaciemniona przez narzędzia takie jak Proguard. Zamiast tego użyj zakodowanego na stałe ciągu znaków.
  • Nie dodawaj do tagów blokady wybudzania licznika ani unikalnych identyfikatorów. Kod, który tworzy blokadę wybudzania, powinien za każdym razem używać tego samego tagu. Umożliwia to systemowi agregowanie wykorzystania blokady wybudzania każdej metody.

Upewnij się, że aplikacja jest widoczna na pierwszym planie

Gdy blokada wybudzania jest aktywna, urządzenie zużywa energię. Użytkownik urządzenia powinien mieć świadomość, że to się dzieje. Dlatego jeśli używasz blokady wybudzania, musisz wyświetlać użytkownikowi powiadomienie. W praktyce oznacza to, że należy uzyskać i utrzymać blokadę wybudzania w usłudze na pierwszym planie. Usługi na pierwszym planie muszą wyświetlać powiadomienie.

Jeśli usługa na pierwszym planie nie jest odpowiednia dla Twojej aplikacji, prawdopodobnie nie powinna ona też używać blokady wybudzania. Więcej informacji o innych sposobach wykonywania zadań, gdy aplikacja nie jest na pierwszym planie, znajdziesz w dokumentacji Wybieranie odpowiedniego interfejsu API, aby utrzymać urządzenie w stanie aktywności.

Uprość logikę

Upewnij się, że logika uzyskiwania i zwalniania blokad wybudzania jest możliwie najprostsza. Jeśli logika blokady wybudzania jest powiązana ze złożonymi automatami stanów, limitami czasu, pulami wykonawców lub zdarzeniami wywołania zwrotnego, każdy subtelny błąd w tej logice może spowodować, że blokada wybudzania będzie utrzymywana dłużej niż oczekiwano. Te błędy są trudne do zdiagnozowania i debugowania.

Sprawdzanie, czy blokada wybudzania jest zawsze zwalniana

Jeśli używasz blokady wybudzania, musisz zadbać o to, aby każda uzyskana blokada wybudzania została prawidłowo zwolniona. Nie zawsze jest to tak proste, jak się wydaje. Na przykład poniższy kod zawiera 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
}

Problem polega na tym, że metoda doTheWork() może zwrócić wyjątek MyException. Jeśli tak, metoda doSomethingAndRelease() propaguje wyjątek na zewnątrz i nigdy nie dociera do wywołania release(). W rezultacie blokada wybudzania jest uzyskiwana, ale nie zwalniana, co jest bardzo niekorzystne.

W poprawionym kodzie doSomethingAndRelease() zapewnia zwolnienie blokady wybudzania nawet w przypadku wystąpienia wyjątku:

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