138
Rozdział 4.
Od narodzin do śmierci
Cykl życia aktywności: od utworzenia do usunięcia
Poniżej przedstawiony został cykl życia aktywności, od jej narodzin do śmierci. Jak się
przekonasz w dalszej części rozdziału, pominęliśmy tu kilka szczegółów, lecz na razie
koncentrujemy się wyłącznie na metodach
onCreate()
i
onDestroy()
.
onCreate()
onDestroy()
Aktywność zostaje uruchomiona.
System tworzy obiekt aktywności i zostaje
wywołany jej konstruktor.
Bezpośrednio po uruchomieniu aktywności
zostaje wywołana jej metoda onCreate().
Metoda
onCreate()
jest miejscem, w którym należy
umieścić cały kod inicjujący działanie aktywności,
gdyż jest ona zawsze wywoływana po uruchomieniu
aktywności, lecz zanim zacznie ona działać.
Aktywność działa, kiedy jest widoczna
na ekranie i użytkownik może prowadzić
z nią interakcję.
To właśnie w tym stanie aktywność spędza
przeważającą większość swego życia.
Metoda onDestroy() jest wywoływana
bezpośrednio przed usunięciem aktywności.
Metoda
onDestroy()
pozwala wykonać ostateczne
porządki po aktywności, na przykład zwolnić
używane przez nią zasoby.
Po wykonaniu metody onDestroy() aktywność
jest usuwana.
W tym momencie aktywność przestaje istnieć.
Aktywność
uruchomiona
Aktywność
działająca
Aktywność
usunięta
1
2
3
4
5
onCreate()
oraz
onDestroy()
to dwie metody cyklu życia
aktywności. A skąd się biorą te metody?
Jeśli na urządzeniu jest bardzo mało
pamięci, to może się zdarzyć, że
metoda onDestroy() nie zostanie
wywołana przed usunięciem aktywności.
Cykl życia aktywności
139
jesteś tutaj
Twoja aktywność dziedziczy metody cyklu życia
Jak już wspomnieliśmy, wszystkie aktywności rozszerzają klasę
android.app.Activity
.
To właśnie ta klasa zapewnia naszym aktywnościom dostęp do metod cyklu życia.
Poniższy rysunek przedstawia diagram hierarchii klas.
MojaAktywnosc
onCreate(Bundle)
mojaMetoda()
Activity
onCreate(Bundle)
onCreateOptionsMenu(Menu)
onStart()
onRestar t()
onResume()
onPause()
onStop()
onDestroy()
onSaveInstanceState()
startActivity(Intent)
findViewById(Int)
setContentView(View)
ContextThemeWrapper
startActivity(Intent)
ContextWrapper
startActivity(Intent)
Context
startActivity(Intent)
Abstrakcyjna klasa Context
(android.content.Context)
Klasa ContextWrapper
(android.content.ContextWrapper)
Klasa ContextThemeWrapper
(android.view.ContextThemeWrapper)
Klasa Activity
(android.app.Activity)
Klasa MojaAktywnosc
(com.hfad.foo)
Większość zachowań aktywności jest obsługiwana przez metody klasy
bazowej dziedziczone przez nasze aktywności. Nam pozostaje jedynie
przesłonięcie tych metod, które będą nam potrzebne.
Klasa
Activity
zawiera domyślne implementacje metod
cyklu życia aktywności. Oprócz tego definiuje także takie
metody jak
findViewById(Int)
i
setContentView(View)
.
Klasa
ContextThemeWrapper
umożliwia modyfikowanie
motywu z poziomu zawartości obiektu
ContextWrapper
.
Implementacja pośrednika do klasy
Context
.
To są metody cyklu życia aktywności.
W dalszej części rozdziału znajdziesz
więcej informacji na ich temat.
To nie są metody cyklu życia, lecz i tak
są bardzo przydatne. Większości z nich
używałeś już w poprzednich rozdziałach.
Interfejs do globalnych informacji na temat środowiska aplikacji. Zapewnia
dostęp do zasobów aplikacji, klas oraz operacji na poziomie aplikacji.
Skoro już dowiedziałeś się nieco więcej na temat metod cyklu
życia aktywności, zobaczmy, w jaki sposób można sobie radzić
ze zmianami konfiguracji urządzenia.
140
Rozdział 4.
Zapisywanie stanu
Zapisanie bieżącego stanu…
Jak można było łatwo zauważyć, w naszej aplikacji wystąpił problem, kiedy obróciliśmy
ekran urządzenia. Aktywność została usunięta i ponownie utworzona, co oznaczało
utratę wszystkich używanych w niej zmiennych lokalnych. Jak możemy sobie z tym
poradzić?
Najlepszym sposobem obsługi zmian konfiguracji jest zapisywanie bieżącego stanu
aktywności, a następnie odtwarzanie go w metodzie
onCreate()
.
Aby zapisać bieżący stan aktywności, konieczne jest zaimplementowanie metody
onSaveInstanceState()
. Metoda ta jest wywoływana przed usunięciem aktywności,
co oznacza, że zapewnia nam możliwość zapisania wszelkich wartości, których nie
chcemy utracić.
onCreate()
onSaveInstanceState()
onDestroy()
app/src/main
Stopwatch
Activity.java
Stoper
java
com.hfad.stoper
Aktywność
uruchomiona
Aktywność
działająca
Aktywność
usunięta
Metoda
onSaveInstanceState()
jest wywoływana
przed metodą
onDestroy(). Zapewnia
nam ona możliwość
zapisania stanu
aktywności przed jej
usunięciem.
Metoda
onSaveInstanceState()
ma jeden parametr — obiekt klasy
Bundle
.
Klasa
Bundle
pozwala gromadzić w jednym obiekcie dane różnych typów:
public void onSaveInstanceState(Bundle savedInstanceState) {
}
Obiekt klasy
Bundle
jest także przekazywany jako parametr do metody
onCreate()
. Oznacza to, że jeśli zapiszemy wartości zmiennych
seconds
i
running
w obiekcie
Bundle
, to metoda
onCreate()
będzie w stanie je
odczytać i zastosować podczas odtwarzania aktywności. Do umieszczania
informacji w obiekcie
Bundle
służą metody, które zapisują w nim
pary nazwa – wartość. Metody te mają następującą postać:
bundle.put*(”nazwa”, wartość)
gdzie
bundle
jest nazwą zmiennej typu
Bundle
,
*
określa typ zapisywanej
wartości, a
nazwa
i
wartość
to odpowiednio nazwa i wartość zapisywanej danej.
Na przykład aby zapisać w obiekcie
Bundle
wartość typu
int
przechowywanej
w zmiennej
seconds
, należałoby użyć następującego wywołania:
bundle.putInt(”seconds”, seconds);
W jednym obiekcie typu
Bundle
można zapisać wiele takich par danych.
Poniżej przedstawiliśmy kod metody
onSaveInstanceState()
używanej
w naszej aplikacji (dodamy ją do pliku
StopwatchActivity.java kilka stron dalej):
@Override
public void onSaveInstanceState(Bundle savedInstanceState)
{
savedInstanceState.putInt(”seconds”, seconds);
savedInstanceState.putBoolean(”running”, running);
}
Po zapisaniu wartości naszych zmiennych w obiekcie
Bundle
możemy
z nich skorzystać w metodzie
onCreate()
.
Te wywołania zapisują
wartości zmiennych seconds
i running w obiekcie Bundle.
Get Android Programowanie aplikacji. Rusz głową! Wydanie II now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.