Životni ciklusi

Svaki fragment i svaka aktivnost u Android aplikaciji ima svoj životni ciklus. Životni ciklus je niz stanja kroz koje aktivnost može da prođe tokom svog izvršavanja. Ovo funkcioniše na sličan način kao i procesi u operativnim sistemima. Aktivnosti mogu da budu napravljanje, pokrenute, da čekaju, da nastave sa izvršavanjem i da se unište. Fragmenti rade na sličan način kao i aktivnosti - suštinske razlike zapravo i nema između ta dva, ali postoje razlike u imenima nekim metodama.

Stanja procesa Stanja aktivnosti Stanja fragmenta

Sa nekim od ovih metoda smo se već sreli i ranije. Recimo, možemo primetiti na slikama da se nalazi metod onCreate. Taj metod se poziva kada se pokreće neka aktivnost ili fragment, nakon što se taj proces inicijalizuje. Bitno je spomeuti da, kad se formira naš onCreate metod, mora prvo da se pozove metod natklase na način:

private fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    naredbe...
}


Prethodni komentar važi i za ostale metode u ovom poglavlju. Metod onStart odgovara stanju Started. On se poziva nakon što se izvrši onCreate i dok se taj metod izvršava, vidljiva je aktivnost na ekranu (iscrtava se odgovarajući prozor, izvršavaju se delovi koda na tom procesu). Metod onStart se može pozivati više puta tokom izvršavanja aktivnosti ili procesa. Recimo, može se desiti da se proces zaustavi ili da mora ponovo da se pokrene zbog neke greške, nakon čega se opet poziva metod onStart.
Metod onStop se poziva kada se aktivnost prekine, ali se ne uništi. Recimo, to može da se desi ako izađemo iz aplikacije, ali je ne zatvorimo. U tom slučaju, poziva se metod onStop da obradi novonastalu situaciju, a proces se vraća u stanje Created. Nakon što se korisnik vrati na aplikaciju, pokreće se metod onStart koji ga vraća aktivnost na stanje Started.
Metod onPause je sličan sa metodom onStop u tome što se aktivnost prekida. Ključna razlika je što aktivnost prekinuta sa onStop nije vidljiva korisniku, a sa onPause ostaje vidljiva, iako nije trenutno njoj posvećena pažnja. To se može videti ako se klikne dugme Share na nekoj aplikaciji. Tada će iskočiti meni sa aplikacijama koje možemo pozvati, ali će ono što se dešava na ostatku prozora ostati vidljivo korisniku. Tada se taj deo na kome trenutno nije pažnja pauzira, dok se ne dobije pažnja opet preko metoda onResume.
Metod onDestroy se poziva kada aktivnost više nije aktivna uopšte i može da se očisti prostor koji je zauzimala. Recimo, ako skrenemo na drugi prozor aplikacije, možemo aktivnost vezanu za prethodni da uništimo. Kao i na slici, može se uništiti samo ona aktivnost koja je u stanju Created, što znači da bismo morali iz ostalih stanja da se spuštamo do stanja Created, uz pozive odgovarajućih metoda, da bismo pozvali metod onDestroy.
Što se fragmenata tiče, kod njih ne postoje neke ključne razlike između ovih metoda. Fragmenti poseduju i neke svoje metode koje ih vezuju za aktivnosti.
Metod onAttach se poziva kada se fragment poveže sa aktivnošću u kojoj se nalazi. onCreateView se poziva da bi prikupio informacije o tome šta treba da se crta na ekranu vezano za taj fragment. Metod onViewCreated se poziva odmah posle onCreateView pre nego što se obnovilo bilo koje sačuvano stanje.
Po potrebi, neki od navedenih metoda mogu da prime kao argument neko sačuvano stanje u objektu klase Bundle.

Biblioteka lifecycle

Pri radu sa stanjima aktivnosti/fragmenta, mora se pažljivo pristupati. Ono što smo započeli dok je aktivnost bila pokrenuta, mora se prekinuti kada se aktivnost zaustavi. Recimo, ako imamo jedan tajmer koji se pokreće u metodu onStart, taj tajmer se mora isključiti u metodu onStop. Aplikacije često nisu ovako jednostavne i praćenje uključivanja i isključivanja može biti teško. Iz tog razloga, osmišljena je biblioteka lifecycle u kojoj se lakše prate ove pojave. Ključni deo ove biblioteke je klasa LifecycleObserver koja je "svesna" stanja u kojima se aktivnost nalazi i, u skladu sa njima, određene akcije pokreće ili obustavlja. Struktura potklasa od LifeCycleObserver je obično ovakva:

class KlasaA(lifecycle: Lifecycle) : LifecycleObserver() {
    naredbe...
    init {
        // dodajemo posmatrača koji prati stanja aktivnosti
        lifecycle.addObserver(this)
    }
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun pokreni(argumenti...) {
        naredbe...
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun zaustavi(argumenti...) {
         naredbe...
    }
}

Pre definisanja metoda za pokretanje i zaustavljanje, metod nadovezujemo za odgovarajući metod aktivnosti u kojoj se nalazi objekat klase A. Recimo, instanciranje elementa klase A bi se desilo u metodu onCreate i izgledalo bi ovako:


lateinit var elementA: KlasaA

...

fun onCreate(...) {
    ...

   elementA = KlasaA(this.lifecycle)

   ... 
}