Obsah Životní cyklus activity Context Intent Spouštění aktivit Interakce s uživatelem Toast 2
4 oncreate(bundle savedinstancestate) { } Zavolá se při každém vytvoření activity (i při otočení displeje) Zde by měla být zavedení layoutu a inicializace widgetů Nastavení proměnných Nastavení UI Jako parametr je Bundle objekt s uloženým předchozím stavem aktivity (pokud nějaký je) Následuje onstart() 1. @Override 2. public void oncreate(bundle savedinstancestate) { setcontentview(r.layout.main); 4. super.oncreate(savedinstancestate); 5. }
5 onrestart() { } Zavolá se, když je aktivita zastavená před tím, než se znovu spustí Vždy následuje onstart() 1. @Override 2. protected void onrestart() { super.onrestart(); 4. }
onstart() { } Zavolá se, když je aktivita viditelná uživatelem Následuje: onresume() pokud se aktivita dostane do popředí onstop() pokud přestane být viditelná 1. @Override 2. protected void onstart() { super.onstart(); 4. } 6
onresume() { } Zavolá se, pokud je aktivita na popředí V tento moment je aktivita na vrcholu zásobníku Aktivita nyní přijímá vstup od uživatele Vždy následuje onpause() 1. @Override 2. protected void onresume() { super.onresume(); 4. } 7
onpause() { } Zavolá se, pokud aktivita přestane být na popředí Při stisku tlačítka HOME Při přechodu na jinou activitu Doporučená implementace: Uložení neobnovitelných dat Ukončení všech animací a operací náročných na CPU Např. přerušení GPS a jiných senzorů Uvolnění různých zámků (screenlock, wakelock ) Operace by měly být časově nenáročné Po skončení této metody může být proces zabit 1. 2. 4. 5. 6. 7. @Override protected void onpause() { wakelock.release(); locationmanager.removeupdates(locationlistener); savechanges(); super.onpause(); } 8
9 onstop() { } Zavolá se, pokud aktivita již není viditelná (před tím mohla být např. překryta jinou průhlednou aktivitou) Následuje: onrestart() Pokud se aktivita vrátí do viditelného stavu ondestroy() Pokud se aktivita ukončí Zabití procesu pokud systém potřebuje prostředky 1. @Override 2. protected void onstop() { super.onstop(); 4. }
10 ondestroy() { } Poslední metoda, která se zavolá před tím než je aktivita ukončena Následuje ukončení aktivity 1. @Override 2. protected void ondestroy() { super.ondestroy(); 4. }
11 Ukládání stavu aktivity Při změně orientace se aktivita ukončí a zvonu vytvoří onsaveinstancestate(bundle outstate) ukládání stavu aktivity (proměnné, Views ) Zavolá se pokud aktivita přejde do pozadí (před onstop) Defaultní implementace se stará o většinu UI elementů Obsah proměnných se ukládá do outstate Obnovení stavu v oncreate(bundle savedinstancestate)
12 Bundle Třída sloužící k mapování jakýchkoli Serializable nebo Parcelable objektů Mapuje se pomocí String -ových klíčů Vkládání: 1. 2. 4. Bundle bundle=new Bundle(); bundle.putstring("klíč", "hodnota"); bundle.putint("číslo", 1); bundle.putserializable("cokoli serializovatelného", new Integer(3)); Získávání: 1. 2. String s = bundle.getstring("klíč"); //nebo (String)bundle.get("klíč"); int i = bundle.getint("číslo"); Integer integer = (Integer) bundle.get("cokoli serializovatelného");
Ukládání stavu aktivity Uložení proměnné count: 1. 2. 4. 5. @Override protected void onsaveinstancestate(bundle outstate) { outstate.putint("count", count); super.onsaveinstancestate(outstate); } Obnovení: 1. 2. 4. 5. 6. 7. 8. @Override protected void oncreate(bundle savedinstancestate) { if(savedinstancestate!=null){ count = savedinstancestate.getint("count"); }... super.oncreate(savedinstancestate); } 13
14 Spouštění aktivit Aktivity se spouštějí pomocí startactivity(intent); nebo startactivityforresult(intent, requestcode); Historie aktivit se ukládá do zásobníku Pomocí Intentu se definuje, jaká aktivita se jak spustí 1. Context context = this; 2. Intent i = new Intent(context, NewActivity.class); startactivity(i);
15 Context Abstraktní třída, od které dědí komponenty aplikace Poskytuje základní funkčnost společnou pro všechny komponenty Přístup ke zdrojům Přístup k třídám Spouštění Aktivit a služeb Vysílání a odchytávání Intentů
Intent Prostředek pro komunikaci mezi komponentami Může obsahovat: Jednoznačný identifikátor komponenty Extras Flags (přednáška 7) 1. 2. 4. Intent intent = new Intent(); intent.setclass(this, NewActivity.class); intent.putextra("count", count); intent.setflags(intent.flag_activity_clear_top); 16
17 Intent jednoznačný identifikátor Slouží pro specifikování, jaká konkrétní třída se má po odeslání Intentu spustit Metoda má 2 parametry: Context odkaz na aktuální komponentu Class třída, která se má po odeslání intentu spustit intent.setclass(this, NewActivity.class);
Intent extra Slouží pro předávání hodnot mezi komponentami Používá se stejné mapování jako u Bundle Lze předat jakýkoli Serializable nebo Parcelable objekt Mapuje se pomocí Stringů intent.putextra("count", count); 18
Intent flags Určuje, jak se spustí nová aktivita Hodnoty: Intent.FLAG_ACTIVITY_NO_ANIMATION; Vypne animace při spouštění dané aktivity Intent.FLAG_ACTIVITY_NO_HISTORY; Spouštěná aktivita se neuloží do zásobníku Jakmile z ní uživatel vyjede, aktivita se ukončí Intent.FLAG_ACTIVITY_CLEAR_TOP; Pokud již je spouštěná aktivita v zásobníku, obnoví se a všechny aktivity nad ní budou ukončeny Intent.FLAG_ACTIVITY_REORDER_TO_FRONT; Pokud již je spouštěná aktivita v zásobníku, obnoví se a přesune se navrch zásobníku Intent.FLAG_ACTIVITY_SINGLE_TOP; Pokud je spouštěná aktivita na vrcholu zásobníku, obnoví se a nespustí se nová 19
20 Launchmode Jak se spustí daná aktivita se také dá napevno určit v AdroidManifest.xml atributem android:launchmode Analogie ke konstantám FLAG_ACTIVITY_* v Intentu Může nabývat těchto hodnot: standard, singletop, singletask a singleinstance
21 Aktivita očekávající výsledek Pomocí startactivityforresult(intent, requestcode); spustíme aktivitu, od které očekáváme, že nám po ukončení vrátí výsledek Nastavením requestcode umožníme vyfiltrování odpovědí při zpracování výsledků 1. 2. 4. 5. Context context = this; Intent i = new Intent(context, NewActivity.class); i.setflags(intent.flag_activity_no_animation Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); i.putextra("cislo", 10); startactivityforresult(i, 1);
22 Aktivita poskytující výsledek Pomocí getintent(); získáme Intent, který spustil aktivitu Pomocí setresult(resultcode, data); nastavíme výsledek, který se vrátí volající aktivitě Příkazem finish(); ukončíme aktuální aktivitu 1. 2. 4. 5. 6. 7. Intent i =getintent(); int cislo = i.getintextra("cislo", 0); Intent result = new Intent(); result.putextra("vysledek", cislo+10); setresult(result_ok, result); finish();
23 Aktivita očekávající výsledek Metoda onactivityresult se zavolá když se ukončí aktivita spuštěná pomocí startactivityforresult requestcode je stejný jako při spouštění aktivity resultcode je číslo nastavené pomocí setresult v již ukončené aktivitě data Intent s daty vrácenými aktivitou 1. 2. 4. 5. 6. 7. 8. @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if(requestcode == 1 && resultcode==result_ok){ int vysledek=data.getintextra("vysledek", -1);... } super.onactivityresult(requestcode, resultcode, data); }
Interakce s uživatelem pomocí Toastů Toast Zpráva, jenž se zobrazí nad aktivitou Automaticky se zobrazuje a mizí nelze ji programově schovat ani nijak ovlivňovat při zobrazování Trvání zobrazení lze nastavit na dvě možnosti: Toast.LENGTH_SHORT Toast.LENGTH_LONG Pozicovatelnost nastavuje se pomocí metody setgravity(gravity) Context context = getapplicationcontext(); CharSequence text = "Hello toast!"; int duration = Toast.LENGTH_SHORT; Toast toast = Toast.makeText(context, text, duration); toast.show(); 24