02. Activity használata

Default book

Alkalmazás taszkok végrehajtása Activity-k segítségével.

Az Android Activity osztálya (android.app.Activity) minden Android alkalmazás magja. A leggyakrabban egy Activity egy oldal megjelenítésével foglalkozik. Például egy játék esetén az alábbi Activity-k jöhetnek létre:

  • Indításkor egy nyitókép (Splash Screen). Megnyit egy kezdőképernyőt, verziószámot, stb. majd rövid idő után a főoldalra lép.
  • Főmenü képernyő: Itt választhat a felhasználó, hogy mit akar, és ez az Activity segít abban, hogy a játékos a játék activity-t indítsa el.
  • A játék képernyő: a játék ezen aképernyőn folyik. Ez megint egy új tevékenység.
  • Az elért pontsázmok képernyő új tevékenység
  • A Help megint egy új tevékenységet jelent.

Az Android Activity életciklusa

Az Android operációs rendszer multiprocessz rendszer, azaz egy alkalmazás egyidejűleg több taszkot futtathat (Activity vagy Service) és az operációs rendszer több alkalmazást futtathat. Az alkalmazásoknak a háttérben megváltozhat a viselkedése, telefonhíváskor vagy más eseményre felfüggeszthetik működésüket, stb. Egy időben csak egy Activity lehet előtérben.

Az operációs rendszer az Activity-ket egy verembe helyezi (Activity stack. Hagyoányosan ezt egy LIFO , aza Last In First Out adatszerkezetnek hívja). Ha egy új Activity indul, akkor a korábbi Activity leáll és az újonnan induló a verem tetejére kerül. Ha a futó Activity leáll (például az Exit vagy az Esc gombbal kilépünk belőle), akkor kikerül az Activity a veremből és a korábbi Activity kerül felülre, azaz előtérbe.

Az Activity-k életciklusának lépéseit fontos megismerni

Activity callback (=életciklus) metódusok használata az Applicationok állapotának és erőforrásainak kezeléséhez. Az alábbi előre definiált metódusok vannak egy Activity osztályban.

public class MyActivity extends Activity{
    protected void onCreate(Bundle savedInstance);
    protected void onStart();
    protected void onRestart();
    protected void onResume();
    protected void onPause();
    protected void onStop();
    protected void onDestroy();
}

Az alábbi folyamatábra írja le egy android alkalmazás életének lépéseit

Az Activity indításakor lefut az onCreate() metódus

Az eldső indításkor a Bundle paraméter null értéket kap. Ha az Activity kikerült a memóriából és újraindul, akkor a korábbi állapot mentése található a Bundle paraméterben. az onCreate() metódusban kell minden inicializáló utasítást lefuttatni.  Ez a metódus hívja meg a setContentViev() metódust is.

Ha az Activity újra előtérbe kerül, akkor fut le az onResume() metódus

Amikor egy Activity a veremből a képernyőre kerül, akkor lefut ez a metódus. Bár ilyenkor a képernyőn még nem jelenik meg az alkalmazás, de ilyenkor érdemes minden szükséges erőforrást újra betölteni. Gyakran itt lehet elindítani hang, film vagy animáció lejátszását, vagy folytatását.

Leállítás, mentés, visszaállítás az onPause() metódus esetén

Amikor egy Activity a verembe kerül, akkor értesítést kap és meghívódik az onPause() metódus. Ekkor a metódus leállíthatja a film / hang lejátszást, felszabadíthatja az adatbázis hozzáférést, a hálózati folyamatokat,stb. El kell menteni minden korábban nem mentett adatot is. A rendszer innentől megengedi, hogy a rendszer kilője az activity-t a memóriából, bármiféle figyelmeztetés nélkül. Itt lehet az állapot információkat is menteni az Android alkalmazáson belül.

Alkalmazás lelövése, háttében futó alkalmazások esetén

Az Android rendszer csak háttérben lévő Activity-t tud lelőni. Ilyenkor nem fut le az onPause(), onStop() és az onDestroy() metódus sem. Minél több erőforrást szabadítunk fel az onPause() metódusban, annál kisebb az esélye, hogy a háttérben kilövik az Activity-t és az alkalmazás sérül. Az activity kilövése ugyanakkor nem jelenti azt, hogy az Activity stack-ből is kikerül az alkalmazás, hanem ott marad és az állapota a Bundle objektumba mentődik. Érdemes az onSaveinstanceState() metódust elkészíteni, amiben automatikusan elmenthetünk adatokat. Egy későbbi onCreate() lefuttatásakor a Bundle objektum visszatölti a szükséges állapot adatokat.

Az Activity állapot mentése a Bundle paraméterbe az onSaveInstanceState() segítségével

Mivel a fenti metódus nem fut le minden körülmények között, ezért az onPause() metódusban érdemes a felhasználói adatokat menteni. Érdemes a fontos adatokat az onPause() metódussal mentetni, és ezt akkor használjuk, ha a nem fontos, gyorsan visszakapandó adatokat (pl. egy űrlap nem teljesen itöltött adatai) akarunk kezelni

Az onRestoreInstanceState() állítja vissza az adatokat a Bundle objektumba az onStart() metódus használata esetén.

Az onDestroy() metódus használata

Normális lelövés esetén fut le. Két eset lehet: ha véget ér az Activity életciklusa (pl. Exit-tel kilépünk) vagy az operációs rendszer lövi le az alkalmazást, de hagyja lefutni az onDestroy() metódust.

Az Activity-k állapota

Egy Activity háromféle állapotban lehet:

  • Resumed (előtérben) - éppen ő van a képernyőn
  • Paused - Az activity él, de egy másik van az előtérben, bár még nem látszik. Kevés erőforrás esetén az ilyen állapotú Activity-t a rendszer kilőheti a memóriából és a memóriát felszabadíthatja.
  • Stopped - Leállítva. Kevés erőforrás esetén elsősorban az ilyen állapotú activity-t lövi ki a rendszer és szabadítja fel a memóriaterületet.

Állapotváltások

A fentiek alapján fontos, hogy az Activity-k állapotváltásaira az alkalmazás fel legyen készülve.

A létrehozás lépései.

Egy új Activity egyúttal egy új osztályt is jelent az Android programban, azaz egy új java fájlt.