Professional Documents
Culture Documents
RMA - PR7 Aktivnosti, Fragmenti I Loaderi
RMA - PR7 Aktivnosti, Fragmenti I Loaderi
Predavanje 6
▫ onPause()
sustav poziva ovu metodu na prvi znak korisnikovog napuštanja aktivnosti – ne znači
uništavanje aktivnosti
pohranjivanje promjena koje se trebaju sačuvati do povratka na aktivnost
Implementacija korisničkog sučelja
• korisničko sučelje aktivnosti je osigurano hijerarhijom pogleda (view)
▫ objekt izveden iz klase View
▫ svaki pogled kontrolira određeno pravokutno područje unutar prozora
aktivnosti i odgovara na interakciju korisnika
dugme koje aktivira akciju kada ga korisnik pritisne
• Layouti – način organizacije potomaka pogleda
• najčešći način definiranja korisničkog sučelja: upotreba XML datoteke
▫ odvojen programski kôd od dizajna
Implementacija korisničkog sučelja
• Automatski import u MainActivity.java:
▫ import android.support.v7.app.AppCompatActivity;
▫ import android.os.Bundle;
▫ import android.view.View;
▫ import android.widget.Button;
▫ import android.widget.TextView;
Deklaracija aktivnosti u manifestu
• aktivnost mora biti deklarirana u manifest datoteci
kako bi bila vidljiva sustavu
• resumed
▫ aktivnost je u prvom planu (foreground) na zaslonu i ima korisnikov fokus
Životni ciklus aktivnosti
• paused
▫ druga aktivnost je u prvom planu i ima korisnikov fokus, ali je još vidljiva
▫ nova aktivnost (prikaz na zaslonu) je djelomično prozirna ili ne prekriva
cijeli ekran
▫ pauzirana aktivnost potpuno živa (Activity objekt je ostao u memoriji,
održavaju se informacije o svim stanjima i članovima)
▫ aktivnost je još uvijek povezana s upraviteljem prozora
▫ aktivnost može biti ubijena u slučaju manjka slobodne memorije
Životni ciklus aktivnosti
• stopped
▫ Aktivnost je u pozadini
▫ prikaz aktivnosti na zaslonu je u potpunosti zaklonjen prikazom neke druge
aktivnosti
▫ objekt je ostao u memoriji, održavaju se informacije o svim stanjima i
članovima
▫ aktivnost više nije povezana s upraviteljem prozora
▫ aktivnost može biti ubijena u slučaju manjka slobodne memorije
Implementacija poziva u životnom ciklusu
• prijelaz aktivnosti iz jednog stanja u neko drugo popraćen je pozivnim
metodama
• svaka od metoda se može prepisati (engl. override)
public class ExampleActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// The activity is being created.
}
@Override
protected void onStart() {
super.onStart();
// The activity is about to become visible.
}
@Override
protected void onResume() {
super.onResume();
// The activity has become visible (it is now "resumed").
}
@Override
protected void onPause() {
super.onPause();
// Another activity is taking focus (this activity is about to be "paused").
}
@Override
protected void onStop() {
super.onStop();
// The activity is no longer visible (it is now "stopped")
}
@Override
protected void onDestroy() {
super.onDestroy();
// The activity is about to be destroyed.
}
}
Početak
Korisnik se vraća
onCreate()
nazad na aktivnost
onStart() onRestart()
Druga aktivnost
dolazi u prvi plan
Druga aplikacija
onPause()
treba memoriju
Aktivnost dolazi
Aktivnost nije više vidljiva u prvi plan
onStop()
onDestroy() Ugašena
Implementacija poziva u životnom ciklusu
• postoje tri petlje kroz koje aktivnost može prolaziti
▫ cijeli život
odvija se između prvog poziva onCreate() i zadnjeg (konačnog) poziva onDestroy()
aktivnost odrađuje globalno podešavanje u onCreate(), a otpušta sve zauzete resurse
u onDestroy()
▫ vidljivi život
aktivnost se izvršava između onStart() i onStop() metoda
za ovo vrijeme korisnik može vidjeti prikaz aktivnosti na zaslonu – iako ne mora biti
fokusirana i imati interakciju s korisnikom
između navedenih metoda može se upravljati potrebnim resursima za prikaz i izvršavanje
aktivnosti
Implementacija poziva u životnom ciklusu
▫ život u fokusu (foreground)
započinje pozivom onResume(), a završava pozivom onPause()
za ovo vrijeme aktivnost je ispred svih drugih aktivnosti i u interakciji s
korisnikom
normalno je ponavljanje ove petlje više puta za neku aktivnost
Implementacija poziva u životnom ciklusu
• pregled životnog ciklusa neke aktivnosti
▫ onCreate()
poziva se kada se aktivnost prvi puta kreira
inicijalizacija varijabli članova klase
onStart() je metoda koja se slijedeća poziva
mogućnost ubijanja aktivnosti: NE
slijedeća metoda: onStart()
▫ onRestart()
poziva se nakon što je aktivnost zaustavljena, a prije ponovnog pokretanja
onStart() je metoda koja se slijedeća poziva
mogućnost ubijanja aktivnosti: NE
slijedeća metoda: onStart()
Implementacija poziva u životnom ciklusu
▫ onStart()
poziva se kada aktivnost treba postati vidljiva korisniku
nakon nje mogu slijediti onResume() ako se aktivnost postavlja u prvi plan ili
onStop() ako postaje skrivena korisniku
mogućnost ubijanja aktivnosti: NE
slijedeće metode: onResume() ili onStop()
▫ onResume()
poziva se kada aktivnost treba biti u mogućnosti obavljati interakciju s korisnikom
aktivnost je na vrhu stoga
mogućnost ubijanja aktivnosti: NE
slijedeća metoda: onPause()
Implementacija poziva u životnom ciklusu
▫ onPause()
poziva se kada sustav treba nastaviti neku prethodnu aktivnost (resume) ili je
korisnik zatražio navigaciju do nekog drugog dijela sustava (Home)
ovo stanje se obično koristi za pohranu promjena podataka koji se trebaju
sačuvati
ako aktivnost treba vratiti u prvi plan, poziva se onResume()
ako aktivnost postaje skrivena korisniku, poziva se onStop()
mogućnost ubijanja aktivnosti: DA
slijedeće metode: onResume() ili onStop()
Implementacija poziva u životnom ciklusu
▫ onStop()
poziva se kada aktivnost više nije vidljiva korisniku jer se nastavila neka druga
aktivnost koja zaklanja ovu
započinje neka nova aktivnost ili se nastavlja neka sa stoga
slijede onRestart() ako treba obaviti interakciju s korisnikom ili
onDestroy() ako treba završiti aktivnost
mogućnost ubijanja aktivnosti: DA
slijedeće metode: onRestart() ili onDestroy()
Implementacija poziva u životnom ciklusu
▫ onDestroy()
zadnji poziv koji se obavi prije uništenja aktivnosti
poziva se jer je aktivnost završila (poziv finish() metode ili OS privremeno
uništava aktivnost kako bi dobio potrebne resurse)
dva navedena procesa se mogu razlikovati pozivom isFinished() metode
koja se često koristi u onPause() – određivanje da li je aktivnost pauzirana ili
uništena
mogućnost ubijanja aktivnosti: DA
slijedeća metoda: nema
Spremanje stanja aktivnosti
• ako sustav uništi aktivnost zbog oslobađanja memorije – Activity
objekt se uništava
▫ sustav ne može samo nastaviti aktivnost kao da je netaknuta
▫ Activity objekt se mora ponovno kreirati
▫ korisnik najčešće ne primjećuje cijeli proces
• najvažnije informacije o stanju aktivnosti se mogu sačuvati
▫ poziv metode onSaveInstanceState()
Spremanje stanja aktivnosti
• sustav poziva metodu za snimanje stanja prije nego što aktivnost
postane uništiva
• metodi se šalje argument Bundle u koji se mogu pohraniti bitne
informacije u obliku ime-vrijednost
▫ metode putString() i putInt()
• ako sustav ubije aktivnost, a korisnik nakon toga poželi ponovno
nastaviti rad aktivnosti, Bundle se šalje metodama onCreate() i
onRestoreInstanceState()
Spremanje stanja aktivnosti
Aktivnost se
izvršava
onCreate() ili
onSaveInstanceState() Instanca aktivnosti je
nedirnuta; nema
Spremanje stanja aktivnosti potrebe ponovno ju
Druga aktivnost dolazi u
prvi plan kreirati
Korisnik ponovno
pokreće aktivnost
onRestart()
onSaveInstanceState()
Proces ubijen* Spremanje stanja aktivnosti
Druga aktivnost dolazi u
prvi plan
Aplikacija višeg prioriteta Aktivnost nije
treba memoriju vidljiva
*instanca aktivnosti je uništena,
ali je stanje pohranjeno
Spremanje stanja aktivnosti
• ne postoji jamstvo da će onSaveInstanceState() biti pozvana prije
uništenja aktivnosti
▫ nema potrebe zapamtiti stanje
▫ poziva se prije onStop() i možda prije onPause()
• u slučaju izostanka implementacije metode za snimanje stanja, neka stanja
aktivnosti se vraćaju podrazumijevanom implementacijom metode u Activity
▫ za svaki prikaz (View) svaka promjena korisničkog sučelja se snima i vraća kada se
aktivnost reaktivira
▫ primjer: EditText ili CheckBox
▫ programer mora osigurati jedinstveni ID (android:id atribut) za svaki widget kojem
treba pamtiti stanje
Spremanje stanja aktivnosti
• u slučaju prepisivanja metode za snimanje stanja aktivnosti – prvo
pozvati superklasu
super.onSaveInstanceState();
• isto vrijedi i za vraćanje stanja aktivnosti
• brz način provjere rada spremanja stanja aktivnosti
▫ rotacija uređaja – promjena orijentacije zaslona
▫ aktivnost se uništava i stvara se nova za drugu orijentaciju zaslona
Rukovanje promjenama konfiguracije
• promjene se mogu dogoditi i za vrijeme rada aplikacije
▫ orijentacija zaslona, prikaz tipkovnice, jezik
• Android ponovno kreira aktivnost koja se izvršava
▫ poziva se onDestroy() i odmah zatim onCreate()
• takvo ponašanje pomaže prilagodbi aplikacije na promjene
Koordiniranje aktivnosti
• kada jedna aktivnost pokrene drugu obje prolaze promjene životnog
ciklusa
• prva aktivnost se pauzira i zaustavlja (ne mora se zaustaviti ako je
vidljiva u pozadini) dok se kreira druga aktivnost
• u slučaju da aktivnosti dijele snimljene podatke važno je razumjeti da
prva aktivnost nije u potpunosti zaustavljena dok se druga nije kreirala
• proces pokretanja nove aktivnosti se preklapa s procesom zaustavljanja
prve
Koordiniranje aktivnosti
• redoslijed poziva u životnom ciklusu je dobro definiran, pogotovo ako su
dvije aktivnosti dio istog procesa i jedna pokreće drugu
• primjer kada aktivnost A pokreće aktivnost B
1. izvršava se metoda onPause() aktivnosti A
2. izvršavaju se redom za aktivnost B: onCreate(), onStart() i
onResume() (aktivnost B ima korisnikov fokus)
3. ako aktivnost A nije vidljiva na zaslonu, izvršava se njena onStop()
metoda
Koordiniranje aktivnosti
• ako aktivnost B treba podatke koje u bazu zapisuje aktivnost A
• u kojoj metodi aktivnosti A napisati programski kôd?
• onPause()
Fragmenti
• FLAG_ACTIVITY_NEW_TASK
▫ pokretanje aktivnosti u novom zadatku
▫ ako već radi zadatak za aktivnost koja se pokreće, zadatak se postavlja u
prvi plan sa povraćenim zadnjim stanjem, a aktivnost prima novi intent u
onNewIntent()
▫ kao “singleTask”
Definiranje načina pokretanja
Korištenjem Intent Flagova
• FLAG_ACTIVITY_SINGLE_TOP
▫ ako je aktivnost koja se pokreće trenutna aktivnost (na vrhu stoga),
postojeća instanca prima poziv u onNewIntent(), a ne kreira se nova
instanca aktivnosti
▫ kao “singleTop”
Definiranje načina pokretanja
Korištenjem Intent Flagova
• FLAG_ACTIVITY_CLEAR_TOP
▫ ako se aktivnost koja se pokreće već radi u trenutnom zadatku, umjesto
pokretanja nove instance aktivnosti, sve aktivnosti iznad ove se uništavaju a
intent se šalje nastavljenoj (resumed) instanci aktivnosti – na vrhu
▫ ne postoji alternativa za manifest
Rukovanje afinitetima
• afinitet označava kojem zadatku aktivnost preferira pripadati
• aktivnosti iste aplikacije međusobno imaju afinitet – preferiraju
pripadati istom zadatku
• podrazumijevani afinitet aktivnosti se može promijeniti
• aktivnosti definirane u različitim aplikacijama mogu dijeliti afinitet
• afinitet aktivnosti se može mijenjati atributom taskAffinity unutar
elementa <activity>
Brisanje stoga
• ako korisnik ostavi zadatak dulje vrijeme, sustav iz zadatka briše sve
aktivnosti osim glavne (root)
• atributi kojima se može modificirati ponašanje:
▫ alwaysRetainTaskState
true – root aktivnost ne pokazuje ponašanje opisano gore
▫ clearTaskOnLaunch
true – stog se briše do root aktivnosti uvijek kada korisnik napusti zadatak –
suprotno od gore navedenog atributa
▫ finishOnTaskLaunch
kao clearTaskOnLaunch ali za jednu aktivnost, ne za zadatak
Pokretanje zadatka
• može se podesiti aktivnost kao početna točka za zadatak
• intent filter
"android.intent.action.MAIN“
"android.intent.category.LAUNCHER“
Pitanja?