Użycie blokady aktywacji może pogorszyć wydajność urządzenia. Jeśli musisz użyć blokady aktywacji, musisz to zrobić prawidłowo. W tym dokumencie znajdziesz sprawdzone metody, które pomogą Ci uniknąć typowych błędów związanych z blokowaniem wybudzania.
Właściwie nazwij blokadę wybudzania
Zalecamy uwzględnienie w tagu wakelock nazwy pakietu, klasy lub metody. Dzięki temu w przypadku błędu łatwiej będzie znaleźć w Twoim kodzie źródłowym miejsce, w którym utworzono blokadę aktywacji. Oto kilka dodatkowych wskazówek:
- Nie podawaj żadnych informacji umożliwiających identyfikację, takich jak adres e-mail. Jeśli urządzenie wykryje dane osobowe w tagu Wake Lock, zamiast podanego przez Ciebie tagu zostanie zapisany tag
_UNKNOWN
. - Nie pobieraj nazwy klasy ani metody za pomocą kodu, np. przez wywołanie funkcji
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 licznika ani identyfikatorów unikalnych do tagów blokady aktywacji. Kod, który tworzy blokadę aktywacji, powinien używać tego samego tagu przy każdym uruchomieniu. Dzięki temu system może agregować dane o używaniu blokady ekranu dla każdej metody.
Upewnij się, że aplikacja jest widoczna na pierwszym planie
Podczas aktywnego blokowania wybudzania urządzenie zużywa energię. Użytkownik urządzenia powinien być świadomy, że to się dzieje. Z tego powodu, jeśli używasz blokady ekranu, musisz wyświetlić użytkownikowi powiadomienie. W praktyce oznacza to, że musisz uzyskać i utrzymać blokadę aktywacji w usłudze na pierwszym planie. Usługi na pierwszym planie są wymagane do wyświetlania powiadomień.
Jeśli usługa na pierwszym planie nie jest odpowiednia dla Twojej aplikacji, prawdopodobnie nie powinieneś też używać blokady aktywacji. Więcej informacji o innych sposobach wykonywania zadań, gdy aplikacja nie jest na pierwszym planie, znajdziesz w dokumentacji Wybór odpowiedniego interfejsu API, aby utrzymać urządzenie w stanie czuwania.
Utrzymaj logikę w prostocie
Upewnij się, że logika pozyskiwania i zwalniania blokad aktywacji jest jak najprostsza. Jeśli logika blokady aktywacji jest powiązana ze złożonymi maszynami stanów, limitami czasowymi, grupami wykonawców lub zdarzeniami wywołania zwrotnego, każdy drobny błąd w tej logice może spowodować, że blokada aktywacji będzie utrzymywać się dłużej niż oczekiwano. Te błędy są trudne do zdiagnozowania i debugowania.
Sprawdź, czy blokada aktywacji jest zawsze zwalniana
Jeśli używasz blokady aktywacji, musisz się upewnić, że każda blokada aktywacji, którą uzyskasz, jest prawidłowo zwalniana. Nie zawsze jest to takie proste. Na przykład kod poniżej zawiera błąd:
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
acquire()
doTheWork() // can potentially throw MyException
release() // does not run if an exception is thrown
}
}
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
. W przeciwnym razie metoda doSomethingAndRelease()
rozprzestrzenia wyjątek na zewnątrz i nigdy nie dociera do wywołania release()
. W efekcie blokada aktywacji jest uzyskana, ale nie zwalniana, co jest bardzo niekorzystne.
W poprawionym kodzie funkcja doSomethingAndRelease()
zapewnia zwolnienie blokady aktywacji nawet wtedy, gdy zostanie rzucony wyjątek:
@Throws(MyException::class)
fun doSomethingAndRelease() {
wakeLock.apply {
try {
acquire()
doTheWork()
} finally {
release()
}
}
}
void doSomethingAndRelease() throws MyException {
try {
wakeLock.acquire();
doTheWork();
} finally {
wakeLock.release();
}
}