W trakcie zwykłego użytkowania aplikacji może się zdarzyć, że znajdująca się na pierwszym planie aktywność zostanie przesłonięta przez inne komponenty wizualne i będzie w rezultacie wstrzymana. Przykładowo otwarcie półprzezroczystej aktywności (np. w stylu okna dialogowego), spowoduje wstrzymanie aktywności uruchomionej wcześniej. Aktywność, która nie otrzymała fokusu, ale jest wciąż częściowo widoczna, pozostanie w stanie wstrzymania.
Jeśli jednak zostanie całkowicie przesłonięta, nastąpi jej zatrzymanie (stan ten omówiony zostanie w kolejnej lekcji).
Kiedy aktywność przechodzi w stan wstrzymania, system wywołuje na niej metodę onPause()
. Umożliwia ona zatrzymanie bieżących akcji, które w czasie wstrzymania aktywności nie powinny być kontynuowane (np. odtwarzanie wideo). Metoda ta pozwala także przechować wszelkie informacje, które powinny zostać zapisane po opuszczeniu przez użytkownika aplikacji. Po wznowieniu aplikacji znajdującej się w stanie wstrzymania, system wznawia jej działanie i wywołuje metodę onResume()
.
Wstrzymywanie aktywności
Kiedy system wywołuje na aktywności metodę onPause()
, teoretycznie oznacza to, że aktywność będzie nadal częściowo widoczna. Najczęściej jednak jest to sygnał, że użytkownik opuszcza aktywność, a ta przejdzie wkrótce w stan zatrzymania. Zwykle metodę zwrotną onPause()
wywołuje się w celu:
- zatrzymania animacji lub innych bieżących aktywności, które obciążają procesor;
- zatwierdzenia niezapisanych zmian, ale wyłącznie tych, których zapisu użytkownik oczekuje po opuszczeniu aplikacji (np. wersji roboczej wiadomości e-mail);
- zwolnienia zasobów systemowych, takich jak odbiorniki sygnału, uchwyty czujników (np. GPS) bądź wszelkich niewykorzystywanych przez użytkownika zasobów, które mogą mieć wpływ na żywotność baterii podczas wstrzymania aktywności.
Przykładowo, jeśli aplikacja korzysta z aparatu, użycie metody onPause()
będzie dobrym sposobem na zwolnienie wykorzystywanych przez niego zasobów.
@Override
public void onPause() {
super.onPause(); // zawsze wywołuj metodę nadklasy jako pierwszą
// zwolnij zasoby aparatu, ponieważ użytkownik nie będzie go potrzebował w stanie wstrzymania,
// a mogą go natomiast potrzebować inne aktywności.
if (mCamera != null) {
mCamera.release()
mCamera = null;
}
}
Na ogół nie należy stosować metody onPause()
do stałego przechowywania zmian wprowadzonych przez użytkownika (np. danych osobowych wpisanych w formularzach). Wyjątek stanowi sytuacja, w której masz pewność, że użytkownik spodziewa się automatycznego zapisania zmian (np. podczas sporządzania e-maila). Podczas wykonywania metody onPause()
należy jednak unikać działań obciążających procesor, np. dokonywania zapisu w bazie danych, ponieważ może to spowodować widocznie wolniejsze przejście do kolejnej aktywności (najbardziej obciążające procesy należy natomiast zamykać podczas metody onStop()
).
Dzięki ograniczeniu operacji wykonywanych podczas metody onPause()
możliwe będzie uzyskanie szybkiego przejścia do kolejnej docelowej aktywności użytkownika, nawet jeśli poprzednia aktywność jest tak naprawdę zatrzymywana.
Wznawianie aktywności
Gdy użytkownik wznawia aplikację znajdującą się w stanie wstrzymania, system wywołuje metodę onResume()
.
Pamiętaj, że system wywołuje tę metodę za każdym razem, gdy aktywność wysuwana jest na pierwszy plan — także przy okazji jej utworzenia. Ponadto onResume()
implementuje się w celu inicjacji komponentów, które zostały zwolnione przez metodę onPause()
, a także by wykonać inne niezbędne czynności inicjacyjne podczas przejścia aktywności w stan wznowienia (np. aby rozpocząć animacje i zainicjować komponenty używane tylko jeśli aktywność ma fokus).
Poniższy przykład metody onResume()
stanowi uzupełnienie przykładu z metodą onPause()
— w tym przypadku zwolniony po wstrzymaniu aktywności aparat zostaje ponownie zainicjowany.
@Override
public void onResume() {
super.onResume(); // zawsze wywołuj metodę nadklasy jako pierwszą
// pobierz instancję aparatu natychmiast po otrzymaniu przez aktywność pełnego fokusu
if (mCamera == null) {
initializeCamera(); // metoda lokalna obsługująca inicjację aparatu
}
}