Cykl życia Activity

Aby dobrze zrozumieć działanie aplikacji Andoridowych warto przyjrzeć się bliżej cyklowi życia Activity.

Każdy widok, który chcemy wyświetlić na ekranie musi dziedziczyć (extends; więcej o dziedziczeniu tutaj i tutaj) po Activity. Daje nam to możliwość nadpisania niektórych jej metod. Najczęściej używane jest tylko onCreate():

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState)
}

W większości wypadków jest to wystarczające do obsłużenia podstawowej funkcjonalności. Co jednak, jeśli chcemy wywołać jakąś akcję np. zapisanie wartości wpisanych pól po zamknięciu aktualnego widoku. Można to oczywiście rozwiązać na kilka sposobów m.in. oprogramować naciśnięcie klawisza powrotu. Moim zdaniem dużo lepiej jest podpiąć się pod konkretne zdarzenie związane z aktywnością. W tym wypadku onStop():

@Override
public void onStop() {
    super.onStop();
    saveAction();
}

Bardzo ważne jest pamiętanie o wywołaniu metody super.onStop(). Na szczęście jeśli o tym zapomnimy, prędzej czy później poinformuje nas o tym LogCat :)

Istnieją 4 stany w których może znajdować się Activity:

  • Działająca na ekranie
  • Utraciła focus, ale jest nadal widoczna, na przykład po pojawieniu się pop-upa.
  • Zatrzymana - działająca, ale niewidoczna. Po przejściu do innego Activity aktualny stan jest przetrzymywany w pamięci. Istnieje jednak możliwość, że system będzie potrzebował więcej wolnej pamięci i "zabije" takie Activity. Wtedy musi zostać ono od nowa stworzone i wszystkie niezapisane zmiany zostaną utracone. Tutaj możemy sobie radzić zapisując je uprzednio w onPause() i wczytując w onCreate()
  • Wyłączona

Wszystkie akcje związane z cyklem życia Activity dostępne są na diagramie:

android activity cykl życia

Ze swojej strony chciałbym jeszcze dodać, że przed onCreate() wywoływany jest jeszcze konstruktor. Nie widziałem natomiast przypadków w aplikacjach Androidowych w których programiści decdowali się na jego użycie. Stoi za tym zapewne jakaś logika, więc osobiście polecam wrzucenie wszystkich akcji inicjujących do onCreate().

Po więcej informacji zapraszam do dokumentacji.

Dyskusja i komentarze

Masz pytania do tego wpisu? Może chcesz się podzielić spostrzeżeniami? Zapraszamy dyskusji na naszej grupie na Facebooku.

Poniżej znajdziesz archiwalne wpisy z czasów, gdy strona była jeszcze hobbystycznym blogiem.

Sebastian

Jaką bibliotekę trzeba zaimportować, żeby móc skorzystać z polecenia saveAction()?

Loony

To jest pewnie metoda własna. Chodzi o własny kod na zapisanie stanu aplikacji. <blockquote> chcemy wywołać jakąś akcję np. zapisanie wartości wpisanych pól po zamknięciu aktualnego widoku </blockquote>

Hubert

czyli programując onPause() nie wiemy, czy system nie zmusi nas do ponownego utworzenia Activity jeśli nagle zabraknie pamięci?

Marcin Kunert

onPause() zostanie wywołana po tym jak naciśniemy przycisk "Home". Nasza aplikacja pozostanie włączona w tle. Od tego momentu może zostać w każdym momencie wyłączona automatycznie przez system, jeśli zabraknie pamięci, uprzednio zostanie wywołane jednak onStop() w którym możemy dokonać wszystkich rzeczy (z reguły będzie to zapisywanie danych do pamięci trwałej). Mam nadzieję, że dobrze zrozumiałem Twoje pytanie ;)