Używanie blokady uśpienia 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 uśpienia.
Nadaj blokadzie uśpienia odpowiednią nazwę
Zalecamy umieszczenie w tagu wakelock nazwy 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ę uśpienia. 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 w tagu blokady uśpienia informacje umożliwiające identyfikację, zamiast określonego tagu rejestruje wartość
_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 uśpienia licznika ani unikalnych identyfikatorów. Kod, który tworzy blokadę uśpienia, powinien za każdym razem używać tego samego tagu. Dzięki temu system może agregować wykorzystanie blokady uśpienia każdej metody.
Upewnij się, że aplikacja jest widoczna na pierwszym planie
Gdy blokada uśpienia jest aktywna, urządzenie zużywa energię. Użytkownik urządzenia powinien mieć świadomość, że to się dzieje. Dlatego jeśli używasz blokady uśpienia, 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 działające 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 uśpienia. W dokumentacji dotyczącej wyboru odpowiedniego interfejsu API, który zapobiega przechodzeniu urządzenia w stan uśpienia, znajdziesz inne sposoby wykonywania zadań, gdy aplikacja nie jest na pierwszym planie.
Uprość logikę
Zadbaj o to, aby logika uzyskiwania i zwalniania blokad wybudzania była jak najprostsza. Jeśli logika blokady uśpienia 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 uśpienia będzie utrzymywana dłużej niż oczekiwano. Te błędy są trudne do zdiagnozowania i debugowania.
Sprawdzanie, czy blokada uśpienia jest zawsze zwalniana
Jeśli używasz blokady uśpienia, musisz zadbać o to, aby każda wywołana blokada 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 zgłosić wyjątek MyException. Jeśli tak, metoda doSomethingAndRelease() propaguje wyjątek na zewnątrz i nigdy nie dociera do wywołania doSomethingAndRelease().release() W rezultacie blokada uśpienia jest uzyskiwana, ale nie zwalniana, co jest bardzo niekorzystne.
W poprawionym kodzie doSomethingAndRelease() zapewnia zwolnienie blokady uśpienia nawet w przypadku zgłoszenia 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();
}
}