1. Dobrodošli
Ova praktična laboratorija za kodiranje dio je 1. jedinice: Početak tečaja Osnove programera za Android (verzija 2). Izvući ćete najveću vrijednost iz ovog tečaja ako radite kroz laboratorije kodiranja u nizu:
- Za potpuni popis laboratorija za kodiranje u tečaju pogledajte laboratorije za kodiranje za Android Developer Fundamentals (V2).
- Za pojedinosti o tečaju, uključujući poveznice na sva konceptualna poglavlja, aplikacije i slajdove, pogledajte Android Developer Fundamentals (verzija 2).
Uvod
U ovoj vježbi saznat ćete više o životnom ciklusu aktivnosti. Životni ciklus je skup stanja u kojima aktivnost može biti tijekom cijelog životnog vijeka, od trenutka kada je stvorena do trenutka kada je uništena i sustav povrati svoje resurse. Dok se korisnik kreće između aktivnosti u vašoj aplikaciji (kao i ui iz vaše aplikacije), aktivnosti se mijenjaju između različitih stanja u svojim životnim ciklusima.
Svaka faza u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva: onCreate(), onStart(), onPause() i tako dalje. Kada aktivnost promijeni stanje, poziva se pridružena metoda povratnog poziva. Već ste vidjeli jednu od ovih metoda: onCreate(). Nadjačavanjem bilo koje metode povratnog poziva životnog ciklusa u svojim klasama aktivnosti, možete promijeniti zadano ponašanje aktivnosti kao odgovor na akcije korisnika ili sustava.
Stanje aktivnosti također se može promijeniti kao odgovor na promjene konfiguracije uređaja, na primjer kada korisnik rotira uređaj iz okomitog u pejzažni položaj. Kada se dogode te promjene konfiguracije, aktivnost se uništava i ponovno stvara u zadanom stanju, a korisnik može izgubiti podatke koje je unio u aktivnost. Kako biste izbjegli zbunjivanje svojih korisnika, važno je da razvijete svoju aplikaciju kako biste spriječili neočekivani gubitak podataka. Kasnije u ovoj praktici eksperimentirate s promjenama konfiguracije i naučite kako sačuvati stanje aktivnosti kao odgovor na promjene konfiguracije uređaja i druge događaje životnog ciklusa aktivnosti.
U ovoj praksi dodajete izjave o bilježenju u aplikaciju TwoActivities i promatrate promjene životnog ciklusa aktivnosti dok koristite aplikaciju. Zatim počinjete raditi s tim promjenama i istražujete kako postupati s korisničkim unosom pod tim uvjetima.
Preduvjeti
Trebali biste moći:
- Stvorite i pokrenite projekt aplikacije u Android Studiju .
- Dodajte zapisnike u svoju aplikaciju i pregledajte te zapisnike u oknu Logcat.
- Razumjeti i raditi s aktivnostima i namjerama i osjećati se ugodno u interakciji s njima.
Što ćete naučiti
- Kako funkcionira životni ciklus aktivnosti.
- Kada se aktivnost pokrene, pauzira, zaustavlja se i uništava.
- O metodama povratnog poziva životnog ciklusa povezanim s promjenama aktivnosti.
- Učinak radnji (kao što su promjene konfiguracije) koje mogu rezultirati događajima životnog ciklusa aktivnosti.
- Kako zadržati stanje aktivnosti kroz događaje životnog ciklusa.
Što ćeš učiniti
- Dodajte kôd u aplikaciju TwoActivities iz prethodne praktične primjene kako biste implementirali različite povratne pozive životnog ciklusa aktivnosti kako biste uključili izjave zapisivanja.
- Promatrajte promjene stanja dok vaša aplikacija radi i dok komunicirate sa svakom aktivnošću u svojoj aplikaciji.
- Izmijenite svoju aplikaciju tako da zadrži stanje instance aktivnosti koja se neočekivano ponovno stvara kao odgovor na ponašanje korisnika ili promjenu konfiguracije na uređaju.
2. Pregled aplikacije
U ovoj praksi dodajete u aplikaciju TwoActivities . Aplikacija izgleda i ponaša se otprilike isto kao u prošloj laboratoriji za kodiranje. Sadrži dvije implementacije aktivnosti i daje korisniku mogućnost slanja između njih. Promjene koje napravite u aplikaciji u ovoj praksi neće utjecati na njezino vidljivo korisničko ponašanje.
3. 3. Zadatak 1: Dodajte povratne pozive životnog ciklusa u TwoActivities
U ovom zadatku implementirat ćete sve metode povratnog poziva životnog ciklusa aktivnosti za ispis poruka u logcat kada se te metode pozovu. Ove poruke zapisnika omogućit će vam da vidite kada životni ciklus aktivnosti mijenja stanje i kako te promjene stanja životnog ciklusa utječu na vašu aplikaciju dok radi.
1.1 (Izborno) Kopirajte projekt TwoActivities
Za zadatke u ovoj vježbi modificirat ćete postojeći projekt TwoActivities koji ste izradili u prošloj vježbi. Ako želite zadržati prethodni projekt TwoActivities netaknutim, slijedite korake u Dodatku: Pomoćni programi da biste napravili kopiju projekta.
1.2 Implementirajte povratne pozive u MainActivity
- Otvorite projekt TwoActivities u Android Studiju i otvorite MainActivity u oknu Projekt > Android.
- U metodi onCreate() dodajte sljedeće izjave dnevnika:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- Dodajte nadjačavanje za onStart() povratni poziv, s izjavom u dnevnik za taj događaj:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
Za prečac odaberite Kod > Nadjačaj metode u Android Studiju. Pojavljuje se dijaloški okvir sa svim mogućim metodama koje možete nadjačati u svojoj klasi. Odabir jedne ili više metoda povratnog poziva s popisa umeće potpuni predložak za te metode, uključujući traženi poziv superklasi.
- Koristite metodu onStart() kao predložak za implementaciju povratnih poziva životnog ciklusa onPause(), onRestart(), onResume(), onStop() i onDestroy().
Sve metode povratnog poziva imaju iste potpise (osim imena). Ako kopirate i zalijepite onStart() za stvaranje ovih drugih metoda povratnog poziva, ne zaboravite ažurirati sadržaj da biste pozvali pravu metodu u superklasi i zabilježili ispravnu metodu.
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat. Trebali biste vidjeti tri poruke dnevnika koje prikazuju tri stanja životnog ciklusa kroz koje je aktivnost prošla kada je započela:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 Implementirajte povratne pozive životnog ciklusa u SecondActivity
Sada kada ste implementirali metode povratnog poziva životnog ciklusa za MainActivity, učinite isto za SecondActivity.
- Otvorite SecondActivity.
- Na vrhu klase dodajte konstantu za varijablu LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- Dodajte povratne pozive životnog ciklusa i izjave zapisnika u drugu aktivnost. (Možete kopirati i zalijepiti metode povratnog poziva iz MainActivity.)
- Dodajte iskaz dnevnika metodi returnReply() neposredno prije metode finish():
Log.d(LOG_TAG, "End SecondActivity");
1.4 Promatrajte zapisnik dok aplikacija radi**
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat.
- Unesite Aktivnost u okvir za pretraživanje. Android logcat može biti vrlo dug i pretrpan. Budući da varijabla LOG_TAG u svakoj klasi sadrži ili riječi MainActivity ili SecondActivity, ova vam ključna riječ omogućuje filtriranje dnevnika samo za stvari koje vas zanimaju.
Eksperimentirajte sa svojom aplikacijom i imajte na umu da se događaji životnog ciklusa javljaju kao odgovor na različite radnje. Posebno pokušajte sljedeće:
- Koristite aplikaciju normalno (pošaljite poruku, odgovorite drugom porukom).
- Koristite gumb Natrag za povratak s druge aktivnosti na glavnu aktivnost.
- Koristite strelicu prema gore na traci aplikacije za povratak s druge aktivnosti na glavnu aktivnost.
- Rotirajte uređaj na glavnoj i drugoj aktivnosti u različito vrijeme u svojoj aplikaciji i promatrajte što se događa u * zapisniku i na zaslonu.
- Pritisnite gumb za pregled (kvadratni gumb s desne strane Početne stranice) i zatvorite aplikaciju (dodirnite X).
- Vratite se na početni zaslon i ponovno pokrenite aplikaciju.
SAVJET: Ako svoju aplikaciju pokrećete u emulatoru, možete simulirati rotaciju pomoću Control+F11 ili Control+Function+F11.
Šifra rješenja 1. zadatka
Sljedeći isječci koda prikazuju kod rješenja za prvi zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Log the start of the onCreate() method.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
Ostale metode životnog ciklusa:
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
Druga aktivnost
Sljedeći isječci koda prikazuju dodani kod u SecondActivity, ali ne cijelu klasu.
Na vrhu klase SecondActivity:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
Metoda returnReply():
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
Ostale metode životnog ciklusa:
Isto kao za MainActivity, gore.
4. 4. Zadatak 2: Spremite i vratite stanje instance Aktivnosti
Ovisno o resursima sustava i ponašanju korisnika, svaka aktivnost u vašoj aplikaciji može biti uništena i rekonstruirana mnogo češće nego što mislite.
Možda ste primijetili ovo ponašanje u prošlom odjeljku kada ste rotirali uređaj ili emulator. Rotiranje uređaja jedan je od primjera promjene konfiguracije uređaja. Iako je rotacija najčešća, sve promjene konfiguracije rezultiraju uništavanjem trenutne aktivnosti i ponovnom stvaranjem kao da je nova. Ako ne uzmete u obzir ovo ponašanje u svom kodu, kada dođe do promjene konfiguracije, vaš izgled aktivnosti može se vratiti na zadani izgled i početne vrijednosti, a vaši korisnici mogu izgubiti svoje mjesto, svoje podatke ili stanje svog napretka u svoju aplikaciju.
Stanje svake aktivnosti pohranjuje se kao skup parova ključ/vrijednost u Bundle objektu koji se naziva stanje instance aktivnosti. Sustav sprema informacije o zadanom stanju u Bundle stanja instance neposredno prije nego što se aktivnost zaustavi i prosljeđuje taj Bundle novoj instanci Activity za vraćanje.
Kako biste spriječili gubitak podataka u aktivnosti kada se neočekivano unište i ponovno kreiraju, trebate implementirati metodu onSaveInstanceState(). Sustav poziva ovu metodu na vašoj aktivnosti (između onPause() i onStop()) kada postoji mogućnost da se aktivnost uništi i ponovno stvori.
Podaci koje spremate u stanju instance specifični su samo za ovu instancu ove specifične aktivnosti tijekom trenutne sesije aplikacije. Kada zaustavite i ponovno pokrenete novu sesiju aplikacije, stanje instance aktivnosti se gubi i aktivnost se vraća na svoj zadani izgled. Ako trebate spremiti korisničke podatke između sesija aplikacije, upotrijebite zajedničke postavke ili bazu podataka. O oboje ćete naučiti u kasnijoj praktici.
2.1 Spremite stanje instance aktivnosti pomoću onSaveInstanceState()
Možda ste primijetili da rotiranje uređaja uopće ne utječe na stanje druge aktivnosti. To je zato što se drugi izgled i stanje aktivnosti generiraju iz izgleda i namjere koja ga je aktivirala. Čak i ako se aktivnost ponovno stvori, namjera je još uvijek tu i podaci u toj namjeri i dalje se koriste svaki put kada se pozove metoda onCreate() u drugoj aktivnosti.
Osim toga, možete primijetiti da se u svakoj aktivnosti svaki tekst koji ste upisali u elemente poruke ili odgovora EditText zadržava čak i kada se uređaj okrene. To je zato što se podaci o stanju nekih elemenata prikaza u vašem izgledu automatski spremaju tijekom promjena konfiguracije, a trenutna vrijednost EditText-a jedan je od tih slučajeva.
Dakle, jedino stanje aktivnosti koje vas zanima su TextView elementi za zaglavlje odgovora i tekst odgovora u glavnoj aktivnosti. Oba TextView elementa su nevidljiva prema zadanim postavkama; pojavljuju se samo kada pošaljete poruku natrag u glavnu aktivnost iz druge aktivnosti.
U ovom zadatku dodajete kod za očuvanje stanja instance ova dva TextView elementa pomoću onSaveInstanceState().
- Otvorite MainActivity.
- Dodajte ovu kosturnu implementaciju onSaveInstanceState() u aktivnost ili upotrijebite Kod > Metode nadjačavanja za umetanje kosturnog nadjačavanja.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- Provjerite je li zaglavlje trenutno vidljivo i ako jest, stavite to stanje vidljivosti u paket stanja s metodom putBoolean() i ključem "reply_visible".
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Imajte na umu da su zaglavlje i tekst odgovora označeni kao nevidljivi dok ne dobijete odgovor iz druge aktivnosti. Ako je zaglavlje vidljivo, tada postoje podaci o odgovoru koje je potrebno spremiti. Imajte na umu da nas zanima samo to stanje vidljivosti — stvarni tekst zaglavlja ne treba spremati jer se taj tekst nikada ne mijenja.
- Unutar te iste provjere dodajte tekst odgovora u Bundle.
outState.putString("reply_text",mReplyTextView.getText().toString());
Ako je zaglavlje vidljivo, možete pretpostaviti da je i sama poruka odgovora vidljiva. Ne morate testirati ili spremati trenutno stanje vidljivosti poruke odgovora. Samo stvarni tekst poruke ide u stanje Bundle s ključem "reply_text".
Spremate stanje samo onih elemenata prikaza koji bi se mogli promijeniti nakon što se aktivnost stvori. Ostali View elementi u vašoj aplikaciji (EditText, Button) mogu se ponovno kreirati iz zadanog izgleda u bilo kojem trenutku.
Imajte na umu da će sustav spremiti stanje nekih View elemenata, kao što je sadržaj EditText.
2.2 Vratite stanje instance aktivnosti u onCreate()
Nakon što ste spremili stanje instance aktivnosti, također ga morate vratiti kada se aktivnost ponovno stvori. To možete učiniti u onCreate() ili implementacijom onRestoreInstanceState() povratnog poziva, koji se poziva nakon onStart() nakon što je Activity kreirana.
Većinu vremena bolje mjesto za vraćanje stanja aktivnosti je u onCreate(), kako bi se osiguralo da je korisničko sučelje, uključujući stanje, dostupno što je prije moguće. Ponekad je zgodno to učiniti u onRestoreInstanceState() nakon što je sva inicijalizacija obavljena ili dopustiti podklasama da odluče hoće li koristiti vašu zadanu implementaciju.
- U metodi onCreate(), nakon što se varijable View inicijaliziraju pomoću findViewById(), dodajte test kako biste bili sigurni da savedInstanceState nije null.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the state.
if (savedInstanceState != null) {
}
Kada se vaša aktivnost kreira, sustav prosljeđuje paket stanja onCreate() kao jedini argument. Prvi put kada se onCreate() pozove i vaša aplikacija pokrene, Bundle je null—nema postojećeg stanja kada se vaša aplikacija prvi put pokrene. Naknadni pozivi onCreate() imaju skup popunjen podacima koje ste pohranili u onSaveInstanceState().
- Unutar te provjere, dohvatite trenutnu vidljivost (true ili false) iz paketa pomoću ključa "reply_visible".
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- Dodajte test ispod prethodnog retka za varijablu isVisible.
if (isVisible) {
}
Ako u paketu stanja postoji ključ reply_visible (i isVisible je stoga istinit), morat ćete vratiti stanje.
- Unutar isVisible testa, učinite zaglavlje vidljivim.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- Dobijte tekstualni odgovor iz paketa s ključem "reply_text" i postavite odgovor TextView da prikazuje taj niz.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- Učini odgovor TextView također vidljivim:
mReplyTextView.setVisibility(View.VISIBLE);
- Pokrenite aplikaciju. Pokušajte rotirati uređaj ili emulator kako biste bili sigurni da poruka odgovora (ako postoji) ostaje na zaslonu nakon što se aktivnost ponovno stvori.
Šifra rješenja 2. zadatka
Sljedeći isječci koda prikazuju kôd rješenja za ovaj zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onSaveInstanceState():
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// If the heading is visible, message needs to be saved.
// Otherwise we're still using default layout.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text",
mReplyTextView.getText().toString());
}
}
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the saved state.
// See onSaveInstanceState() for what gets saved.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
// Show both the header and the message views. If isVisible is
// false or missing from the bundle, use the default layout.
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState
.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
Kompletan projekt:
Projekt Android Studio: TwoActivitiesLifecycle
5. Kodiranje
Izazov: Napravite jednostavnu aplikaciju popisa za kupnju s glavnom aktivnošću za popis koji korisnik izrađuje i drugom aktivnošću za popis uobičajenih artikala za kupnju.
- Glavna aktivnost trebala bi sadržavati popis za izradu, koji bi trebao biti sastavljen od deset praznih TextView elemenata.
- Gumb Dodaj artikl u glavnoj aktivnosti pokreće drugu aktivnost koja sadrži popis uobičajenih artikala za kupnju (sir, riža, jabuke i tako dalje). Koristite elemente gumba za prikaz stavki.
- Odabir stavke vraća korisnika na glavnu aktivnost i ažurira prazan TextView da uključi odabranu stavku.
Koristite namjeru za prijenos informacija iz jedne aktivnosti u drugu. Provjerite je li trenutno stanje popisa za kupovinu spremljeno kada korisnik okrene uređaj.
6. Sažetak
- Životni ciklus Aktivnosti je skup stanja kroz koja Aktivnost migrira, počevši kada je prvi put kreirana i završava kada Android sustav povrati resurse za tu Aktivnost.
- Kako korisnik prelazi s jedne Aktivnosti na drugu, unutar i izvan vaše aplikacije, svaka se Aktivnost kreće između stanja u životnom ciklusu Aktivnosti.
- Svako stanje u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva koju možete nadjačati u svojoj klasi aktivnosti.
- Metode životnog ciklusa su onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
- Nadjačavanje metode povratnog poziva životnog ciklusa omogućuje vam dodavanje ponašanja koje se događa kada vaša aktivnost prijeđe u to stanje.
- Svojim klasama u Android Studiju možete dodati metode nadjačavanja kostura pomoću Koda > Nadjačavanje.
- Promjene konfiguracije uređaja, kao što je rotacija, rezultiraju uništavanjem i ponovnim stvaranjem aktivnosti kao da je nova.
- Dio stanja aktivnosti sačuvan je nakon promjene konfiguracije, uključujući trenutne vrijednosti elemenata EditText. Za sve ostale podatke, te podatke morate izričito sami spremiti.
- Spremi stanje instance aktivnosti u onSaveInstanceState() metodi.
- Podaci o stanju instance pohranjuju se kao jednostavni parovi ključ/vrijednost u paketu. Koristite Bundle metode za stavljanje podataka u i povrat podataka iz Bundlea.
- Vratite stanje instance u onCreate(), što je preferirani način, ili onRestoreInstanceState(). Nazad
1. Dobrodošli
Ova praktična laboratorija za kodiranje dio je 1. jedinice: Početak tečaja Osnove programera za Android (verzija 2). Izvući ćete najveću vrijednost iz ovog tečaja ako radite kroz laboratorije kodiranja u nizu:
- Za potpuni popis laboratorija za kodiranje u tečaju pogledajte laboratorije za kodiranje za Android Developer Fundamentals (V2).
- Za pojedinosti o tečaju, uključujući poveznice na sva konceptualna poglavlja, aplikacije i slajdove, pogledajte Android Developer Fundamentals (verzija 2).
Uvod
U ovoj vježbi saznat ćete više o životnom ciklusu aktivnosti. Životni ciklus je skup stanja u kojima aktivnost može biti tijekom cijelog životnog vijeka, od trenutka kada je stvorena do trenutka kada je uništena i sustav povrati svoje resurse. Dok se korisnik kreće između aktivnosti u vašoj aplikaciji (kao i ui iz vaše aplikacije), aktivnosti se mijenjaju između različitih stanja u svojim životnim ciklusima.
Svaka faza u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva: onCreate(), onStart(), onPause() i tako dalje. Kada aktivnost promijeni stanje, poziva se pridružena metoda povratnog poziva. Već ste vidjeli jednu od ovih metoda: onCreate(). Nadjačavanjem bilo koje metode povratnog poziva životnog ciklusa u svojim klasama aktivnosti, možete promijeniti zadano ponašanje aktivnosti kao odgovor na akcije korisnika ili sustava.
Stanje aktivnosti također se može promijeniti kao odgovor na promjene konfiguracije uređaja, na primjer kada korisnik rotira uređaj iz okomitog u pejzažni položaj. Kada se dogode te promjene konfiguracije, aktivnost se uništava i ponovno stvara u zadanom stanju, a korisnik može izgubiti podatke koje je unio u aktivnost. Kako biste izbjegli zbunjivanje svojih korisnika, važno je da razvijete svoju aplikaciju kako biste spriječili neočekivani gubitak podataka. Kasnije u ovoj praktici eksperimentirate s promjenama konfiguracije i naučite kako sačuvati stanje aktivnosti kao odgovor na promjene konfiguracije uređaja i druge događaje životnog ciklusa aktivnosti.
U ovoj praksi dodajete izjave o bilježenju u aplikaciju TwoActivities i promatrate promjene životnog ciklusa aktivnosti dok koristite aplikaciju. Zatim počinjete raditi s tim promjenama i istražujete kako postupati s korisničkim unosom pod tim uvjetima.
Preduvjeti
Trebali biste moći:
- Stvorite i pokrenite projekt aplikacije u Android Studiju .
- Dodajte zapisnike u svoju aplikaciju i pregledajte te zapisnike u oknu Logcat.
- Razumjeti i raditi s aktivnostima i namjerama i osjećati se ugodno u interakciji s njima.
Što ćete naučiti
- Kako funkcionira životni ciklus aktivnosti.
- Kada se aktivnost pokrene, pauzira, zaustavlja se i uništava.
- O metodama povratnog poziva životnog ciklusa povezanim s promjenama aktivnosti.
- Učinak radnji (kao što su promjene konfiguracije) koje mogu rezultirati događajima životnog ciklusa aktivnosti.
- Kako zadržati stanje aktivnosti kroz događaje životnog ciklusa.
Što ćeš učiniti
- Dodajte kôd u aplikaciju TwoActivities iz prethodne praktične primjene kako biste implementirali različite povratne pozive životnog ciklusa aktivnosti kako biste uključili izjave zapisivanja.
- Promatrajte promjene stanja dok vaša aplikacija radi i dok komunicirate sa svakom aktivnošću u svojoj aplikaciji.
- Izmijenite svoju aplikaciju tako da zadrži stanje instance aktivnosti koja se neočekivano ponovno stvara kao odgovor na ponašanje korisnika ili promjenu konfiguracije na uređaju.
2. Pregled aplikacije
U ovoj praksi dodajete u aplikaciju TwoActivities . Aplikacija izgleda i ponaša se otprilike isto kao u prošloj laboratoriji za kodiranje. Sadrži dvije implementacije aktivnosti i daje korisniku mogućnost slanja između njih. Promjene koje napravite u aplikaciji u ovoj praksi neće utjecati na njezino vidljivo korisničko ponašanje.
3. 3. Zadatak 1: Dodajte povratne pozive životnog ciklusa u TwoActivities
U ovom zadatku implementirat ćete sve metode povratnog poziva životnog ciklusa aktivnosti za ispis poruka u logcat kada se te metode pozovu. Ove poruke zapisnika omogućit će vam da vidite kada životni ciklus aktivnosti mijenja stanje i kako te promjene stanja životnog ciklusa utječu na vašu aplikaciju dok radi.
1.1 (Izborno) Kopirajte projekt TwoActivities
Za zadatke u ovoj vježbi modificirat ćete postojeći projekt TwoActivities koji ste izradili u prošloj vježbi. Ako želite zadržati prethodni projekt TwoActivities netaknutim, slijedite korake u Dodatku: Pomoćni programi da biste napravili kopiju projekta.
1.2 Implementirajte povratne pozive u MainActivity
- Otvorite projekt TwoActivities u Android Studiju i otvorite MainActivity u oknu Projekt > Android.
- U metodi onCreate() dodajte sljedeće izjave dnevnika:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- Dodajte nadjačavanje za onStart() povratni poziv, s izjavom u dnevnik za taj događaj:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
Za prečac odaberite Kod > Nadjačaj metode u Android Studiju. Pojavljuje se dijaloški okvir sa svim mogućim metodama koje možete nadjačati u svojoj klasi. Odabir jedne ili više metoda povratnog poziva s popisa umeće potpuni predložak za te metode, uključujući traženi poziv superklasi.
- Koristite metodu onStart() kao predložak za implementaciju povratnih poziva životnog ciklusa onPause(), onRestart(), onResume(), onStop() i onDestroy().
Sve metode povratnog poziva imaju iste potpise (osim imena). Ako kopirate i zalijepite onStart() za stvaranje ovih drugih metoda povratnog poziva, ne zaboravite ažurirati sadržaj da biste pozvali pravu metodu u superklasi i zabilježili ispravnu metodu.
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat. Trebali biste vidjeti tri poruke dnevnika koje prikazuju tri stanja životnog ciklusa kroz koje je aktivnost prošla kada je započela:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 Implementirajte povratne pozive životnog ciklusa u SecondActivity
Sada kada ste implementirali metode povratnog poziva životnog ciklusa za MainActivity, učinite isto za SecondActivity.
- Otvorite SecondActivity.
- Na vrhu klase dodajte konstantu za varijablu LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- Dodajte povratne pozive životnog ciklusa i izjave zapisnika u drugu aktivnost. (Možete kopirati i zalijepiti metode povratnog poziva iz MainActivity.)
- Dodajte iskaz dnevnika metodi returnReply() neposredno prije metode finish():
Log.d(LOG_TAG, "End SecondActivity");
1.4 Promatrajte zapisnik dok aplikacija radi**
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat.
- Unesite Aktivnost u okvir za pretraživanje. Android logcat može biti vrlo dug i pretrpan. Budući da varijabla LOG_TAG u svakoj klasi sadrži ili riječi MainActivity ili SecondActivity, ova vam ključna riječ omogućuje filtriranje dnevnika samo za stvari koje vas zanimaju.
Eksperimentirajte sa svojom aplikacijom i imajte na umu da se događaji životnog ciklusa javljaju kao odgovor na različite radnje. Posebno pokušajte sljedeće:
- Koristite aplikaciju normalno (pošaljite poruku, odgovorite drugom porukom).
- Koristite gumb Natrag za povratak s druge aktivnosti na glavnu aktivnost.
- Koristite strelicu prema gore na traci aplikacije za povratak s druge aktivnosti na glavnu aktivnost.
- Rotirajte uređaj na glavnoj i drugoj aktivnosti u različito vrijeme u svojoj aplikaciji i promatrajte što se događa u * zapisniku i na zaslonu.
- Pritisnite gumb za pregled (kvadratni gumb s desne strane Početne stranice) i zatvorite aplikaciju (dodirnite X).
- Vratite se na početni zaslon i ponovno pokrenite aplikaciju.
SAVJET: Ako svoju aplikaciju pokrećete u emulatoru, možete simulirati rotaciju pomoću Control+F11 ili Control+Function+F11.
Šifra rješenja 1. zadatka
Sljedeći isječci koda prikazuju kod rješenja za prvi zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Log the start of the onCreate() method.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
Ostale metode životnog ciklusa:
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
Druga aktivnost
Sljedeći isječci koda prikazuju dodani kod u SecondActivity, ali ne cijelu klasu.
Na vrhu klase SecondActivity:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
Metoda returnReply():
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
Ostale metode životnog ciklusa:
Isto kao za MainActivity, gore.
4. 4. Zadatak 2: Spremite i vratite stanje instance Aktivnosti
Ovisno o resursima sustava i ponašanju korisnika, svaka aktivnost u vašoj aplikaciji može biti uništena i rekonstruirana mnogo češće nego što mislite.
Možda ste primijetili ovo ponašanje u prošlom odjeljku kada ste rotirali uređaj ili emulator. Rotiranje uređaja jedan je od primjera promjene konfiguracije uređaja. Iako je rotacija najčešća, sve promjene konfiguracije rezultiraju uništavanjem trenutne aktivnosti i ponovnom stvaranjem kao da je nova. Ako ne uzmete u obzir ovo ponašanje u svom kodu, kada dođe do promjene konfiguracije, vaš izgled aktivnosti može se vratiti na zadani izgled i početne vrijednosti, a vaši korisnici mogu izgubiti svoje mjesto, svoje podatke ili stanje svog napretka u svoju aplikaciju.
Stanje svake aktivnosti pohranjuje se kao skup parova ključ/vrijednost u Bundle objektu koji se naziva stanje instance aktivnosti. Sustav sprema informacije o zadanom stanju u Bundle stanja instance neposredno prije nego što se aktivnost zaustavi i prosljeđuje taj Bundle novoj instanci Activity za vraćanje.
Kako biste spriječili gubitak podataka u aktivnosti kada se neočekivano unište i ponovno kreiraju, trebate implementirati metodu onSaveInstanceState(). Sustav poziva ovu metodu na vašoj aktivnosti (između onPause() i onStop()) kada postoji mogućnost da se aktivnost uništi i ponovno stvori.
Podaci koje spremate u stanju instance specifični su samo za ovu instancu ove specifične aktivnosti tijekom trenutne sesije aplikacije. Kada zaustavite i ponovno pokrenete novu sesiju aplikacije, stanje instance aktivnosti se gubi i aktivnost se vraća na svoj zadani izgled. Ako trebate spremiti korisničke podatke između sesija aplikacije, upotrijebite zajedničke postavke ili bazu podataka. O oboje ćete naučiti u kasnijoj praktici.
2.1 Spremite stanje instance aktivnosti pomoću onSaveInstanceState()
Možda ste primijetili da rotiranje uređaja uopće ne utječe na stanje druge aktivnosti. To je zato što se drugi izgled i stanje aktivnosti generiraju iz izgleda i namjere koja ga je aktivirala. Čak i ako se aktivnost ponovno stvori, namjera je još uvijek tu i podaci u toj namjeri i dalje se koriste svaki put kada se pozove metoda onCreate() u drugoj aktivnosti.
Osim toga, možete primijetiti da se u svakoj aktivnosti svaki tekst koji ste upisali u elemente poruke ili odgovora EditText zadržava čak i kada se uređaj okrene. To je zato što se podaci o stanju nekih elemenata prikaza u vašem izgledu automatski spremaju tijekom promjena konfiguracije, a trenutna vrijednost EditText-a jedan je od tih slučajeva.
Dakle, jedino stanje aktivnosti koje vas zanima su TextView elementi za zaglavlje odgovora i tekst odgovora u glavnoj aktivnosti. Oba TextView elementa su nevidljiva prema zadanim postavkama; pojavljuju se samo kada pošaljete poruku natrag u glavnu aktivnost iz druge aktivnosti.
U ovom zadatku dodajete kod za očuvanje stanja instance ova dva TextView elementa pomoću onSaveInstanceState().
- Otvorite MainActivity.
- Dodajte ovu kosturnu implementaciju onSaveInstanceState() u aktivnost ili upotrijebite Kod > Metode nadjačavanja za umetanje kosturnog nadjačavanja.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- Provjerite je li zaglavlje trenutno vidljivo i ako jest, stavite to stanje vidljivosti u paket stanja s metodom putBoolean() i ključem "reply_visible".
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Imajte na umu da su zaglavlje i tekst odgovora označeni kao nevidljivi dok ne dobijete odgovor iz druge aktivnosti. Ako je zaglavlje vidljivo, tada postoje podaci o odgovoru koje je potrebno spremiti. Imajte na umu da nas zanima samo to stanje vidljivosti — stvarni tekst zaglavlja ne treba spremati jer se taj tekst nikada ne mijenja.
- Unutar te iste provjere dodajte tekst odgovora u Bundle.
outState.putString("reply_text",mReplyTextView.getText().toString());
Ako je zaglavlje vidljivo, možete pretpostaviti da je i sama poruka odgovora vidljiva. Ne morate testirati ili spremati trenutno stanje vidljivosti poruke odgovora. Samo stvarni tekst poruke ide u stanje Bundle s ključem "reply_text".
Spremate stanje samo onih elemenata prikaza koji bi se mogli promijeniti nakon što se aktivnost stvori. Ostali View elementi u vašoj aplikaciji (EditText, Button) mogu se ponovno kreirati iz zadanog izgleda u bilo kojem trenutku.
Imajte na umu da će sustav spremiti stanje nekih View elemenata, kao što je sadržaj EditText.
2.2 Vratite stanje instance aktivnosti u onCreate()
Nakon što ste spremili stanje instance aktivnosti, također ga morate vratiti kada se aktivnost ponovno stvori. To možete učiniti u onCreate() ili implementacijom onRestoreInstanceState() povratnog poziva, koji se poziva nakon onStart() nakon što je Activity kreirana.
Većinu vremena bolje mjesto za vraćanje stanja aktivnosti je u onCreate(), kako bi se osiguralo da je korisničko sučelje, uključujući stanje, dostupno što je prije moguće. Ponekad je zgodno to učiniti u onRestoreInstanceState() nakon što je sva inicijalizacija obavljena ili dopustiti podklasama da odluče hoće li koristiti vašu zadanu implementaciju.
- U metodi onCreate(), nakon što se varijable View inicijaliziraju pomoću findViewById(), dodajte test kako biste bili sigurni da savedInstanceState nije null.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the state.
if (savedInstanceState != null) {
}
Kada se vaša aktivnost kreira, sustav prosljeđuje paket stanja onCreate() kao jedini argument. Prvi put kada se onCreate() pozove i vaša aplikacija pokrene, Bundle je null—nema postojećeg stanja kada se vaša aplikacija prvi put pokrene. Naknadni pozivi onCreate() imaju skup popunjen podacima koje ste pohranili u onSaveInstanceState().
- Unutar te provjere, dohvatite trenutnu vidljivost (true ili false) iz paketa pomoću ključa "reply_visible".
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- Dodajte test ispod prethodnog retka za varijablu isVisible.
if (isVisible) {
}
Ako u paketu stanja postoji ključ reply_visible (i isVisible je stoga istinit), morat ćete vratiti stanje.
- Unutar isVisible testa, učinite zaglavlje vidljivim.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- Dobijte tekstualni odgovor iz paketa s ključem "reply_text" i postavite odgovor TextView da prikazuje taj niz.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- Učini odgovor TextView također vidljivim:
mReplyTextView.setVisibility(View.VISIBLE);
- Pokrenite aplikaciju. Pokušajte rotirati uređaj ili emulator kako biste bili sigurni da poruka odgovora (ako postoji) ostaje na zaslonu nakon što se aktivnost ponovno stvori.
Šifra rješenja 2. zadatka
Sljedeći isječci koda prikazuju kôd rješenja za ovaj zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onSaveInstanceState():
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// If the heading is visible, message needs to be saved.
// Otherwise we're still using default layout.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text",
mReplyTextView.getText().toString());
}
}
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the saved state.
// See onSaveInstanceState() for what gets saved.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
// Show both the header and the message views. If isVisible is
// false or missing from the bundle, use the default layout.
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState
.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
Kompletan projekt:
Projekt Android Studio: TwoActivitiesLifecycle
5. Kodiranje
Izazov: Napravite jednostavnu aplikaciju popisa za kupnju s glavnom aktivnošću za popis koji korisnik izrađuje i drugom aktivnošću za popis uobičajenih artikala za kupnju.
- Glavna aktivnost trebala bi sadržavati popis za izradu, koji bi trebao biti sastavljen od deset praznih TextView elemenata.
- Gumb Dodaj artikl u glavnoj aktivnosti pokreće drugu aktivnost koja sadrži popis uobičajenih artikala za kupnju (sir, riža, jabuke i tako dalje). Koristite elemente gumba za prikaz stavki.
- Odabir stavke vraća korisnika na glavnu aktivnost i ažurira prazan TextView da uključi odabranu stavku.
Koristite namjeru za prijenos informacija iz jedne aktivnosti u drugu. Provjerite je li trenutno stanje popisa za kupovinu spremljeno kada korisnik okrene uređaj.
6. Sažetak
- Životni ciklus Aktivnosti je skup stanja kroz koja Aktivnost migrira, počevši kada je prvi put kreirana i završava kada Android sustav povrati resurse za tu Aktivnost.
- Kako korisnik prelazi s jedne Aktivnosti na drugu, unutar i izvan vaše aplikacije, svaka se Aktivnost kreće između stanja u životnom ciklusu Aktivnosti.
- Svako stanje u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva koju možete nadjačati u svojoj klasi aktivnosti.
- Metode životnog ciklusa su onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
- Nadjačavanje metode povratnog poziva životnog ciklusa omogućuje vam dodavanje ponašanja koje se događa kada vaša aktivnost prijeđe u to stanje.
- Svojim klasama u Android Studiju možete dodati metode nadjačavanja kostura pomoću Koda > Nadjačavanje.
- Promjene konfiguracije uređaja, kao što je rotacija, rezultiraju uništavanjem i ponovnim stvaranjem aktivnosti kao da je nova.
- Dio stanja aktivnosti sačuvan je nakon promjene konfiguracije, uključujući trenutne vrijednosti elemenata EditText. Za sve ostale podatke, te podatke morate izričito sami spremiti.
- Spremi stanje instance aktivnosti u onSaveInstanceState() metodi.
- Podaci o stanju instance pohranjuju se kao jednostavni parovi ključ/vrijednost u paketu. Koristite Bundle metode za stavljanje podataka u i povrat podataka iz Bundlea.
- Vratite stanje instance u onCreate(), što je preferirani način, ili onRestoreInstanceState(). Nazad
1. Dobrodošli
Ova praktična laboratorija za kodiranje dio je 1. jedinice: Početak tečaja Osnove programera za Android (verzija 2). Izvući ćete najveću vrijednost iz ovog tečaja ako radite kroz laboratorije kodiranja u nizu:
- Za potpuni popis laboratorija za kodiranje u tečaju pogledajte laboratorije za kodiranje za Android Developer Fundamentals (V2).
- Za pojedinosti o tečaju, uključujući poveznice na sva konceptualna poglavlja, aplikacije i slajdove, pogledajte Android Developer Fundamentals (verzija 2).
Uvod
U ovoj vježbi saznat ćete više o životnom ciklusu aktivnosti. Životni ciklus je skup stanja u kojima aktivnost može biti tijekom cijelog životnog vijeka, od trenutka kada je stvorena do trenutka kada je uništena i sustav povrati svoje resurse. Dok se korisnik kreće između aktivnosti u vašoj aplikaciji (kao i ui iz vaše aplikacije), aktivnosti se mijenjaju između različitih stanja u svojim životnim ciklusima.
Svaka faza u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva: onCreate(), onStart(), onPause() i tako dalje. Kada aktivnost promijeni stanje, poziva se pridružena metoda povratnog poziva. Već ste vidjeli jednu od ovih metoda: onCreate(). Nadjačavanjem bilo koje metode povratnog poziva životnog ciklusa u svojim klasama aktivnosti, možete promijeniti zadano ponašanje aktivnosti kao odgovor na akcije korisnika ili sustava.
Stanje aktivnosti također se može promijeniti kao odgovor na promjene konfiguracije uređaja, na primjer kada korisnik rotira uređaj iz okomitog u pejzažni položaj. Kada se dogode te promjene konfiguracije, aktivnost se uništava i ponovno stvara u zadanom stanju, a korisnik može izgubiti podatke koje je unio u aktivnost. Kako biste izbjegli zbunjivanje svojih korisnika, važno je da razvijete svoju aplikaciju kako biste spriječili neočekivani gubitak podataka. Kasnije u ovoj praktici eksperimentirate s promjenama konfiguracije i naučite kako sačuvati stanje aktivnosti kao odgovor na promjene konfiguracije uređaja i druge događaje životnog ciklusa aktivnosti.
U ovoj praksi dodajete izjave o bilježenju u aplikaciju TwoActivities i promatrate promjene životnog ciklusa aktivnosti dok koristite aplikaciju. Zatim počinjete raditi s tim promjenama i istražujete kako postupati s korisničkim unosom pod tim uvjetima.
Preduvjeti
Trebali biste moći:
- Stvorite i pokrenite projekt aplikacije u Android Studiju .
- Dodajte zapisnike u svoju aplikaciju i pregledajte te zapisnike u oknu Logcat.
- Razumjeti i raditi s aktivnostima i namjerama i osjećati se ugodno u interakciji s njima.
Što ćete naučiti
- Kako funkcionira životni ciklus aktivnosti.
- Kada se aktivnost pokrene, pauzira, zaustavlja se i uništava.
- O metodama povratnog poziva životnog ciklusa povezanim s promjenama aktivnosti.
- Učinak radnji (kao što su promjene konfiguracije) koje mogu rezultirati događajima životnog ciklusa aktivnosti.
- Kako zadržati stanje aktivnosti kroz događaje životnog ciklusa.
Što ćeš učiniti
- Dodajte kôd u aplikaciju TwoActivities iz prethodne praktične primjene kako biste implementirali različite povratne pozive životnog ciklusa aktivnosti kako biste uključili izjave zapisivanja.
- Promatrajte promjene stanja dok vaša aplikacija radi i dok komunicirate sa svakom aktivnošću u svojoj aplikaciji.
- Izmijenite svoju aplikaciju tako da zadrži stanje instance aktivnosti koja se neočekivano ponovno stvara kao odgovor na ponašanje korisnika ili promjenu konfiguracije na uređaju.
2. Pregled aplikacije
U ovoj praksi dodajete u aplikaciju TwoActivities . Aplikacija izgleda i ponaša se otprilike isto kao u prošloj laboratoriji za kodiranje. Sadrži dvije implementacije aktivnosti i daje korisniku mogućnost slanja između njih. Promjene koje napravite u aplikaciji u ovoj praksi neće utjecati na njezino vidljivo korisničko ponašanje.
3. 3. Zadatak 1: Dodajte povratne pozive životnog ciklusa u TwoActivities
U ovom zadatku implementirat ćete sve metode povratnog poziva životnog ciklusa aktivnosti za ispis poruka u logcat kada se te metode pozovu. Ove poruke zapisnika omogućit će vam da vidite kada životni ciklus aktivnosti mijenja stanje i kako te promjene stanja životnog ciklusa utječu na vašu aplikaciju dok radi.
1.1 (Izborno) Kopirajte projekt TwoActivities
Za zadatke u ovoj vježbi modificirat ćete postojeći projekt TwoActivities koji ste izradili u prošloj vježbi. Ako želite zadržati prethodni projekt TwoActivities netaknutim, slijedite korake u Dodatku: Pomoćni programi da biste napravili kopiju projekta.
1.2 Implementirajte povratne pozive u MainActivity
- Otvorite projekt TwoActivities u Android Studiju i otvorite MainActivity u oknu Projekt > Android.
- U metodi onCreate() dodajte sljedeće izjave dnevnika:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- Dodajte nadjačavanje za onStart() povratni poziv, s izjavom u dnevnik za taj događaj:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
Za prečac odaberite Kod > Nadjačaj metode u Android Studiju. Pojavljuje se dijaloški okvir sa svim mogućim metodama koje možete nadjačati u svojoj klasi. Odabir jedne ili više metoda povratnog poziva s popisa umeće potpuni predložak za te metode, uključujući traženi poziv superklasi.
- Koristite metodu onStart() kao predložak za implementaciju povratnih poziva životnog ciklusa onPause(), onRestart(), onResume(), onStop() i onDestroy().
Sve metode povratnog poziva imaju iste potpise (osim imena). Ako kopirate i zalijepite onStart() za stvaranje ovih drugih metoda povratnog poziva, ne zaboravite ažurirati sadržaj da biste pozvali pravu metodu u superklasi i zabilježili ispravnu metodu.
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat. Trebali biste vidjeti tri poruke dnevnika koje prikazuju tri stanja životnog ciklusa kroz koje je aktivnost prošla kada je započela:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 Implementirajte povratne pozive životnog ciklusa u SecondActivity
Sada kada ste implementirali metode povratnog poziva životnog ciklusa za MainActivity, učinite isto za SecondActivity.
- Otvorite SecondActivity.
- Na vrhu klase dodajte konstantu za varijablu LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- Dodajte povratne pozive životnog ciklusa i izjave zapisnika u drugu aktivnost. (Možete kopirati i zalijepiti metode povratnog poziva iz MainActivity.)
- Dodajte iskaz dnevnika metodi returnReply() neposredno prije metode finish():
Log.d(LOG_TAG, "End SecondActivity");
1.4 Promatrajte zapisnik dok aplikacija radi**
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat.
- Unesite Aktivnost u okvir za pretraživanje. Android logcat može biti vrlo dug i pretrpan. Budući da varijabla LOG_TAG u svakoj klasi sadrži ili riječi MainActivity ili SecondActivity, ova vam ključna riječ omogućuje filtriranje dnevnika samo za stvari koje vas zanimaju.
Eksperimentirajte sa svojom aplikacijom i imajte na umu da se događaji životnog ciklusa javljaju kao odgovor na različite radnje. Posebno pokušajte sljedeće:
- Koristite aplikaciju normalno (pošaljite poruku, odgovorite drugom porukom).
- Koristite gumb Natrag za povratak s druge aktivnosti na glavnu aktivnost.
- Koristite strelicu prema gore na traci aplikacije za povratak s druge aktivnosti na glavnu aktivnost.
- Rotirajte uređaj na glavnoj i drugoj aktivnosti u različito vrijeme u svojoj aplikaciji i promatrajte što se događa u * zapisniku i na zaslonu.
- Pritisnite gumb za pregled (kvadratni gumb s desne strane Početne stranice) i zatvorite aplikaciju (dodirnite X).
- Vratite se na početni zaslon i ponovno pokrenite aplikaciju.
SAVJET: Ako svoju aplikaciju pokrećete u emulatoru, možete simulirati rotaciju pomoću Control+F11 ili Control+Function+F11.
Šifra rješenja 1. zadatka
Sljedeći isječci koda prikazuju kod rješenja za prvi zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Log the start of the onCreate() method.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
Ostale metode životnog ciklusa:
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
Druga aktivnost
Sljedeći isječci koda prikazuju dodani kod u SecondActivity, ali ne cijelu klasu.
Na vrhu klase SecondActivity:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
Metoda returnReply():
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
Ostale metode životnog ciklusa:
Isto kao za MainActivity, gore.
4. 4. Zadatak 2: Spremite i vratite stanje instance Aktivnosti
Ovisno o resursima sustava i ponašanju korisnika, svaka aktivnost u vašoj aplikaciji može biti uništena i rekonstruirana mnogo češće nego što mislite.
Možda ste primijetili ovo ponašanje u prošlom odjeljku kada ste rotirali uređaj ili emulator. Rotiranje uređaja jedan je od primjera promjene konfiguracije uređaja. Iako je rotacija najčešća, sve promjene konfiguracije rezultiraju uništavanjem trenutne aktivnosti i ponovnom stvaranjem kao da je nova. Ako ne uzmete u obzir ovo ponašanje u svom kodu, kada dođe do promjene konfiguracije, vaš izgled aktivnosti može se vratiti na zadani izgled i početne vrijednosti, a vaši korisnici mogu izgubiti svoje mjesto, svoje podatke ili stanje svog napretka u svoju aplikaciju.
Stanje svake aktivnosti pohranjuje se kao skup parova ključ/vrijednost u Bundle objektu koji se naziva stanje instance aktivnosti. Sustav sprema informacije o zadanom stanju u Bundle stanja instance neposredno prije nego što se aktivnost zaustavi i prosljeđuje taj Bundle novoj instanci Activity za vraćanje.
Kako biste spriječili gubitak podataka u aktivnosti kada se neočekivano unište i ponovno kreiraju, trebate implementirati metodu onSaveInstanceState(). Sustav poziva ovu metodu na vašoj aktivnosti (između onPause() i onStop()) kada postoji mogućnost da se aktivnost uništi i ponovno stvori.
Podaci koje spremate u stanju instance specifični su samo za ovu instancu ove specifične aktivnosti tijekom trenutne sesije aplikacije. Kada zaustavite i ponovno pokrenete novu sesiju aplikacije, stanje instance aktivnosti se gubi i aktivnost se vraća na svoj zadani izgled. Ako trebate spremiti korisničke podatke između sesija aplikacije, upotrijebite zajedničke postavke ili bazu podataka. O oboje ćete naučiti u kasnijoj praktici.
2.1 Spremite stanje instance aktivnosti pomoću onSaveInstanceState()
Možda ste primijetili da rotiranje uređaja uopće ne utječe na stanje druge aktivnosti. To je zato što se drugi izgled i stanje aktivnosti generiraju iz izgleda i namjere koja ga je aktivirala. Čak i ako se aktivnost ponovno stvori, namjera je još uvijek tu i podaci u toj namjeri i dalje se koriste svaki put kada se pozove metoda onCreate() u drugoj aktivnosti.
Osim toga, možete primijetiti da se u svakoj aktivnosti svaki tekst koji ste upisali u elemente poruke ili odgovora EditText zadržava čak i kada se uređaj okrene. To je zato što se podaci o stanju nekih elemenata prikaza u vašem izgledu automatski spremaju tijekom promjena konfiguracije, a trenutna vrijednost EditText-a jedan je od tih slučajeva.
Dakle, jedino stanje aktivnosti koje vas zanima su TextView elementi za zaglavlje odgovora i tekst odgovora u glavnoj aktivnosti. Oba TextView elementa su nevidljiva prema zadanim postavkama; pojavljuju se samo kada pošaljete poruku natrag u glavnu aktivnost iz druge aktivnosti.
U ovom zadatku dodajete kod za očuvanje stanja instance ova dva TextView elementa pomoću onSaveInstanceState().
- Otvorite MainActivity.
- Dodajte ovu kosturnu implementaciju onSaveInstanceState() u aktivnost ili upotrijebite Kod > Metode nadjačavanja za umetanje kosturnog nadjačavanja.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- Provjerite je li zaglavlje trenutno vidljivo i ako jest, stavite to stanje vidljivosti u paket stanja s metodom putBoolean() i ključem "reply_visible".
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Imajte na umu da su zaglavlje i tekst odgovora označeni kao nevidljivi dok ne dobijete odgovor iz druge aktivnosti. Ako je zaglavlje vidljivo, tada postoje podaci o odgovoru koje je potrebno spremiti. Imajte na umu da nas zanima samo to stanje vidljivosti — stvarni tekst zaglavlja ne treba spremati jer se taj tekst nikada ne mijenja.
- Unutar te iste provjere dodajte tekst odgovora u Bundle.
outState.putString("reply_text",mReplyTextView.getText().toString());
Ako je zaglavlje vidljivo, možete pretpostaviti da je i sama poruka odgovora vidljiva. Ne morate testirati ili spremati trenutno stanje vidljivosti poruke odgovora. Samo stvarni tekst poruke ide u stanje Bundle s ključem "reply_text".
Spremate stanje samo onih elemenata prikaza koji bi se mogli promijeniti nakon što se aktivnost stvori. Ostali View elementi u vašoj aplikaciji (EditText, Button) mogu se ponovno kreirati iz zadanog izgleda u bilo kojem trenutku.
Imajte na umu da će sustav spremiti stanje nekih View elemenata, kao što je sadržaj EditText.
2.2 Vratite stanje instance aktivnosti u onCreate()
Nakon što ste spremili stanje instance aktivnosti, također ga morate vratiti kada se aktivnost ponovno stvori. To možete učiniti u onCreate() ili implementacijom onRestoreInstanceState() povratnog poziva, koji se poziva nakon onStart() nakon što je Activity kreirana.
Većinu vremena bolje mjesto za vraćanje stanja aktivnosti je u onCreate(), kako bi se osiguralo da je korisničko sučelje, uključujući stanje, dostupno što je prije moguće. Ponekad je zgodno to učiniti u onRestoreInstanceState() nakon što je sva inicijalizacija obavljena ili dopustiti podklasama da odluče hoće li koristiti vašu zadanu implementaciju.
- U metodi onCreate(), nakon što se varijable View inicijaliziraju pomoću findViewById(), dodajte test kako biste bili sigurni da savedInstanceState nije null.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the state.
if (savedInstanceState != null) {
}
Kada se vaša aktivnost kreira, sustav prosljeđuje paket stanja onCreate() kao jedini argument. Prvi put kada se onCreate() pozove i vaša aplikacija pokrene, Bundle je null—nema postojećeg stanja kada se vaša aplikacija prvi put pokrene. Naknadni pozivi onCreate() imaju skup popunjen podacima koje ste pohranili u onSaveInstanceState().
- Unutar te provjere, dohvatite trenutnu vidljivost (true ili false) iz paketa pomoću ključa "reply_visible".
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- Dodajte test ispod prethodnog retka za varijablu isVisible.
if (isVisible) {
}
Ako u paketu stanja postoji ključ reply_visible (i isVisible je stoga istinit), morat ćete vratiti stanje.
- Unutar isVisible testa, učinite zaglavlje vidljivim.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- Dobijte tekstualni odgovor iz paketa s ključem "reply_text" i postavite odgovor TextView da prikazuje taj niz.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- Učini odgovor TextView također vidljivim:
mReplyTextView.setVisibility(View.VISIBLE);
- Pokrenite aplikaciju. Pokušajte rotirati uređaj ili emulator kako biste bili sigurni da poruka odgovora (ako postoji) ostaje na zaslonu nakon što se aktivnost ponovno stvori.
Šifra rješenja 2. zadatka
Sljedeći isječci koda prikazuju kôd rješenja za ovaj zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onSaveInstanceState():
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// If the heading is visible, message needs to be saved.
// Otherwise we're still using default layout.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text",
mReplyTextView.getText().toString());
}
}
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the saved state.
// See onSaveInstanceState() for what gets saved.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
// Show both the header and the message views. If isVisible is
// false or missing from the bundle, use the default layout.
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState
.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
Kompletan projekt:
Projekt Android Studio: TwoActivitiesLifecycle
5. Kodiranje
Izazov: Napravite jednostavnu aplikaciju popisa za kupnju s glavnom aktivnošću za popis koji korisnik izrađuje i drugom aktivnošću za popis uobičajenih artikala za kupnju.
- Glavna aktivnost trebala bi sadržavati popis za izradu, koji bi trebao biti sastavljen od deset praznih TextView elemenata.
- Gumb Dodaj artikl u glavnoj aktivnosti pokreće drugu aktivnost koja sadrži popis uobičajenih artikala za kupnju (sir, riža, jabuke i tako dalje). Koristite elemente gumba za prikaz stavki.
- Odabir stavke vraća korisnika na glavnu aktivnost i ažurira prazan TextView da uključi odabranu stavku.
Koristite namjeru za prijenos informacija iz jedne aktivnosti u drugu. Provjerite je li trenutno stanje popisa za kupovinu spremljeno kada korisnik okrene uređaj.
6. Sažetak
- Životni ciklus Aktivnosti je skup stanja kroz koja Aktivnost migrira, počevši kada je prvi put kreirana i završava kada Android sustav povrati resurse za tu Aktivnost.
- Kako korisnik prelazi s jedne Aktivnosti na drugu, unutar i izvan vaše aplikacije, svaka se Aktivnost kreće između stanja u životnom ciklusu Aktivnosti.
- Svako stanje u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva koju možete nadjačati u svojoj klasi aktivnosti.
- Metode životnog ciklusa su onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
- Nadjačavanje metode povratnog poziva životnog ciklusa omogućuje vam dodavanje ponašanja koje se događa kada vaša aktivnost prijeđe u to stanje.
- Svojim klasama u Android Studiju možete dodati metode nadjačavanja kostura pomoću Koda > Nadjačavanje.
- Promjene konfiguracije uređaja, kao što je rotacija, rezultiraju uništavanjem i ponovnim stvaranjem aktivnosti kao da je nova.
- Dio stanja aktivnosti sačuvan je nakon promjene konfiguracije, uključujući trenutne vrijednosti elemenata EditText. Za sve ostale podatke, te podatke morate izričito sami spremiti.
- Spremi stanje instance aktivnosti u onSaveInstanceState() metodi.
- Podaci o stanju instance pohranjuju se kao jednostavni parovi ključ/vrijednost u paketu. Koristite Bundle metode za stavljanje podataka u i povrat podataka iz Bundlea.
- Vratite stanje instance u onCreate(), što je preferirani način, ili onRestoreInstanceState(). Nazad
1. Dobrodošli
Ova praktična laboratorija za kodiranje dio je 1. jedinice: Početak tečaja Osnove programera za Android (verzija 2). Izvući ćete najveću vrijednost iz ovog tečaja ako radite kroz laboratorije kodiranja u nizu:
- Za potpuni popis laboratorija za kodiranje u tečaju pogledajte laboratorije za kodiranje za Android Developer Fundamentals (V2).
- Za pojedinosti o tečaju, uključujući poveznice na sva konceptualna poglavlja, aplikacije i slajdove, pogledajte Android Developer Fundamentals (verzija 2).
Uvod
U ovoj vježbi saznat ćete više o životnom ciklusu aktivnosti. Životni ciklus je skup stanja u kojima aktivnost može biti tijekom cijelog životnog vijeka, od trenutka kada je stvorena do trenutka kada je uništena i sustav povrati svoje resurse. Dok se korisnik kreće između aktivnosti u vašoj aplikaciji (kao i ui iz vaše aplikacije), aktivnosti se mijenjaju između različitih stanja u svojim životnim ciklusima.
Svaka faza u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva: onCreate(), onStart(), onPause() i tako dalje. Kada aktivnost promijeni stanje, poziva se pridružena metoda povratnog poziva. Već ste vidjeli jednu od ovih metoda: onCreate(). Nadjačavanjem bilo koje metode povratnog poziva životnog ciklusa u svojim klasama aktivnosti, možete promijeniti zadano ponašanje aktivnosti kao odgovor na akcije korisnika ili sustava.
Stanje aktivnosti također se može promijeniti kao odgovor na promjene konfiguracije uređaja, na primjer kada korisnik rotira uređaj iz okomitog u pejzažni položaj. Kada se dogode te promjene konfiguracije, aktivnost se uništava i ponovno stvara u zadanom stanju, a korisnik može izgubiti podatke koje je unio u aktivnost. Kako biste izbjegli zbunjivanje svojih korisnika, važno je da razvijete svoju aplikaciju kako biste spriječili neočekivani gubitak podataka. Kasnije u ovoj praktici eksperimentirate s promjenama konfiguracije i naučite kako sačuvati stanje aktivnosti kao odgovor na promjene konfiguracije uređaja i druge događaje životnog ciklusa aktivnosti.
U ovoj praksi dodajete izjave o bilježenju u aplikaciju TwoActivities i promatrate promjene životnog ciklusa aktivnosti dok koristite aplikaciju. Zatim počinjete raditi s tim promjenama i istražujete kako postupati s korisničkim unosom pod tim uvjetima.
Preduvjeti
Trebali biste moći:
- Stvorite i pokrenite projekt aplikacije u Android Studiju .
- Dodajte zapisnike u svoju aplikaciju i pregledajte te zapisnike u oknu Logcat.
- Razumjeti i raditi s aktivnostima i namjerama i osjećati se ugodno u interakciji s njima.
Što ćete naučiti
- Kako funkcionira životni ciklus aktivnosti.
- Kada se aktivnost pokrene, pauzira, zaustavlja se i uništava.
- O metodama povratnog poziva životnog ciklusa povezanim s promjenama aktivnosti.
- Učinak radnji (kao što su promjene konfiguracije) koje mogu rezultirati događajima životnog ciklusa aktivnosti.
- Kako zadržati stanje aktivnosti kroz događaje životnog ciklusa.
Što ćeš učiniti
- Dodajte kôd u aplikaciju TwoActivities iz prethodne praktične primjene kako biste implementirali različite povratne pozive životnog ciklusa aktivnosti kako biste uključili izjave zapisivanja.
- Promatrajte promjene stanja dok vaša aplikacija radi i dok komunicirate sa svakom aktivnošću u svojoj aplikaciji.
- Izmijenite svoju aplikaciju tako da zadrži stanje instance aktivnosti koja se neočekivano ponovno stvara kao odgovor na ponašanje korisnika ili promjenu konfiguracije na uređaju.
2. Pregled aplikacije
U ovoj praksi dodajete u aplikaciju TwoActivities . Aplikacija izgleda i ponaša se otprilike isto kao u prošloj laboratoriji za kodiranje. Sadrži dvije implementacije aktivnosti i daje korisniku mogućnost slanja između njih. Promjene koje napravite u aplikaciji u ovoj praksi neće utjecati na njezino vidljivo korisničko ponašanje.
3. 3. Zadatak 1: Dodajte povratne pozive životnog ciklusa u TwoActivities
U ovom zadatku implementirat ćete sve metode povratnog poziva životnog ciklusa aktivnosti za ispis poruka u logcat kada se te metode pozovu. Ove poruke zapisnika omogućit će vam da vidite kada životni ciklus aktivnosti mijenja stanje i kako te promjene stanja životnog ciklusa utječu na vašu aplikaciju dok radi.
1.1 (Izborno) Kopirajte projekt TwoActivities
Za zadatke u ovoj vježbi modificirat ćete postojeći projekt TwoActivities koji ste izradili u prošloj vježbi. Ako želite zadržati prethodni projekt TwoActivities netaknutim, slijedite korake u Dodatku: Pomoćni programi da biste napravili kopiju projekta.
1.2 Implementirajte povratne pozive u MainActivity
- Otvorite projekt TwoActivities u Android Studiju i otvorite MainActivity u oknu Projekt > Android.
- U metodi onCreate() dodajte sljedeće izjave dnevnika:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- Dodajte nadjačavanje za onStart() povratni poziv, s izjavom u dnevnik za taj događaj:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
Za prečac odaberite Kod > Nadjačaj metode u Android Studiju. Pojavljuje se dijaloški okvir sa svim mogućim metodama koje možete nadjačati u svojoj klasi. Odabir jedne ili više metoda povratnog poziva s popisa umeće potpuni predložak za te metode, uključujući traženi poziv superklasi.
- Koristite metodu onStart() kao predložak za implementaciju povratnih poziva životnog ciklusa onPause(), onRestart(), onResume(), onStop() i onDestroy().
Sve metode povratnog poziva imaju iste potpise (osim imena). Ako kopirate i zalijepite onStart() za stvaranje ovih drugih metoda povratnog poziva, ne zaboravite ažurirati sadržaj da biste pozvali pravu metodu u superklasi i zabilježili ispravnu metodu.
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat. Trebali biste vidjeti tri poruke dnevnika koje prikazuju tri stanja životnog ciklusa kroz koje je aktivnost prošla kada je započela:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 Implementirajte povratne pozive životnog ciklusa u SecondActivity
Sada kada ste implementirali metode povratnog poziva životnog ciklusa za MainActivity, učinite isto za SecondActivity.
- Otvorite SecondActivity.
- Na vrhu klase dodajte konstantu za varijablu LOG_TAG:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- Dodajte povratne pozive životnog ciklusa i izjave zapisnika u drugu aktivnost. (Možete kopirati i zalijepiti metode povratnog poziva iz MainActivity.)
- Dodajte iskaz dnevnika metodi returnReply() neposredno prije metode finish():
Log.d(LOG_TAG, "End SecondActivity");
1.4 Promatrajte zapisnik dok aplikacija radi**
- Pokrenite svoju aplikaciju.
- Pritisnite karticu Logcat na dnu Android Studija da biste prikazali okno Logcat.
- Unesite Aktivnost u okvir za pretraživanje. Android logcat može biti vrlo dug i pretrpan. Budući da varijabla LOG_TAG u svakoj klasi sadrži ili riječi MainActivity ili SecondActivity, ova vam ključna riječ omogućuje filtriranje dnevnika samo za stvari koje vas zanimaju.
Eksperimentirajte sa svojom aplikacijom i imajte na umu da se događaji životnog ciklusa javljaju kao odgovor na različite radnje. Posebno pokušajte sljedeće:
- Koristite aplikaciju normalno (pošaljite poruku, odgovorite drugom porukom).
- Koristite gumb Natrag za povratak s druge aktivnosti na glavnu aktivnost.
- Koristite strelicu prema gore na traci aplikacije za povratak s druge aktivnosti na glavnu aktivnost.
- Rotirajte uređaj na glavnoj i drugoj aktivnosti u različito vrijeme u svojoj aplikaciji i promatrajte što se događa u * zapisniku i na zaslonu.
- Pritisnite gumb za pregled (kvadratni gumb s desne strane Početne stranice) i zatvorite aplikaciju (dodirnite X).
- Vratite se na početni zaslon i ponovno pokrenite aplikaciju.
SAVJET: Ako svoju aplikaciju pokrećete u emulatoru, možete simulirati rotaciju pomoću Control+F11 ili Control+Function+F11.
Šifra rješenja 1. zadatka
Sljedeći isječci koda prikazuju kod rješenja za prvi zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Log the start of the onCreate() method.
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
}
Ostale metode životnog ciklusa:
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "onStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "onPause");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "onRestart");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "onResume");
}
@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "onStop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "onDestroy");
}
Druga aktivnost
Sljedeći isječci koda prikazuju dodani kod u SecondActivity, ali ne cijelu klasu.
Na vrhu klase SecondActivity:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
Metoda returnReply():
public void returnReply(View view) {
String reply = mReply.getText().toString();
Intent replyIntent = new Intent();
replyIntent.putExtra(EXTRA_REPLY, reply);
setResult(RESULT_OK, replyIntent);
Log.d(LOG_TAG, "End SecondActivity");
finish();
}
Ostale metode životnog ciklusa:
Isto kao za MainActivity, gore.
4. 4. Zadatak 2: Spremite i vratite stanje instance Aktivnosti
Ovisno o resursima sustava i ponašanju korisnika, svaka aktivnost u vašoj aplikaciji može biti uništena i rekonstruirana mnogo češće nego što mislite.
Možda ste primijetili ovo ponašanje u prošlom odjeljku kada ste rotirali uređaj ili emulator. Rotiranje uređaja jedan je od primjera promjene konfiguracije uređaja. Iako je rotacija najčešća, sve promjene konfiguracije rezultiraju uništavanjem trenutne aktivnosti i ponovnom stvaranjem kao da je nova. Ako ne uzmete u obzir ovo ponašanje u svom kodu, kada dođe do promjene konfiguracije, vaš izgled aktivnosti može se vratiti na zadani izgled i početne vrijednosti, a vaši korisnici mogu izgubiti svoje mjesto, svoje podatke ili stanje svog napretka u svoju aplikaciju.
Stanje svake aktivnosti pohranjuje se kao skup parova ključ/vrijednost u Bundle objektu koji se naziva stanje instance aktivnosti. Sustav sprema informacije o zadanom stanju u Bundle stanja instance neposredno prije nego što se aktivnost zaustavi i prosljeđuje taj Bundle novoj instanci Activity za vraćanje.
Kako biste spriječili gubitak podataka u aktivnosti kada se neočekivano unište i ponovno kreiraju, trebate implementirati metodu onSaveInstanceState(). Sustav poziva ovu metodu na vašoj aktivnosti (između onPause() i onStop()) kada postoji mogućnost da se aktivnost uništi i ponovno stvori.
Podaci koje spremate u stanju instance specifični su samo za ovu instancu ove specifične aktivnosti tijekom trenutne sesije aplikacije. Kada zaustavite i ponovno pokrenete novu sesiju aplikacije, stanje instance aktivnosti se gubi i aktivnost se vraća na svoj zadani izgled. Ako trebate spremiti korisničke podatke između sesija aplikacije, upotrijebite zajedničke postavke ili bazu podataka. O oboje ćete naučiti u kasnijoj praktici.
2.1 Spremite stanje instance aktivnosti pomoću onSaveInstanceState()
Možda ste primijetili da rotiranje uređaja uopće ne utječe na stanje druge aktivnosti. To je zato što se drugi izgled i stanje aktivnosti generiraju iz izgleda i namjere koja ga je aktivirala. Čak i ako se aktivnost ponovno stvori, namjera je još uvijek tu i podaci u toj namjeri i dalje se koriste svaki put kada se pozove metoda onCreate() u drugoj aktivnosti.
Osim toga, možete primijetiti da se u svakoj aktivnosti svaki tekst koji ste upisali u elemente poruke ili odgovora EditText zadržava čak i kada se uređaj okrene. To je zato što se podaci o stanju nekih elemenata prikaza u vašem izgledu automatski spremaju tijekom promjena konfiguracije, a trenutna vrijednost EditText-a jedan je od tih slučajeva.
Dakle, jedino stanje aktivnosti koje vas zanima su TextView elementi za zaglavlje odgovora i tekst odgovora u glavnoj aktivnosti. Oba TextView elementa su nevidljiva prema zadanim postavkama; pojavljuju se samo kada pošaljete poruku natrag u glavnu aktivnost iz druge aktivnosti.
U ovom zadatku dodajete kod za očuvanje stanja instance ova dva TextView elementa pomoću onSaveInstanceState().
- Otvorite MainActivity.
- Dodajte ovu kosturnu implementaciju onSaveInstanceState() u aktivnost ili upotrijebite Kod > Metode nadjačavanja za umetanje kosturnog nadjačavanja.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- Provjerite je li zaglavlje trenutno vidljivo i ako jest, stavite to stanje vidljivosti u paket stanja s metodom putBoolean() i ključem "reply_visible".
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Imajte na umu da su zaglavlje i tekst odgovora označeni kao nevidljivi dok ne dobijete odgovor iz druge aktivnosti. Ako je zaglavlje vidljivo, tada postoje podaci o odgovoru koje je potrebno spremiti. Imajte na umu da nas zanima samo to stanje vidljivosti — stvarni tekst zaglavlja ne treba spremati jer se taj tekst nikada ne mijenja.
- Unutar te iste provjere dodajte tekst odgovora u Bundle.
outState.putString("reply_text",mReplyTextView.getText().toString());
Ako je zaglavlje vidljivo, možete pretpostaviti da je i sama poruka odgovora vidljiva. Ne morate testirati ili spremati trenutno stanje vidljivosti poruke odgovora. Samo stvarni tekst poruke ide u stanje Bundle s ključem "reply_text".
Spremate stanje samo onih elemenata prikaza koji bi se mogli promijeniti nakon što se aktivnost stvori. Ostali View elementi u vašoj aplikaciji (EditText, Button) mogu se ponovno kreirati iz zadanog izgleda u bilo kojem trenutku.
Imajte na umu da će sustav spremiti stanje nekih View elemenata, kao što je sadržaj EditText.
2.2 Vratite stanje instance aktivnosti u onCreate()
Nakon što ste spremili stanje instance aktivnosti, također ga morate vratiti kada se aktivnost ponovno stvori. To možete učiniti u onCreate() ili implementacijom onRestoreInstanceState() povratnog poziva, koji se poziva nakon onStart() nakon što je Activity kreirana.
Većinu vremena bolje mjesto za vraćanje stanja aktivnosti je u onCreate(), kako bi se osiguralo da je korisničko sučelje, uključujući stanje, dostupno što je prije moguće. Ponekad je zgodno to učiniti u onRestoreInstanceState() nakon što je sva inicijalizacija obavljena ili dopustiti podklasama da odluče hoće li koristiti vašu zadanu implementaciju.
- U metodi onCreate(), nakon što se varijable View inicijaliziraju pomoću findViewById(), dodajte test kako biste bili sigurni da savedInstanceState nije null.
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the state.
if (savedInstanceState != null) {
}
Kada se vaša aktivnost kreira, sustav prosljeđuje paket stanja onCreate() kao jedini argument. Prvi put kada se onCreate() pozove i vaša aplikacija pokrene, Bundle je null—nema postojećeg stanja kada se vaša aplikacija prvi put pokrene. Naknadni pozivi onCreate() imaju skup popunjen podacima koje ste pohranili u onSaveInstanceState().
- Unutar te provjere, dohvatite trenutnu vidljivost (true ili false) iz paketa pomoću ključa "reply_visible".
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- Dodajte test ispod prethodnog retka za varijablu isVisible.
if (isVisible) {
}
Ako u paketu stanja postoji ključ reply_visible (i isVisible je stoga istinit), morat ćete vratiti stanje.
- Unutar isVisible testa, učinite zaglavlje vidljivim.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- Dobijte tekstualni odgovor iz paketa s ključem "reply_text" i postavite odgovor TextView da prikazuje taj niz.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- Učini odgovor TextView također vidljivim:
mReplyTextView.setVisibility(View.VISIBLE);
- Pokrenite aplikaciju. Pokušajte rotirati uređaj ili emulator kako biste bili sigurni da poruka odgovora (ako postoji) ostaje na zaslonu nakon što se aktivnost ponovno stvori.
Šifra rješenja 2. zadatka
Sljedeći isječci koda prikazuju kôd rješenja za ovaj zadatak.
Glavna aktivnost
Sljedeći isječci koda prikazuju dodani kod u MainActivity, ali ne cijelu klasu.
Metoda onSaveInstanceState():
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// If the heading is visible, message needs to be saved.
// Otherwise we're still using default layout.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
outState.putString("reply_text",
mReplyTextView.getText().toString());
}
}
Metoda onCreate():
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
// Initialize all the view variables.
mMessageEditText = findViewById(R.id.editText_main);
mReplyHeadTextView = findViewById(R.id.text_header_reply);
mReplyTextView = findViewById(R.id.text_message_reply);
// Restore the saved state.
// See onSaveInstanceState() for what gets saved.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
// Show both the header and the message views. If isVisible is
// false or missing from the bundle, use the default layout.
if (isVisible) {
mReplyHeadTextView.setVisibility(View.VISIBLE);
mReplyTextView.setText(savedInstanceState
.getString("reply_text"));
mReplyTextView.setVisibility(View.VISIBLE);
}
}
}
Kompletan projekt:
Projekt Android Studio: TwoActivitiesLifecycle
5. Kodiranje
Izazov: Napravite jednostavnu aplikaciju popisa za kupnju s glavnom aktivnošću za popis koji korisnik izrađuje i drugom aktivnošću za popis uobičajenih artikala za kupnju.
- Glavna aktivnost trebala bi sadržavati popis za izradu, koji bi trebao biti sastavljen od deset praznih TextView elemenata.
- Gumb Dodaj artikl u glavnoj aktivnosti pokreće drugu aktivnost koja sadrži popis uobičajenih artikala za kupnju (sir, riža, jabuke i tako dalje). Koristite elemente gumba za prikaz stavki.
- Odabir stavke vraća korisnika na glavnu aktivnost i ažurira prazan TextView da uključi odabranu stavku.
Koristite namjeru za prijenos informacija iz jedne aktivnosti u drugu. Provjerite je li trenutno stanje popisa za kupovinu spremljeno kada korisnik okrene uređaj.
6. Sažetak
- Životni ciklus Aktivnosti je skup stanja kroz koja Aktivnost migrira, počevši kada je prvi put kreirana i završava kada Android sustav povrati resurse za tu Aktivnost.
- Kako korisnik prelazi s jedne Aktivnosti na drugu, unutar i izvan vaše aplikacije, svaka se Aktivnost kreće između stanja u životnom ciklusu Aktivnosti.
- Svako stanje u životnom ciklusu aktivnosti ima odgovarajuću metodu povratnog poziva koju možete nadjačati u svojoj klasi aktivnosti.
- Metode životnog ciklusa su onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
- Nadjačavanje metode povratnog poziva životnog ciklusa omogućuje vam dodavanje ponašanja koje se događa kada vaša aktivnost prijeđe u to stanje.
- Svojim klasama u Android Studiju možete dodati metode nadjačavanja kostura pomoću Koda > Nadjačavanje.
- Promjene konfiguracije uređaja, kao što je rotacija, rezultiraju uništavanjem i ponovnim stvaranjem aktivnosti kao da je nova.
- Dio stanja aktivnosti sačuvan je nakon promjene konfiguracije, uključujući trenutne vrijednosti elemenata EditText. Za sve ostale podatke, te podatke morate izričito sami spremiti.
- Spremi stanje instance aktivnosti u onSaveInstanceState() metodi.
- Podaci o stanju instance pohranjuju se kao jednostavni parovi ključ/vrijednost u paketu. Koristite Bundle metode za stavljanje podataka u i povrat podataka iz Bundlea.
- Vratite stanje instance u onCreate(), što je preferirani način, ili onRestoreInstanceState(). Nazad