1. Üdvözöljük
Ez a gyakorlati kódlaboratórium az 1. rész része: Kezdje el az Android Developer Fundamentals (2. verzió) tanfolyamot. A legtöbb értéket akkor hozhatja ki ebből a kurzusból, ha sorban végigdolgozza a kódlaboratóriumokat:
- A tanfolyam kódlaboratóriumainak teljes listáját lásd: Codelabs for Android Developer Fundamentals (V2).
- A kurzussal kapcsolatos részletekért, beleértve az összes koncepciófejezetre, alkalmazásra és diákra mutató hivatkozásokat, tekintse meg az Android Developer Fundamentals (2. verzió) című részt.
Bevezetés
Ebben a gyakorlatban többet megtudhat a tevékenység életciklusáról. Az életciklus azon állapotok összessége, amelyekben egy tevékenység a teljes élettartama alatt lehet, a létrehozásától kezdve egészen addig, amíg megsemmisül, és a rendszer visszaszerzi erőforrásait. Miközben a felhasználó az alkalmazásban végzett tevékenységek között navigál (valamint az alkalmazásba be- és kilép), a tevékenységek életciklusuk különböző állapotai között váltanak át.
Egy tevékenység életciklusának minden szakaszához tartozik egy megfelelő visszahívási metódus: onCreate(), onStart(), onPause() és így tovább. Amikor egy tevékenység állapota megváltozik, a rendszer meghívja a hozzá tartozó visszahívási metódust. A következő módszerek egyikét már láttad: onCreate(). Az életciklus-visszahívási metódusok bármelyikének felülbírálásával a tevékenységosztályokban módosíthatja a tevékenység alapértelmezett viselkedését a felhasználói vagy rendszerműveletek hatására.
A tevékenység állapota az eszközkonfiguráció változásaira is reagálhat, például amikor a felhasználó álló helyzetből fekvő helyzetbe forgatja az eszközt. Amikor ezek a konfigurációs változások megtörténnek, a tevékenység megsemmisül, és alapértelmezett állapotában újra létrejön, és a felhasználó elveszítheti a tevékenységbe bevitt információkat. A felhasználók összezavarásának elkerülése érdekében fontos, hogy az alkalmazást a váratlan adatvesztés elkerülése érdekében fejlessze. Később ebben a gyakorlatban kísérletezhet a konfigurációs módosításokkal, és megtanulhatja, hogyan őrizheti meg a tevékenység állapotát az eszközkonfiguráció változásaira és a tevékenység életciklusának egyéb eseményeire reagálva.
Ebben a gyakorlatban naplózási nyilatkozatokat ad hozzá a TwoActivities alkalmazáshoz, és megfigyelheti a tevékenységek életciklusának változásait az alkalmazás használata során. Ezután elkezd dolgozni ezekkel a változtatásokkal, és megvizsgálja, hogyan kezelheti a felhasználói bevitelt ilyen körülmények között.
Előfeltételek
Képesnek kell lennie a következőkre:
- Hozzon létre és futtasson alkalmazásprojektet az Android Studióban .
- Adjon hozzá naplókivonatokat az alkalmazáshoz, és tekintse meg ezeket a naplókat a Logcat ablaktáblában.
- Értse meg a tevékenységet és a szándékot, és dolgozzon velük, és kényelmesen kommunikáljon velük.
Mit fogsz tanulni
- Hogyan működik a tevékenység életciklusa.
- Amikor egy tevékenység elindul, szünetel, leáll, és megsemmisül.
- A tevékenységváltozásokhoz kapcsolódó életciklus-visszahívási módszerekről.
- Olyan műveletek (például konfigurációs változások) hatása, amelyek tevékenység életciklus-eseményekhez vezethetnek.
- A tevékenység állapotának megőrzése az életciklus-események során.
Mit fogsz csinálni
- Adjon hozzá kódot a TwoActivities alkalmazáshoz az előző gyakorlatból, hogy megvalósítsa a különböző tevékenység-életciklus-visszahívásokat, és naplózási utasításokat is tartalmazzon.
- Figyelje meg az állapotváltozásokat az alkalmazás futása során, és amikor az alkalmazásban lévő egyes tevékenységeket használja.
- Módosítsa az alkalmazást, hogy megőrizze egy olyan tevékenység példányállapotát, amelyet a rendszer váratlanul újra létrehoz a felhasználói viselkedés vagy az eszköz konfigurációjának változása miatt.
2. Az alkalmazás áttekintése
Ebben a gyakorlatban hozzáadhatja a TwoActivities alkalmazást. Az alkalmazás nagyjából ugyanúgy néz ki és viselkedik, mint a legutóbbi kódlaboratóriumban. Két tevékenység-megvalósítást tartalmaz, és lehetővé teszi a felhasználó számára, hogy küldjön egymás között. Az ebben a gyakorlatban az alkalmazáson végrehajtott változtatások nem befolyásolják annak látható felhasználói viselkedését.
3. 3. 1. feladat: Életciklus-visszahívások hozzáadása a TwoActivities-hez
Ebben a feladatban végrehajtja az összes tevékenység életciklus-visszahívási metódusát, hogy üzeneteket nyomtasson a logcat rendszerbe, amikor ezeket a metódusokat hívják. Ezek a naplóüzenetek lehetővé teszik, hogy megtekinthesse, mikor változik meg a Tevékenység-életciklus állapota, és hogy ezek az életciklus-állapot-változások hogyan befolyásolják az alkalmazást a futás során.
1.1 (Opcionális) Másolja ki a TwoActivities projektet
A gyakorlatban szereplő feladatokhoz módosítani fogja a meglévő TwoActivities projektet, amelyet az előző gyakorlatban épített fel. Ha szeretné megőrizni az előző TwoActivities projektet, kövesse a Függelék: Segédprogramok lépéseit a projekt másolatának elkészítéséhez.
1.2 A visszahívások implementálása a MainActivity programba
- Nyissa meg a TwoActivities projektet az Android Studióban, és nyissa meg a MainActivity-t a Projekt > Android panelen.
- Az onCreate() metódusban adja hozzá a következő naplóutasításokat:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
- Adjon hozzá egy felülbírálást az onStart() visszahíváshoz, egy utasítással az esemény naplójába:
@Override
public void onStart(){
super.onStart();
Log.d(LOG_TAG, "onStart");
}
Parancsikonként válassza a Kód > Módszerek felülírása lehetőséget az Android Studio alkalmazásban. Megjelenik egy párbeszédpanel az összes lehetséges módszerrel, amelyet felülbírálhat az osztályban. Egy vagy több visszahívási metódus kiválasztása a listából egy teljes sablont szúr be ezekhez a metódusokhoz, beleértve a szuperosztály szükséges hívását.
- Használja az onStart() metódust sablonként az onPause(), onRestart(), onResume(), onStop() és onDestroy() életciklus-visszahívások megvalósításához.
Az összes visszahívási módszer ugyanazokkal az aláírásokkal rendelkezik (a név kivételével). Ha a másolás és beillesztés onStart() segítségével létrehozza ezeket a többi visszahívási metódust, ne felejtse el frissíteni a tartalmat, hogy a megfelelő metódus hívja meg a szuperosztályban, és naplózza a megfelelő metódust.
- Futtassa az alkalmazást.
- Kattintson a Logcat fülre az Android Studio alján a Logcat panel megjelenítéséhez. Három naplóüzenetet kell látnia, amelyek azt a három életciklus-állapotot mutatják, amelyeken a tevékenység átment a kezdetekkor:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume
1.3 Életciklus-visszahívások megvalósítása a SecondActivityben
Most, hogy megvalósította a MainActivity életciklus-visszahívási metódusait, tegye ugyanezt a SecondActivity esetében is.
- Nyissa meg a SecondActivity-t.
- Az osztály tetején adjon hozzá egy állandót a LOG_TAG változóhoz:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
- Adja hozzá az életciklus-visszahívásokat és a naplókimutatásokat a második tevékenységhez. (A visszahívási metódusokat a MainActivity-ből másolhatja és illesztheti be.)
- Adjon hozzá egy naplóutasítást a returnReply() metódushoz közvetlenül a finish() metódus előtt:
Log.d(LOG_TAG, "End SecondActivity");
1.4 Figyelje meg a naplót, miközben az alkalmazás fut**
- Futtassa az alkalmazást.
- Kattintson a Logcat fülre az Android Studio alján a Logcat panel megjelenítéséhez.
- Írja be a tevékenységet a keresőmezőbe. Az Android logcat nagyon hosszú és zsúfolt lehet. Mivel az egyes osztályok LOG_TAG változója vagy a MainActivity vagy a SecondActivity szavakat tartalmazza, ez a kulcsszó lehetővé teszi, hogy csak az Önt érdeklő dolgokra szűrje a naplót.
Kísérletezzen az alkalmazás használatával, és vegye figyelembe, hogy az életciklus-események, amelyek különböző műveletekre reagálnak. Különösen az alábbi dolgokat próbálja ki:
- Használja a szokásos módon az alkalmazást (üzenet küldése, válaszadás másik üzenettel).
- A Vissza gombbal léphet vissza a második tevékenységről a fő tevékenységre.
- Használja az alkalmazássáv felfelé mutató nyilat a második tevékenységről a fő tevékenységre való visszatéréshez.
- Forgassa el az eszközt a fő és a második tevékenységben is különböző időpontokban az alkalmazásban, és figyelje meg, mi történik * a naplóban és a képernyőn.
- Nyomja meg az áttekintés gombot (a négyzet alakú gomb a Kezdőlaptól jobbra), és zárja be az alkalmazást (koppintson az X-re).
- Térjen vissza a kezdőképernyőre, és indítsa újra az alkalmazást.
TIPP: Ha az alkalmazást emulátorban futtatja, szimulálhatja a forgatást a Control+F11 vagy a Control+Function+F11 billentyűkombinációval.
1. feladat megoldási kódja
A következő kódrészletek az első feladat megoldási kódját mutatják.
MainActivity
A következő kódrészletek a MainActivityben hozzáadott kódot mutatják, de nem a teljes osztályt.
Az onCreate() metódus:
@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);
}
A többi életciklus módszer:
@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");
}
SecondActivity
A következő kódrészletek a SecondActivityben hozzáadott kódot mutatják, de nem a teljes osztályt.
A SecondActivity osztály tetején:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
A returnReply() metódus:
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();
}
A többi életciklus módszer:
Ugyanaz, mint a fenti MainActivity esetében.
4. 4. 2. feladat: Mentse el és állítsa vissza a Tevékenységpéldány állapotát
A rendszererőforrásoktól és a felhasználói viselkedéstől függően előfordulhat, hogy az alkalmazás minden tevékenysége sokkal gyakrabban semmisül meg és rekonstruálódik, mint gondolná.
Lehet, hogy észrevette ezt a viselkedést az utolsó részben, amikor elforgatta az eszközt vagy az emulátort. Az eszköz elforgatása egy példa az eszközkonfiguráció megváltoztatására. Bár az elforgatás a leggyakoribb, minden konfigurációmódosítás azt eredményezi, hogy az aktuális tevékenység megsemmisül, és úgy jön létre, mintha új lenne. Ha nem veszi figyelembe ezt a viselkedést a kódban, akkor konfigurációs változás esetén a tevékenység elrendezése visszatérhet alapértelmezett megjelenéséhez és kezdeti értékéhez, és a felhasználók elveszíthetik helyüket, adataikat vagy előrehaladásuk állapotát az alkalmazásod.
Az egyes tevékenységek állapotát a rendszer kulcs/érték párok halmazaként tárolja a Tevékenységpéldány állapotnak nevezett Bundle objektumban. A rendszer elmenti az alapértelmezett állapotinformációkat a példányállapot-csomagba közvetlenül a tevékenység leállítása előtt, és átadja ezt a köteget az új tevékenységpéldánynak a visszaállításhoz.
Annak érdekében, hogy ne veszítsen adatot egy tevékenységben, amikor azt váratlanul megsemmisítik és újra létrehozzák, implementálnia kell az onSaveInstanceState() metódust. A rendszer meghívja ezt a metódust az Ön tevékenységében (onPause() és onStop() között), ha fennáll annak a lehetősége, hogy a tevékenységet megsemmisítik és újra létrehozzák.
A példányállapotban mentett adatok csak az adott tevékenység ezen példányára vonatkoznak az aktuális alkalmazásmunka során. Amikor leállít és újraindít egy új alkalmazás-munkamenetet, a tevékenységpéldány állapota elvész, és a tevékenység visszaáll az alapértelmezett megjelenésre. Ha felhasználói adatokat kell mentenie az alkalmazásmunkamenetek között, használja a megosztott beállításokat vagy egy adatbázist. Mindkettőről egy későbbi gyakorlatban tanulhat.
2.1 Mentse el az Activity példány állapotát az onSaveInstanceState() paranccsal
Talán észrevette, hogy az eszköz elforgatása egyáltalán nem befolyásolja a második tevékenység állapotát. Ennek az az oka, hogy a második tevékenység-elrendezés és állapot az elrendezésből és az azt aktiváló Intentből jön létre. Még ha a tevékenységet újra létrehozzák, az Intent továbbra is ott van, és az Intent adatai továbbra is használatban vannak minden alkalommal, amikor a második tevékenység onCreate() metódusát hívják.
Ezenkívül észreveheti, hogy minden tevékenységnél az üzenetbe vagy a válasz szerkesztése szövegelemekbe beírt szövegek megmaradnak az eszköz elforgatásakor is. Ennek az az oka, hogy az elrendezés egyes nézetelemeinek állapotinformációit a rendszer automatikusan menti a konfigurációs módosítások során, és az EditText aktuális értéke az egyik ilyen eset.
Tehát az egyetlen tevékenységi állapot, amely érdekli, a válaszfejléc TextView elemei és a válaszszöveg a fő tevékenységben. Mindkét TextView elem alapértelmezés szerint láthatatlan; csak akkor jelennek meg, ha a második tevékenységből visszaküld egy üzenetet a fő tevékenységnek.
Ebben a feladatban kódot ad hozzá a két TextView elem példányállapotának megőrzéséhez az onSaveInstanceState() segítségével.
- Nyissa meg a MainActivity elemet.
- Adja hozzá az onSaveInstanceState() váz-megvalósítását a tevékenységhez, vagy használja a Code > Override Methods parancsot egy váz-felülbírálat beszúrásához.
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
}
- Ellenőrizze, hogy a fejléc jelenleg látható-e, és ha igen, tegye a láthatósági állapotot a Bundle állapotba a putBoolean() metódussal és a "reply_visible" kulccsal.
if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
outState.putBoolean("reply_visible", true);
}
Ne feledje, hogy a válasz fejléce és szövege láthatatlannak van jelölve, amíg nem érkezik válasz a második tevékenységből. Ha a fejléc látható, akkor vannak válaszadatok, amelyeket el kell menteni. Ne feledje, hogy minket csak ez a láthatósági állapot érdekel – a fejléc tényleges szövegét nem kell menteni, mert ez a szöveg soha nem változik.
- Ugyanezen a csekken belül adja hozzá a válaszszöveget a köteghez.
outState.putString("reply_text",mReplyTextView.getText().toString());
Ha a fejléc látható, feltételezhető, hogy maga a válaszüzenet is látható. Nem kell tesztelnie vagy mentenie a válaszüzenet aktuális láthatósági állapotát. Csak az üzenet tényleges szövege kerül a "válasz_szöveg" kulcsú Bundle állapotba.
Csak azoknak a nézetelemeknek az állapotát menti, amelyek a tevékenység létrehozása után változhatnak. Az alkalmazásban lévő többi nézetelem (a Szerkesztési szöveg, a Gomb) bármikor újra létrehozható az alapértelmezett elrendezésből.
Vegye figyelembe, hogy a rendszer elmenti néhány Nézet elem állapotát, például az EditText tartalmát.
2.2 Állítsa vissza a Activity példány állapotát az onCreate()
Miután elmentette a tevékenységpéldány állapotát, azt is vissza kell állítania a tevékenység újbóli létrehozásakor. Ezt megteheti az onCreate(), vagy az onRestoreInstanceState() visszahívás megvalósításával, amely a tevékenység létrehozása után az onStart() után kerül meghívásra.
A Tevékenység állapot visszaállításának legtöbbször az onCreate() a legjobb helye, hogy a felhasználói felület, beleértve az állapotot is, a lehető leghamarabb elérhető legyen. Néha célszerű ezt az onRestoreInstanceState() segítségével megtenni, miután az összes inicializálást elvégezték, vagy megengedni az alosztályoknak, hogy eldöntsék, használják-e az alapértelmezett megvalósítást.
- Az onCreate() metódusban, miután a nézetváltozókat inicializálták a findViewById() paraméterrel, adjon hozzá egy tesztet, hogy megbizonyosodjon arról, hogy a savedInstanceState nem 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) {
}
A tevékenység létrehozásakor a rendszer az állapotcsomagot az onCreate()-nek adja át egyetlen argumentumként. Az onCreate() első meghívásakor és az alkalmazás elindításakor a Bundle nulla – az alkalmazás első indításakor nincs létező állapot. Az onCreate() későbbi hívásai egy köteget tartalmaznak az onSaveInstanceState() paraméterben tárolt adatokkal.
- Az ellenőrzésen belül a „reply_visible” kulccsal vegye ki az aktuális láthatóságot (igaz vagy hamis) a csomagból.
if (savedInstanceState != null) {
boolean isVisible =
savedInstanceState.getBoolean("reply_visible");
}
- Adjon hozzá egy tesztet az előző sor alá az isVisible változóhoz.
if (isVisible) {
}
Ha van egy reply_visible kulcs az állapotcsomagban (és ezért az isVisible igaz), akkor vissza kell állítania az állapotot.
- Az isVisible tesztben tegye láthatóvá a fejlécet.
mReplyHeadTextView.setVisibility(View.VISIBLE);
- Szerezze be a szöveges válaszüzenetet a csomagból a „reply_text” kulccsal, és állítsa be a válasz TextView-t úgy, hogy az ezt a karakterláncot jelenítse meg.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
- Tedd láthatóvá a TextView választ is:
mReplyTextView.setVisibility(View.VISIBLE);
- Futtassa az alkalmazást. Próbálja meg elforgatni az eszközt vagy az emulátort, hogy a válaszüzenet (ha van) a képernyőn maradjon a tevékenység újbóli létrehozása után.
2. feladat megoldási kódja
A következő kódrészletek a feladat megoldási kódját mutatják.
MainActivity
A következő kódrészletek a MainActivityben hozzáadott kódot mutatják, de nem a teljes osztályt.
Az onSaveInstanceState() metódus:
@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());
}
}
Az onCreate() metódus:
@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);
}
}
}
A teljes projekt:
Android Studio Project: TwoActivitiesLifecycle
5. Kódolás
Kihívás: Hozzon létre egy egyszerű bevásárlólista-alkalmazást, amelynek fő tevékenysége a felhasználó által összeállított listához tartozik, egy másik tevékenység pedig a gyakori bevásárló cikkek listájához.
- A fő tevékenységnek tartalmaznia kell az elkészítendő listát, amelynek tíz üres TextView elemből kell állnia.
- A fő tevékenységen lévő Elem hozzáadása gomb egy második tevékenységet indít el, amely a gyakori vásárlási cikkek listáját tartalmazza (sajt, rizs, alma stb.). Használja a gombelemeket az elemek megjelenítéséhez.
- Egy elem kiválasztása visszaállítja a felhasználót a fő tevékenységhez, és frissít egy üres TextView-t, hogy tartalmazza a kiválasztott elemet.
Használjon szándékot az információk egyik tevékenységből a másikba való átadásához. Győződjön meg arról, hogy a bevásárlólista aktuális állapota mentésre kerül, amikor a felhasználó elforgatja a készüléket.
6. Összegzés
- A Tevékenység-életciklus azon állapotok halmaza, amelyeken a tevékenység áttelepül, kezdve az első létrehozásával és akkor ér véget, amikor az Android rendszer visszakéri az adott tevékenységhez szükséges erőforrásokat.
- Ahogy a felhasználó az egyik tevékenységről a másikra, valamint az alkalmazáson belül és kívül navigál, minden tevékenység a tevékenység életciklusának állapotai között mozog.
- A tevékenység életciklusában minden állapothoz tartozik egy megfelelő visszahívási metódus, amelyet felülbírálhat a tevékenységosztályában.
- Az életciklus metódusai: onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
- Az életciklus-visszahívási módszer felülbírálása lehetővé teszi olyan viselkedés hozzáadását, amely akkor fordul elő, amikor a tevékenység ebbe az állapotba kerül.
- Csontváz-felülbírálási módszereket adhat az osztályokhoz az Android Studióban a Kód > Felülbírálás menüponttal.
- Az eszközkonfiguráció megváltoztatása, például az elforgatás azt eredményezi, hogy a tevékenység megsemmisül, és újból létrejön, mintha új lenne.
- A tevékenység állapot egy része megmarad a konfiguráció módosításakor, beleértve az EditText elemek aktuális értékeit is. Minden egyéb adat esetében kifejezetten saját magának kell mentenie az adatokat.
- Mentse a tevékenységpéldányállapotot az onSaveInstanceState() metódusban.
- A példányállapot-adatok egyszerű kulcs/érték párokként kerülnek tárolásra egy kötegben. Használja a Bundle metódusokat, hogy adatokat helyezzen be a kötegbe, és adatokat vonjon vissza onnan.
- Állítsa vissza a példányállapotot az onCreate() vagy onRestoreInstanceState() segítségével, amely az előnyben részesített módszer. Vissza