Kaip naudoti veiklos gyvavimo ciklą ir būseną, kaip naudoti veiklos gyvavimo ciklą ir būseną

1. Sveiki atvykę

Ši praktinė kodų laboratorija yra 1 skyriaus dalis: pradėkite mokytis „Android Developer Fundamentals“ (2 versija). Daugiausia naudos iš šio kurso gausite, jei kodų laboratorijas dirbsite iš eilės:

  • Visą kurso kodų laboratorijų sąrašą rasite „Android Developer Fundamentals“ (V2) „Codelabs“.
  • Norėdami gauti daugiau informacijos apie kursą, įskaitant nuorodas į visus koncepcijos skyrius, programas ir skaidres, žr. Android Developer Fundamentals (2 versija).

Įvadas

Šioje praktikoje sužinosite daugiau apie veiklos gyvavimo ciklą. Gyvavimo ciklas yra būsenų rinkinys, kuriame veikla gali būti per visą savo gyvavimo laiką, nuo jos sukūrimo iki jos sunaikinimo ir sistemos atgaunant išteklius. Naudotojui naršant tarp veiklos jūsų programoje (taip pat į programą ir iš jos), veikla perkeliama iš vienos būsenos į kitą savo gyvavimo ciklą.

Dviguba bėda

Kiekvienas veiklos gyvavimo ciklo etapas turi atitinkamą atgalinio ryšio metodą: onCreate(), onStart(), onPause() ir pan. Kai veikla pakeičia būseną, iškviečiamas susietas atgalinio skambinimo metodas. Jau matėte vieną iš šių metodų: onCreate(). Nepaisydami bet kurio gyvavimo ciklo atgalinio iškvietimo metodo savo veiklos klasėse, galite pakeisti numatytąją veiklos elgseną reaguodami į vartotojo arba sistemos veiksmus.

Veiklos būsena taip pat gali pasikeisti atsižvelgiant į įrenginio konfigūracijos pokyčius, pavyzdžiui, kai vartotojas pasuka įrenginį iš stačios į gulsčią. Kai įvyksta šie konfigūracijos pakeitimai, veikla sunaikinama ir atkuriama į numatytąją būseną, o vartotojas gali prarasti informaciją, kurią įvedė į veiklą. Kad nesupainiotumėte naudotojų, svarbu sukurti programą, kad išvengtumėte netikėto duomenų praradimo. Vėliau šioje praktikoje eksperimentuosite su konfigūracijos pakeitimais ir sužinosite, kaip išsaugoti veiklos būseną reaguojant į įrenginio konfigūracijos pakeitimus ir kitus veiklos ciklo įvykius.

Šioje praktikoje prie „TwoActivities“ programos pridedate registravimo teiginius ir stebite veiklos ciklo pokyčius, kai naudojate programą. Tada pradedate dirbti su šiais pakeitimais ir tyrinėjate, kaip tvarkyti vartotojo įvestį tokiomis sąlygomis.

Būtinos sąlygos

Turėtumėte sugebėti:

  • Kurkite ir paleiskite programos projektą „Android Studio“ .
  • Pridėkite žurnalo teiginius prie programos ir peržiūrėkite tuos žurnalus „Logcat“ srityje.
  • Supraskite ir dirbkite su veikla bei ketinimais ir jauskitės patogiai su jais bendraudami.

Ką išmoksite

  • Kaip veikia veiklos gyvavimo ciklas.
  • Kai veikla prasideda, ji pristabdoma, sustoja ir sunaikinama.
  • Apie gyvavimo ciklo atgalinio iškvietimo metodus, susijusius su veiklos pakeitimais.
  • Veiksmų (pvz., konfigūracijos pakeitimų), dėl kurių gali atsirasti veiklos ciklo įvykių, poveikis.
  • Kaip išlaikyti veiklos būseną viso gyvavimo ciklo įvykių metu.

Ką tu darysi

  • Pridėkite kodą prie programėlės TwoActivities iš ankstesnės praktikos, kad įgyvendintumėte įvairius veiklos gyvavimo ciklo atgalinius skambučius ir įtrauktumėte registravimo ataskaitas.
  • Stebėkite būsenos pokyčius, kai programa veikia ir kai sąveikaujate su kiekviena programos veikla.
  • Modifikuokite programą, kad išlaikytumėte veiklos, kuri netikėtai atkuriama reaguojant į naudotojo elgesį arba įrenginio konfigūracijos pakeitimą, egzemplioriaus būseną.

2. Programėlės apžvalga

Šioje praktikoje pridedate prie „TwoActivities“ programos. Programa atrodo ir veikia maždaug taip pat, kaip ir paskutinėje kodų laboratorijoje. Jame yra du veiklos diegimai ir vartotojui suteikiama galimybė siųsti tarp jų. Programos pakeitimai, kuriuos atliksite šioje praktikoje, neturės įtakos matomai naudotojų elgsenai.

3. 3. 1 užduotis: pridėkite gyvavimo ciklo atgalinius skambučius prie TwoActivities

Atlikdami šią užduotį įdiegsite visus veiklos gyvavimo ciklo atgalinio iškvietimo metodus, kad spausdintumėte pranešimus į logcat, kai šie metodai bus iškviesti. Šie žurnalo pranešimai leis jums pamatyti, kada pasikeičia veiklos ciklo būsena ir kaip tie gyvavimo ciklo būsenos pokyčiai paveikia jūsų programą, kai ji veikia.

1.1 (Pasirenkama) Nukopijuokite TwoActivities projektą

Atlikdami šios praktikos užduotis pakeisite esamą TwoActivities projektą, kurį sukūrėte paskutiniame praktikoje. Jei norite, kad ankstesnis „TwoActivities“ projektas nepaliestų, atlikite veiksmus, nurodytus Priede: Priemonės, kad padarytumėte projekto kopiją.

1.2 Įdiekite atgalinius skambučius į „MainActivity“.

  1. Atidarykite „TwoActivities“ projektą „Android Studio“ ir atidarykite „MainActivity“ srityje Project > Android.
  2. Metodu onCreate() pridėkite šiuos žurnalo teiginius:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Pridėkite onStart() atgalinio iškvietimo nepaisymą su teiginiu į to įvykio žurnalą:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Norėdami gauti nuorodą, „Android Studio“ pasirinkite Kodas > Nepaisyti metodų. Pasirodo dialogo langas su visais galimais metodais, kuriuos galite nepaisyti savo klasėje. Iš sąrašo pasirinkus vieną ar daugiau atgalinio iškvietimo metodų, įterpiamas visas tų metodų šablonas, įskaitant reikalingą superklasės iškvietimą.

  1. Naudokite onStart() metodą kaip šabloną, kad įgyvendintumėte onPause(), onRestart(), onResume(), onStop() ir onDestroy() gyvavimo ciklo atgalinius iškvietimus

Visi atgalinio skambinimo metodai turi tuos pačius parašus (išskyrus pavadinimą). Jei kopijuojate ir įklijuojate onStart(), kad sukurtumėte šiuos kitus atgalinio iškvietimo metodus, nepamirškite atnaujinti turinio, kad būtų iškviestas tinkamas metodas superklasėje, ir įrašyti teisingą metodą.

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis. Turėtumėte pamatyti tris žurnalo pranešimus, rodančius tris gyvavimo ciklo būsenas, per kurias veikla buvo perkelta, kai ji prasidėjo:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Įdiekite gyvavimo ciklo atgalinius skambučius „SecondActivity“.

Dabar, kai įdiegėte „MainActivity“ gyvavimo ciklo atgalinio iškvietimo metodus, atlikite tą patį „SecondActivity“.

  1. Atidarykite „SecondActivity“.
  2. Klasės viršuje pridėkite kintamojo LOG_TAG konstantą:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Pridėkite gyvavimo ciklo atgalinius skambučius ir žurnalo ataskaitas prie antrosios veiklos. (Galite nukopijuoti ir įklijuoti atgalinio skambinimo metodus iš „MainActivity“.)
  2. Pridėkite žurnalo teiginį prie returnReply() metodo prieš pat finišo() metodą:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Stebėkite žurnalą, kai programa veikia**

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis.
  3. Paieškos laukelyje įveskite Veikla. Android logcat gali būti labai ilgas ir netvarkingas. Kadangi kiekvienos klasės kintamajame LOG_TAG yra žodžiai MainActivity arba SecondActivity, šis raktinis žodis leidžia filtruoti žurnalą tik pagal jus dominančius dalykus.

Dviguba bėda

Eksperimentuokite naudodami programą ir atkreipkite dėmesį į gyvavimo ciklo įvykius, kurie įvyksta reaguojant į skirtingus veiksmus. Visų pirma išbandykite šiuos dalykus:

  • Naudokitės programėle įprastai (siųskite žinutę, atsakykite kita žinute).
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite mygtuką Atgal.
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite programos juostoje esančią rodyklę aukštyn.
  • Skirtingu programos metu pasukite įrenginį pagrindinėje ir antrojoje veikloje ir stebėkite, kas vyksta * žurnale ir ekrane.
  • Paspauskite apžvalgos mygtuką (kvadratinis mygtukas pagrindinio puslapio dešinėje) ir uždarykite programą (palieskite X).
  • Grįžkite į pagrindinį ekraną ir iš naujo paleiskite programą.

PATARIMAS: jei naudojate programą emuliatoriuje, sukimąsi galite imituoti paspausdami „Control+F11“ arba „Control+Function+F11“.

1 užduoties sprendimo kodas

Šie kodo fragmentai rodo pirmosios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnCreate() metodas:

@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);
}

Kiti gyvavimo ciklo metodai:

@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");
}

Antroji veikla

Šie kodo fragmentai rodo pridėtą „SecondActivity“ kodą, bet ne visą klasę.

„SecondActivity“ klasės viršuje:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

„ReturnReply()“ metodas:

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();
}

Kiti gyvavimo ciklo metodai:

Tas pats, kas aukščiau esanti „MainActivity“.

4. 4. 2 užduotis: Išsaugokite ir atkurkite veiklos egzemplioriaus būseną

Atsižvelgiant į sistemos išteklius ir naudotojų elgseną, kiekviena jūsų programos veikla gali būti sunaikinta ir rekonstruota daug dažniau, nei manote.

Galbūt pastebėjote šį elgesį paskutiniame skyriuje, kai pasukote įrenginį arba emuliatorių. Įrenginio pasukimas yra vienas iš įrenginio konfigūracijos pakeitimo pavyzdžių. Nors sukimas yra labiausiai paplitęs, dėl visų konfigūracijos pakeitimų dabartinė veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja. Jei neatsižvelgsite į šią elgseną savo kode, pasikeitus konfigūracijai, veiklos išdėstymas gali grįžti į numatytąją išvaizdą ir pradines reikšmes, o naudotojai gali prarasti savo vietą, duomenis arba savo eigos būseną. jūsų programa.

Kiekvienos veiklos būsena saugoma kaip raktų/reikšmių porų rinkinys paketo objekte, vadinamame veiklos egzemplioriaus būsena. Sistema išsaugo numatytąją būsenos informaciją egzempliorių būsenos rinkinyje prieš pat veiklos sustabdymą ir perduoda tą rinkinį naujam veiklos egzemplioriui atkurti.

Kad neprarastumėte veiklos duomenų, kai ji netikėtai sunaikinama ir sukuriama iš naujo, turite įdiegti onSaveInstanceState() metodą. Sistema iškviečia šį metodą jūsų veikloje (tarp onPause() ir onStop()), kai yra galimybė, kad veikla gali būti sunaikinta ir sukurta iš naujo.

Duomenys, kuriuos išsaugote egzemplioriaus būsenoje, yra būdingi tik šiam šios konkrečios veiklos egzemplioriui per dabartinę programos seansą. Kai sustabdote ir iš naujo paleidžiate naujos programos seansą, veiklos egzemplioriaus būsena prarandama ir veikla grįžta į numatytąją išvaizdą. Jei tarp programos seansų reikia išsaugoti naudotojo duomenis, naudokite bendrinamas nuostatas arba duomenų bazę. Apie abu šiuos dalykus sužinosite vėliau.

2.1 Išsaugokite veiklos egzemplioriaus būseną naudodami onSaveInstanceState()

Galbūt pastebėjote, kad įrenginio pasukimas visiškai nepaveikia antrosios veiklos būsenos. Taip yra todėl, kad antrasis veiklos išdėstymas ir būsena generuojami iš išdėstymo ir jį suaktyvinusio ketinimo. Net jei veikla sukuriama iš naujo, tikslas vis dar yra ir to ketinimo duomenys vis tiek naudojami kiekvieną kartą, kai iškviečiamas antrosios veiklos metodas onCreate().

Be to, galite pastebėti, kad kiekvienoje veikloje bet koks tekstas, kurį įvedėte į pranešimo arba atsakymo EditText elementus, išsaugomas net sukant įrenginį. Taip yra todėl, kad kai kurių išdėstymo rodinio elementų būsenos informacija automatiškai išsaugoma keičiant konfigūraciją, o dabartinė EditText reikšmė yra vienas iš tų atvejų.

Taigi vienintelė jus dominanti veiklos būsena yra atsakymo antraštės TextView elementai ir atsakymo tekstas pagrindinėje veikloje. Abu TextView elementai pagal numatytuosius nustatymus yra nematomi; jie rodomi tik tada, kai iš antrosios veiklos išsiunčiate pranešimą atgal į pagrindinę veiklą.

Šioje užduotyje pridedate kodą, kad išsaugotumėte šių dviejų „TextView“ elementų egzempliorių būseną naudodami onSaveInstanceState().

  1. Atidarykite pagrindinę veiklą.
  2. Pridėkite šį onSaveInstanceState() skeleto įgyvendinimą prie veiklos arba naudokite Kodas > Nepaisymo metodai, kad įterptumėte skeleto nepaisymą.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Patikrinkite, ar antraštė šiuo metu matoma, ir jei taip, įtraukite šią matomumo būseną į būseną Bundle naudodami putBoolean() metodą ir raktą "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Atminkite, kad atsakymo antraštė ir tekstas yra pažymėti kaip nematomi, kol nebus atsakymo iš antrosios veiklos. Jei antraštė matoma, yra atsakymo duomenų, kuriuos reikia išsaugoti. Atminkite, kad mus domina tik ta matomumo būsena – tikrojo antraštės teksto įrašyti nereikia, nes tas tekstas niekada nesikeičia.

  1. Į tą patį čekį pridėkite atsakymo tekstą į rinkinį.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jei antraštė matoma, galite manyti, kad matomas ir pats atsakymo pranešimas. Jums nereikia tikrinti ar išsaugoti dabartinės atsakymo pranešimo matomumo būsenos. Tik tikrasis pranešimo tekstas patenka į būsenos paketą su raktu "reply_text".

Išsaugote tik tų rodinio elementų būseną, kurie gali pasikeisti sukūrus veiklą. Kiti programos rodinio elementai (redagavimo tekstas, mygtukas) gali būti bet kuriuo metu atkurti naudojant numatytąjį išdėstymą.

Atminkite, kad sistema išsaugos kai kurių rodinio elementų būseną, pvz., EditText turinį.

2.2 Atkurkite veiklos egzemplioriaus būseną onCreate()

Išsaugoję veiklos egzemplioriaus būseną, taip pat turėsite ją atkurti, kai veikla bus iš naujo sukurta. Tai galite padaryti naudodami onCreate() arba įdiegę onRestoreInstanceState() atgalinį iškvietimą, kuris iškviečiamas po onStart() sukūrus veiklą.

Daugeliu atvejų geresnė vieta veiklos būsenai atkurti yra onCreate(), siekiant užtikrinti, kad vartotojo sąsaja, įskaitant būseną, būtų pasiekiama kuo greičiau. Kartais patogu tai padaryti naudojant onRestoreInstanceState() atlikus visą inicijavimą arba leisti poklasiams nuspręsti, ar naudoti numatytąjį diegimą.

  1. Taikant onCreate() metodą, rodinio kintamieji inicijuojami naudojant findViewById(), pridėkite testą, kad įsitikintumėte, jog savedInstanceState nėra nulinis.
// 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) {
}

Kai sukuriama jūsų veikla, sistema perduoda būsenos rinkinį į onCreate() kaip vienintelį argumentą. Pirmą kartą iškvietus onCreate() ir paleidus programą, paketas yra niekinis – pirmą kartą paleidus programą nėra būsenos. Vėlesni iškvietimai į onCreate() turi rinkinį, užpildytą duomenimis, kuriuos saugojote onSaveInstanceState().

  1. Šiame patikrinime nustatykite esamą matomumą (teisingą arba klaidingą) iš paketo naudodami raktą „reply_visible“.
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Pridėkite testą po ankstesne kintamojo isVisible eilute.
if (isVisible) {
}

Jei būsenos rinkinyje yra raktas reply_visible (ir todėl isVisible yra tiesa), turėsite atkurti būseną.

  1. Testo „isVisible“ viduje padarykite matomą antraštę.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Gaukite atsakymo tekstinį pranešimą iš paketo naudodami raktą „reply_text“ ir nustatykite atsakymo teksto rodinį, kad būtų rodoma ši eilutė.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Padarykite atsakymą TextView matomą:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Paleiskite programą. Pabandykite pasukti įrenginį arba emuliatorių, kad užtikrintumėte, jog atsakymo pranešimas (jei toks yra) liktų ekrane po to, kai veikla bus iš naujo sukurta.

2 užduoties sprendimo kodas

Šie kodo fragmentai rodo šios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnSaveInstanceState() metodas:

@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());
   }
}

OnCreate() metodas:

@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);
       }
   }
}

Visas projektas:

Android Studio Project: TwoActivitiesLifecycle

5. Kodavimas

Iššūkis: sukurkite paprastą pirkinių sąrašo programą su pagrindine naudotojo kuriamo sąrašo veikla ir antrąja veikla, skirta įprastų pirkinių sąrašui.

  • Pagrindinėje veikloje turėtų būti sudarytas sąrašas, kurį turėtų sudaryti dešimt tuščių TextView elementų.
  • Pagrindinėje veikloje esantis mygtukas Pridėti prekę paleidžia antrąją veiklą, kurioje yra įprastų apsipirkimo prekių sąrašas (sūris, ryžiai, obuoliai ir pan.). Norėdami rodyti elementus, naudokite mygtukų elementus.
  • Pasirinkus elementą, vartotojas grąžinamas į pagrindinę veiklą ir atnaujinamas tuščias TextView, įtraukiant pasirinktą elementą.

Naudokite ketinimą perduoti informaciją iš vienos veiklos į kitą. Įsitikinkite, kad dabartinė pirkinių sąrašo būsena išsaugoma, kai vartotojas suka įrenginį.

6. Santrauka

  • Veiklos gyvavimo ciklas yra būsenų rinkinys, per kurį veikla perkeliama, pradedant nuo tada, kai ji pirmą kartą sukuriama, ir baigiant, kai „Android“ sistema atgauna tos veiklos išteklius.
  • Naudotojui naršant iš vienos veiklos į kitą, programoje ir už jos ribų, kiekviena veikla perkeliama iš vienos veiklos ciklo būsenos į kitą.
  • Kiekviena veiklos gyvavimo ciklo būsena turi atitinkamą atgalinio skambinimo metodą, kurį galite nepaisyti savo veiklos klasėje.
  • Veikimo ciklo metodai yra onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
  • Nepaisydami gyvavimo ciklo atgalinio iškvietimo metodo galite pridėti elgseną, kuri atsiranda, kai jūsų veikla pereina į tą būseną.
  • Galite pridėti skeleto nepaisymo metodus prie savo kursų „Android Studio“ naudodami Kodas > Nepaisyti.
  • Dėl įrenginio konfigūracijos pakeitimo, pvz., pasukimo, veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja.
  • Dalis veiklos būsenos išsaugoma pakeitus konfigūraciją, įskaitant dabartines EditText elementų reikšmes. Visiems kitiems duomenims turite patys aiškiai išsaugoti tuos duomenis.
  • Išsaugokite veiklos egzemplioriaus būseną onSaveInstanceState() metodu.
  • Egzempliorių būsenos duomenys saugomi kaip paprastos rakto/vertės poros rinkinyje. Naudokite Bundle metodus, kad įtrauktumėte duomenis į rinkinį ir gautumėte juos atgal.
  • Atkurkite egzemplioriaus būseną onCreate(), kuris yra pageidaujamas būdas, arba onRestoreInstanceState(). Atgal
,

1. Sveiki atvykę

Ši praktinė kodų laboratorija yra 1 skyriaus dalis: pradėkite mokytis „Android Developer Fundamentals“ (2 versija). Daugiausia naudos iš šio kurso gausite, jei kodų laboratorijas dirbsite iš eilės:

  • Visą kurso kodų laboratorijų sąrašą rasite „Android Developer Fundamentals“ (V2) „Codelabs“.
  • Norėdami gauti daugiau informacijos apie kursą, įskaitant nuorodas į visus koncepcijos skyrius, programas ir skaidres, žr. Android Developer Fundamentals (2 versija).

Įvadas

Šioje praktikoje sužinosite daugiau apie veiklos gyvavimo ciklą. Gyvavimo ciklas yra būsenų rinkinys, kuriame veikla gali būti per visą savo gyvavimo laiką, nuo jos sukūrimo iki jos sunaikinimo ir sistemos atgaunant išteklius. Naudotojui naršant tarp veiklos jūsų programoje (taip pat į programą ir iš jos), veikla perkeliama iš vienos būsenos į kitą savo gyvavimo ciklą.

Dviguba bėda

Kiekvienas veiklos gyvavimo ciklo etapas turi atitinkamą atgalinio ryšio metodą: onCreate(), onStart(), onPause() ir pan. Kai veikla pakeičia būseną, iškviečiamas susietas atgalinio skambinimo metodas. Jau matėte vieną iš šių metodų: onCreate(). Nepaisydami bet kurio gyvavimo ciklo atgalinio iškvietimo metodo savo veiklos klasėse, galite pakeisti numatytąją veiklos elgseną reaguodami į vartotojo arba sistemos veiksmus.

Veiklos būsena taip pat gali pasikeisti atsižvelgiant į įrenginio konfigūracijos pokyčius, pavyzdžiui, kai vartotojas pasuka įrenginį iš stačios į gulsčią. Kai įvyksta šie konfigūracijos pakeitimai, veikla sunaikinama ir atkuriama į numatytąją būseną, o vartotojas gali prarasti informaciją, kurią įvedė į veiklą. Kad nesupainiotumėte naudotojų, svarbu sukurti programą, kad išvengtumėte netikėto duomenų praradimo. Vėliau šioje praktikoje eksperimentuosite su konfigūracijos pakeitimais ir sužinosite, kaip išsaugoti veiklos būseną reaguojant į įrenginio konfigūracijos pakeitimus ir kitus veiklos ciklo įvykius.

Šioje praktikoje prie „TwoActivities“ programos pridedate registravimo teiginius ir stebite veiklos ciklo pokyčius, kai naudojate programą. Tada pradedate dirbti su šiais pakeitimais ir tyrinėjate, kaip tvarkyti vartotojo įvestį tokiomis sąlygomis.

Būtinos sąlygos

Turėtumėte sugebėti:

  • Kurkite ir paleiskite programos projektą „Android Studio“ .
  • Pridėkite žurnalo teiginius prie programos ir peržiūrėkite tuos žurnalus „Logcat“ srityje.
  • Supraskite ir dirbkite su veikla bei ketinimais ir jauskitės patogiai su jais bendraudami.

Ką išmoksite

  • Kaip veikia veiklos gyvavimo ciklas.
  • Kai veikla prasideda, ji pristabdoma, sustoja ir sunaikinama.
  • Apie gyvavimo ciklo atgalinio iškvietimo metodus, susijusius su veiklos pakeitimais.
  • Veiksmų (pvz., konfigūracijos pakeitimų), dėl kurių gali atsirasti veiklos ciklo įvykių, poveikis.
  • Kaip išlaikyti veiklos būseną viso gyvavimo ciklo įvykių metu.

Ką tu darysi

  • Pridėkite kodą prie programėlės TwoActivities iš ankstesnės praktikos, kad įgyvendintumėte įvairius veiklos gyvavimo ciklo atgalinius skambučius ir įtrauktumėte registravimo ataskaitas.
  • Stebėkite būsenos pokyčius, kai programa veikia ir kai sąveikaujate su kiekviena programos veikla.
  • Modifikuokite programą, kad išlaikytumėte veiklos, kuri netikėtai atkuriama reaguojant į naudotojo elgesį arba įrenginio konfigūracijos pakeitimą, egzemplioriaus būseną.

2. Programėlės apžvalga

Šioje praktikoje pridedate prie „TwoActivities“ programos. Programa atrodo ir veikia maždaug taip pat, kaip ir paskutinėje kodų laboratorijoje. Jame yra du veiklos diegimai ir vartotojui suteikiama galimybė siųsti tarp jų. Programos pakeitimai, kuriuos atliksite šioje praktikoje, neturės įtakos matomai naudotojų elgsenai.

3. 3. 1 užduotis: pridėkite gyvavimo ciklo atgalinius skambučius prie TwoActivities

Atlikdami šią užduotį įdiegsite visus veiklos gyvavimo ciklo atgalinio iškvietimo metodus, kad spausdintumėte pranešimus į logcat, kai šie metodai bus iškviesti. Šie žurnalo pranešimai leis jums pamatyti, kada pasikeičia veiklos ciklo būsena ir kaip tie gyvavimo ciklo būsenos pokyčiai paveikia jūsų programą, kai ji veikia.

1.1 (Pasirenkama) Nukopijuokite TwoActivities projektą

Atlikdami šios praktikos užduotis pakeisite esamą TwoActivities projektą, kurį sukūrėte paskutiniame praktikoje. Jei norite, kad ankstesnis „TwoActivities“ projektas nepaliestų, atlikite veiksmus, nurodytus Priede: Priemonės, kad padarytumėte projekto kopiją.

1.2 Įdiekite atgalinius skambučius į „MainActivity“.

  1. Atidarykite „TwoActivities“ projektą „Android Studio“ ir atidarykite „MainActivity“ srityje Project > Android.
  2. Metodu onCreate() pridėkite šiuos žurnalo teiginius:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Pridėkite onStart() atgalinio iškvietimo nepaisymą su teiginiu į to įvykio žurnalą:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Norėdami gauti nuorodą, „Android Studio“ pasirinkite Kodas > Nepaisyti metodų. Pasirodo dialogo langas su visais galimais metodais, kuriuos galite nepaisyti savo klasėje. Iš sąrašo pasirinkus vieną ar daugiau atgalinio iškvietimo metodų, įterpiamas visas tų metodų šablonas, įskaitant reikalingą superklasės iškvietimą.

  1. Naudokite onStart() metodą kaip šabloną, kad įgyvendintumėte onPause(), onRestart(), onResume(), onStop() ir onDestroy() gyvavimo ciklo atgalinius iškvietimus

Visi atgalinio skambinimo metodai turi tuos pačius parašus (išskyrus pavadinimą). Jei kopijuojate ir įklijuojate onStart(), kad sukurtumėte šiuos kitus atgalinio iškvietimo metodus, nepamirškite atnaujinti turinio, kad būtų iškviestas tinkamas metodas superklasėje, ir įrašyti teisingą metodą.

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis. Turėtumėte pamatyti tris žurnalo pranešimus, rodančius tris gyvavimo ciklo būsenas, per kurias veikla buvo perkelta, kai ji prasidėjo:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Įdiekite gyvavimo ciklo atgalinius skambučius „SecondActivity“.

Dabar, kai įdiegėte „MainActivity“ gyvavimo ciklo atgalinio iškvietimo metodus, atlikite tą patį „SecondActivity“.

  1. Atidarykite „SecondActivity“.
  2. Klasės viršuje pridėkite kintamojo LOG_TAG konstantą:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Pridėkite gyvavimo ciklo atgalinius skambučius ir žurnalo ataskaitas prie antrosios veiklos. (Galite nukopijuoti ir įklijuoti atgalinio skambinimo metodus iš „MainActivity“.)
  2. Pridėkite žurnalo teiginį prie returnReply() metodo prieš pat finišo() metodą:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Stebėkite žurnalą, kai programa veikia**

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis.
  3. Paieškos laukelyje įveskite Veikla. Android logcat gali būti labai ilgas ir netvarkingas. Kadangi kiekvienos klasės kintamajame LOG_TAG yra žodžiai MainActivity arba SecondActivity, šis raktinis žodis leidžia filtruoti žurnalą tik pagal jus dominančius dalykus.

Dviguba bėda

Eksperimentuokite naudodami programą ir atkreipkite dėmesį į gyvavimo ciklo įvykius, kurie įvyksta reaguojant į skirtingus veiksmus. Visų pirma išbandykite šiuos dalykus:

  • Naudokitės programėle įprastai (siųskite žinutę, atsakykite kita žinute).
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite mygtuką Atgal.
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite programos juostoje esančią rodyklę aukštyn.
  • Skirtingu programos metu pasukite įrenginį pagrindinėje ir antrojoje veikloje ir stebėkite, kas vyksta * žurnale ir ekrane.
  • Paspauskite apžvalgos mygtuką (kvadratinis mygtukas pagrindinio puslapio dešinėje) ir uždarykite programą (palieskite X).
  • Grįžkite į pagrindinį ekraną ir iš naujo paleiskite programą.

PATARIMAS: jei naudojate programą emuliatoriuje, sukimąsi galite imituoti paspausdami „Control+F11“ arba „Control+Function+F11“.

1 užduoties sprendimo kodas

Šie kodo fragmentai rodo pirmosios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnCreate() metodas:

@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);
}

Kiti gyvavimo ciklo metodai:

@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");
}

Antroji veikla

Šie kodo fragmentai rodo pridėtą „SecondActivity“ kodą, bet ne visą klasę.

„SecondActivity“ klasės viršuje:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

„ReturnReply()“ metodas:

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();
}

Kiti gyvavimo ciklo metodai:

Tas pats, kas aukščiau esanti „MainActivity“.

4. 4. 2 užduotis: Išsaugokite ir atkurkite veiklos egzemplioriaus būseną

Atsižvelgiant į sistemos išteklius ir naudotojų elgseną, kiekviena jūsų programos veikla gali būti sunaikinta ir rekonstruota daug dažniau, nei manote.

Galbūt pastebėjote šį elgesį paskutiniame skyriuje, kai pasukote įrenginį arba emuliatorių. Įrenginio pasukimas yra vienas iš įrenginio konfigūracijos pakeitimo pavyzdžių. Nors sukimas yra labiausiai paplitęs, dėl visų konfigūracijos pakeitimų dabartinė veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja. Jei neatsižvelgsite į šią elgseną savo kode, pasikeitus konfigūracijai, veiklos išdėstymas gali grįžti į numatytąją išvaizdą ir pradines reikšmes, o naudotojai gali prarasti savo vietą, duomenis arba savo eigos būseną. jūsų programa.

Kiekvienos veiklos būsena saugoma kaip raktų/reikšmių porų rinkinys paketo objekte, vadinamame veiklos egzemplioriaus būsena. Sistema išsaugo numatytąją būsenos informaciją egzempliorių būsenos rinkinyje prieš pat veiklos sustabdymą ir perduoda tą rinkinį naujam veiklos egzemplioriui atkurti.

Kad neprarastumėte veiklos duomenų, kai ji netikėtai sunaikinama ir sukuriama iš naujo, turite įdiegti onSaveInstanceState() metodą. Sistema iškviečia šį metodą jūsų veikloje (tarp onPause() ir onStop()), kai yra galimybė, kad veikla gali būti sunaikinta ir sukurta iš naujo.

Duomenys, kuriuos išsaugote egzemplioriaus būsenoje, yra būdingi tik šiam šios konkrečios veiklos egzemplioriui per dabartinę programos seansą. Kai sustabdote ir iš naujo paleidžiate naujos programos seansą, veiklos egzemplioriaus būsena prarandama ir veikla grįžta į numatytąją išvaizdą. Jei tarp programos seansų reikia išsaugoti naudotojo duomenis, naudokite bendrinamas nuostatas arba duomenų bazę. Apie abu šiuos dalykus sužinosite vėliau.

2.1 Išsaugokite veiklos egzemplioriaus būseną naudodami onSaveInstanceState()

Galbūt pastebėjote, kad įrenginio pasukimas visiškai nepaveikia antrosios veiklos būsenos. Taip yra todėl, kad antrasis veiklos išdėstymas ir būsena generuojami iš išdėstymo ir jį suaktyvinusio ketinimo. Net jei veikla sukuriama iš naujo, tikslas vis dar yra ir to ketinimo duomenys vis tiek naudojami kiekvieną kartą, kai iškviečiamas antrosios veiklos metodas onCreate().

Be to, galite pastebėti, kad kiekvienoje veikloje bet koks tekstas, kurį įvedėte į pranešimo arba atsakymo EditText elementus, išsaugomas net sukant įrenginį. Taip yra todėl, kad kai kurių išdėstymo rodinio elementų būsenos informacija automatiškai išsaugoma keičiant konfigūraciją, o dabartinė EditText reikšmė yra vienas iš tų atvejų.

Taigi vienintelė jus dominanti veiklos būsena yra atsakymo antraštės TextView elementai ir atsakymo tekstas pagrindinėje veikloje. Abu TextView elementai pagal numatytuosius nustatymus yra nematomi; jie rodomi tik tada, kai iš antrosios veiklos išsiunčiate pranešimą atgal į pagrindinę veiklą.

Šioje užduotyje pridedate kodą, kad išsaugotumėte šių dviejų „TextView“ elementų egzempliorių būseną naudodami onSaveInstanceState().

  1. Atidarykite pagrindinę veiklą.
  2. Pridėkite šį onSaveInstanceState() skeleto įgyvendinimą prie veiklos arba naudokite Kodas > Nepaisymo metodai, kad įterptumėte skeleto nepaisymą.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Patikrinkite, ar antraštė šiuo metu matoma, ir jei taip, įtraukite šią matomumo būseną į būseną Bundle naudodami putBoolean() metodą ir raktą "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Atminkite, kad atsakymo antraštė ir tekstas yra pažymėti kaip nematomi, kol nebus atsakymo iš antrosios veiklos. Jei antraštė matoma, yra atsakymo duomenų, kuriuos reikia išsaugoti. Atminkite, kad mus domina tik ta matomumo būsena – tikrojo antraštės teksto įrašyti nereikia, nes tas tekstas niekada nesikeičia.

  1. Į tą patį čekį pridėkite atsakymo tekstą į rinkinį.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jei antraštė matoma, galite manyti, kad matomas ir pats atsakymo pranešimas. Jums nereikia tikrinti ar išsaugoti dabartinės atsakymo pranešimo matomumo būsenos. Tik tikrasis pranešimo tekstas patenka į būsenos paketą su raktu "reply_text".

Išsaugote tik tų rodinio elementų būseną, kurie gali pasikeisti sukūrus veiklą. Kiti programos rodinio elementai (redagavimo tekstas, mygtukas) gali būti bet kuriuo metu atkurti naudojant numatytąjį išdėstymą.

Atminkite, kad sistema išsaugos kai kurių rodinio elementų būseną, pvz., EditText turinį.

2.2 Atkurkite veiklos egzemplioriaus būseną onCreate()

Išsaugoję veiklos egzemplioriaus būseną, taip pat turėsite ją atkurti, kai veikla bus iš naujo sukurta. Tai galite padaryti naudodami onCreate() arba įdiegę onRestoreInstanceState() atgalinį iškvietimą, kuris iškviečiamas po onStart() sukūrus veiklą.

Daugeliu atvejų geresnė vieta veiklos būsenai atkurti yra onCreate(), siekiant užtikrinti, kad vartotojo sąsaja, įskaitant būseną, būtų pasiekiama kuo greičiau. Kartais patogu tai padaryti naudojant onRestoreInstanceState() atlikus visą inicijavimą arba leisti poklasiams nuspręsti, ar naudoti numatytąjį diegimą.

  1. Taikant onCreate() metodą, rodinio kintamieji inicijuojami naudojant findViewById(), pridėkite testą, kad įsitikintumėte, jog savedInstanceState nėra nulinis.
// 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) {
}

Kai sukuriama jūsų veikla, sistema perduoda būsenos rinkinį į onCreate() kaip vienintelį argumentą. Pirmą kartą iškvietus onCreate() ir paleidus programą, paketas yra niekinis – pirmą kartą paleidus programą nėra būsenos. Vėlesni iškvietimai į onCreate() turi rinkinį, užpildytą duomenimis, kuriuos saugojote onSaveInstanceState().

  1. Šiame patikrinime nustatykite esamą matomumą (teisingą arba klaidingą) iš paketo naudodami raktą „reply_visible“.
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Pridėkite testą po ankstesne kintamojo isVisible eilute.
if (isVisible) {
}

Jei būsenos rinkinyje yra raktas reply_visible (ir todėl isVisible yra tiesa), turėsite atkurti būseną.

  1. Testo „isVisible“ viduje padarykite matomą antraštę.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Gaukite atsakymo tekstinį pranešimą iš paketo naudodami raktą „reply_text“ ir nustatykite atsakymo teksto rodinį, kad būtų rodoma ši eilutė.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Padarykite atsakymą TextView matomą:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Paleiskite programą. Pabandykite pasukti įrenginį arba emuliatorių, kad užtikrintumėte, jog atsakymo pranešimas (jei toks yra) liktų ekrane po to, kai veikla bus iš naujo sukurta.

2 užduoties sprendimo kodas

Šie kodo fragmentai rodo šios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnSaveInstanceState() metodas:

@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());
   }
}

OnCreate() metodas:

@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);
       }
   }
}

Visas projektas:

Android Studio Project: TwoActivitiesLifecycle

5. Kodavimas

Iššūkis: sukurkite paprastą pirkinių sąrašo programą su pagrindine naudotojo kuriamo sąrašo veikla ir antrąja veikla, skirta įprastų pirkinių sąrašui.

  • Pagrindinėje veikloje turėtų būti sudarytas sąrašas, kurį turėtų sudaryti dešimt tuščių TextView elementų.
  • Pagrindinėje veikloje esantis mygtukas Pridėti prekę paleidžia antrąją veiklą, kurioje yra įprastų apsipirkimo prekių sąrašas (sūris, ryžiai, obuoliai ir pan.). Norėdami rodyti elementus, naudokite mygtukų elementus.
  • Pasirinkus elementą, vartotojas grąžinamas į pagrindinę veiklą ir atnaujinamas tuščias TextView, įtraukiant pasirinktą elementą.

Naudokite ketinimą perduoti informaciją iš vienos veiklos į kitą. Įsitikinkite, kad dabartinė pirkinių sąrašo būsena išsaugoma, kai vartotojas suka įrenginį.

6. Santrauka

  • Veiklos gyvavimo ciklas yra būsenų rinkinys, per kurį veikla perkeliama, pradedant nuo tada, kai ji pirmą kartą sukuriama, ir baigiant, kai „Android“ sistema atgauna tos veiklos išteklius.
  • Naudotojui naršant iš vienos veiklos į kitą, programoje ir už jos ribų, kiekviena veikla perkeliama iš vienos veiklos ciklo būsenos į kitą.
  • Kiekviena veiklos gyvavimo ciklo būsena turi atitinkamą atgalinio skambinimo metodą, kurį galite nepaisyti savo veiklos klasėje.
  • Veikimo ciklo metodai yra onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
  • Nepaisydami gyvavimo ciklo atgalinio iškvietimo metodo galite pridėti elgseną, kuri atsiranda, kai jūsų veikla pereina į tą būseną.
  • Galite pridėti skeleto nepaisymo metodus prie savo kursų „Android Studio“ naudodami Kodas > Nepaisyti.
  • Dėl įrenginio konfigūracijos pakeitimo, pvz., pasukimo, veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja.
  • Dalis veiklos būsenos išsaugoma pakeitus konfigūraciją, įskaitant dabartines EditText elementų reikšmes. Visiems kitiems duomenims turite patys aiškiai išsaugoti tuos duomenis.
  • Išsaugokite veiklos egzemplioriaus būseną onSaveInstanceState() metodu.
  • Egzempliorių būsenos duomenys saugomi kaip paprastos rakto/vertės poros rinkinyje. Naudokite Bundle metodus, kad įtrauktumėte duomenis į rinkinį ir gautumėte juos atgal.
  • Atkurkite egzemplioriaus būseną onCreate(), kuris yra pageidaujamas būdas, arba onRestoreInstanceState(). Atgal
,

1. Sveiki atvykę

Ši praktinė kodų laboratorija yra 1 skyriaus dalis: pradėkite mokytis „Android Developer Fundamentals“ (2 versija). Daugiausia naudos iš šio kurso gausite, jei kodų laboratorijas dirbsite iš eilės:

  • Visą kurso kodų laboratorijų sąrašą rasite „Android Developer Fundamentals“ (V2) „Codelabs“.
  • Norėdami gauti daugiau informacijos apie kursą, įskaitant nuorodas į visus koncepcijos skyrius, programas ir skaidres, žr. Android Developer Fundamentals (2 versija).

Įvadas

Šioje praktikoje sužinosite daugiau apie veiklos gyvavimo ciklą. Gyvavimo ciklas yra būsenų rinkinys, kuriame veikla gali būti per visą savo gyvavimo laiką, nuo jos sukūrimo iki jos sunaikinimo ir sistemos atgaunant išteklius. Naudotojui naršant tarp veiklos jūsų programoje (taip pat į programą ir iš jos), veikla perkeliama iš vienos būsenos į kitą savo gyvavimo ciklą.

Dviguba bėda

Kiekvienas veiklos gyvavimo ciklo etapas turi atitinkamą atgalinio ryšio metodą: onCreate(), onStart(), onPause() ir pan. Kai veikla pakeičia būseną, iškviečiamas susietas atgalinio skambinimo metodas. Jau matėte vieną iš šių metodų: onCreate(). Nepaisydami bet kurio gyvavimo ciklo atgalinio iškvietimo metodo savo veiklos klasėse, galite pakeisti numatytąją veiklos elgseną reaguodami į vartotojo arba sistemos veiksmus.

Veiklos būsena taip pat gali pasikeisti atsižvelgiant į įrenginio konfigūracijos pokyčius, pavyzdžiui, kai vartotojas pasuka įrenginį iš stačios į gulsčią. Kai įvyksta šie konfigūracijos pakeitimai, veikla sunaikinama ir atkuriama į numatytąją būseną, o vartotojas gali prarasti informaciją, kurią įvedė į veiklą. Kad nesupainiotumėte naudotojų, svarbu sukurti programą, kad išvengtumėte netikėto duomenų praradimo. Vėliau šioje praktikoje eksperimentuosite su konfigūracijos pakeitimais ir sužinosite, kaip išsaugoti veiklos būseną reaguojant į įrenginio konfigūracijos pakeitimus ir kitus veiklos ciklo įvykius.

Šioje praktikoje prie „TwoActivities“ programos pridedate registravimo teiginius ir stebite veiklos ciklo pokyčius, kai naudojate programą. Tada pradedate dirbti su šiais pakeitimais ir tyrinėjate, kaip tvarkyti vartotojo įvestį tokiomis sąlygomis.

Būtinos sąlygos

Turėtumėte sugebėti:

  • Kurkite ir paleiskite programos projektą „Android Studio“ .
  • Pridėkite žurnalo teiginius prie programos ir peržiūrėkite tuos žurnalus „Logcat“ srityje.
  • Supraskite ir dirbkite su veikla bei ketinimais ir jauskitės patogiai su jais bendraudami.

Ką išmoksite

  • Kaip veikia veiklos gyvavimo ciklas.
  • Kai veikla prasideda, ji pristabdoma, sustoja ir sunaikinama.
  • Apie gyvavimo ciklo atgalinio iškvietimo metodus, susijusius su veiklos pakeitimais.
  • Veiksmų (pvz., konfigūracijos pakeitimų), dėl kurių gali atsirasti veiklos ciklo įvykių, poveikis.
  • Kaip išlaikyti veiklos būseną viso gyvavimo ciklo įvykių metu.

Ką tu darysi

  • Pridėkite kodą prie programėlės TwoActivities iš ankstesnės praktikos, kad įgyvendintumėte įvairius veiklos gyvavimo ciklo atgalinius skambučius ir įtrauktumėte registravimo ataskaitas.
  • Stebėkite būsenos pokyčius, kai programa veikia ir kai sąveikaujate su kiekviena programos veikla.
  • Modifikuokite programą, kad išlaikytumėte veiklos, kuri netikėtai atkuriama reaguojant į naudotojo elgesį arba įrenginio konfigūracijos pakeitimą, egzemplioriaus būseną.

2. Programėlės apžvalga

Šioje praktikoje pridedate prie „TwoActivities“ programos. Programa atrodo ir veikia maždaug taip pat, kaip ir paskutinėje kodų laboratorijoje. Jame yra du veiklos diegimai ir vartotojui suteikiama galimybė siųsti tarp jų. Programos pakeitimai, kuriuos atliksite šioje praktikoje, neturės įtakos matomai naudotojų elgsenai.

3. 3. 1 užduotis: pridėkite gyvavimo ciklo atgalinius skambučius prie TwoActivities

Atlikdami šią užduotį įdiegsite visus veiklos gyvavimo ciklo atgalinio iškvietimo metodus, kad spausdintumėte pranešimus į logcat, kai šie metodai bus iškviesti. Šie žurnalo pranešimai leis jums pamatyti, kada pasikeičia veiklos ciklo būsena ir kaip tie gyvavimo ciklo būsenos pokyčiai paveikia jūsų programą, kai ji veikia.

1.1 (Pasirenkama) Nukopijuokite TwoActivities projektą

Atlikdami šios praktikos užduotis pakeisite esamą TwoActivities projektą, kurį sukūrėte paskutiniame praktikoje. Jei norite, kad ankstesnis „TwoActivities“ projektas nepaliestų, atlikite veiksmus, nurodytus Priede: Priemonės, kad padarytumėte projekto kopiją.

1.2 Įdiekite atgalinius skambučius į „MainActivity“.

  1. Atidarykite „TwoActivities“ projektą „Android Studio“ ir atidarykite „MainActivity“ srityje Project > Android.
  2. Metodu onCreate() pridėkite šiuos žurnalo teiginius:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Pridėkite onStart() atgalinio iškvietimo nepaisymą su teiginiu į to įvykio žurnalą:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Norėdami gauti nuorodą, „Android Studio“ pasirinkite Kodas > Nepaisyti metodų. Pasirodo dialogo langas su visais galimais metodais, kuriuos galite nepaisyti savo klasėje. Iš sąrašo pasirinkus vieną ar daugiau atgalinio iškvietimo metodų, įterpiamas visas tų metodų šablonas, įskaitant reikalingą superklasės iškvietimą.

  1. Naudokite onStart() metodą kaip šabloną, kad įgyvendintumėte onPause(), onRestart(), onResume(), onStop() ir onDestroy() gyvavimo ciklo atgalinius iškvietimus

Visi atgalinio skambinimo metodai turi tuos pačius parašus (išskyrus pavadinimą). Jei kopijuojate ir įklijuojate onStart(), kad sukurtumėte šiuos kitus atgalinio iškvietimo metodus, nepamirškite atnaujinti turinio, kad būtų iškviestas tinkamas metodas superklasėje, ir įrašyti teisingą metodą.

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis. Turėtumėte pamatyti tris žurnalo pranešimus, rodančius tris gyvavimo ciklo būsenas, per kurias veikla buvo perkelta, kai ji prasidėjo:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Įdiekite gyvavimo ciklo atgalinius skambučius „SecondActivity“.

Dabar, kai įdiegėte „MainActivity“ gyvavimo ciklo atgalinio iškvietimo metodus, atlikite tą patį „SecondActivity“.

  1. Atidarykite „SecondActivity“.
  2. Klasės viršuje pridėkite kintamojo LOG_TAG konstantą:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Pridėkite gyvavimo ciklo atgalinius skambučius ir žurnalo ataskaitas prie antrosios veiklos. (Galite nukopijuoti ir įklijuoti atgalinio skambinimo metodus iš „MainActivity“.)
  2. Pridėkite žurnalo teiginį prie returnReply() metodo prieš pat finišo() metodą:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Stebėkite žurnalą, kai programa veikia**

  1. Paleiskite programą.
  2. Spustelėkite „Android Studio“ apačioje esantį skirtuką „Logcat“, kad būtų rodoma „Logcat“ sritis.
  3. Paieškos laukelyje įveskite Veikla. Android logcat gali būti labai ilgas ir netvarkingas. Kadangi kiekvienos klasės kintamajame LOG_TAG yra žodžiai MainActivity arba SecondActivity, šis raktinis žodis leidžia filtruoti žurnalą tik pagal jus dominančius dalykus.

Dviguba bėda

Eksperimentuokite naudodami programą ir atkreipkite dėmesį į gyvavimo ciklo įvykius, kurie įvyksta reaguojant į skirtingus veiksmus. Visų pirma išbandykite šiuos dalykus:

  • Naudokitės programėle įprastai (siųskite žinutę, atsakykite kita žinute).
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite mygtuką Atgal.
  • Norėdami grįžti iš antrosios veiklos į pagrindinę veiklą, naudokite programos juostoje esančią rodyklę aukštyn.
  • Skirtingu programos metu pasukite įrenginį pagrindinėje ir antrojoje veikloje ir stebėkite, kas vyksta * žurnale ir ekrane.
  • Paspauskite apžvalgos mygtuką (kvadratinis mygtukas pagrindinio puslapio dešinėje) ir uždarykite programą (palieskite X).
  • Grįžkite į pagrindinį ekraną ir iš naujo paleiskite programą.

PATARIMAS: jei naudojate programą emuliatoriuje, sukimąsi galite imituoti paspausdami „Control+F11“ arba „Control+Function+F11“.

1 užduoties sprendimo kodas

Šie kodo fragmentai rodo pirmosios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnCreate() metodas:

@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);
}

Kiti gyvavimo ciklo metodai:

@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");
}

Antroji veikla

Šie kodo fragmentai rodo pridėtą „SecondActivity“ kodą, bet ne visą klasę.

„SecondActivity“ klasės viršuje:

private static final String LOG_TAG = SecondActivity.class.getSimpleName();

„ReturnReply()“ metodas:

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();
}

Kiti gyvavimo ciklo metodai:

Tas pats, kas aukščiau esanti „MainActivity“.

4. 4. 2 užduotis: Išsaugokite ir atkurkite veiklos egzemplioriaus būseną

Atsižvelgiant į sistemos išteklius ir naudotojų elgseną, kiekviena jūsų programos veikla gali būti sunaikinta ir rekonstruota daug dažniau, nei manote.

Galbūt pastebėjote šį elgesį paskutiniame skyriuje, kai pasukote įrenginį arba emuliatorių. Įrenginio pasukimas yra vienas iš įrenginio konfigūracijos pakeitimo pavyzdžių. Nors sukimas yra labiausiai paplitęs, dėl visų konfigūracijos pakeitimų dabartinė veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja. Jei neatsižvelgsite į šią elgseną savo kode, pasikeitus konfigūracijai, veiklos išdėstymas gali grįžti į numatytąją išvaizdą ir pradines reikšmes, o naudotojai gali prarasti savo vietą, duomenis arba savo eigos būseną. jūsų programa.

Kiekvienos veiklos būsena saugoma kaip raktų/reikšmių porų rinkinys paketo objekte, vadinamame veiklos egzemplioriaus būsena. Sistema išsaugo numatytąją būsenos informaciją egzempliorių būsenos rinkinyje prieš pat veiklos sustabdymą ir perduoda tą rinkinį naujam veiklos egzemplioriui atkurti.

Kad neprarastumėte veiklos duomenų, kai ji netikėtai sunaikinama ir sukuriama iš naujo, turite įdiegti onSaveInstanceState() metodą. Sistema iškviečia šį metodą jūsų veikloje (tarp onPause() ir onStop()), kai yra galimybė, kad veikla gali būti sunaikinta ir sukurta iš naujo.

Duomenys, kuriuos išsaugote egzemplioriaus būsenoje, yra būdingi tik šiam šios konkrečios veiklos egzemplioriui per dabartinę programos seansą. Kai sustabdote ir iš naujo paleidžiate naujos programos seansą, veiklos egzemplioriaus būsena prarandama ir veikla grįžta į numatytąją išvaizdą. Jei tarp programos seansų reikia išsaugoti naudotojo duomenis, naudokite bendrinamas nuostatas arba duomenų bazę. Apie abu šiuos dalykus sužinosite vėliau.

2.1 Išsaugokite veiklos egzemplioriaus būseną naudodami onSaveInstanceState()

Galbūt pastebėjote, kad įrenginio pasukimas visiškai nepaveikia antrosios veiklos būsenos. Taip yra todėl, kad antrasis veiklos išdėstymas ir būsena generuojami iš išdėstymo ir jį suaktyvinusio ketinimo. Net jei veikla sukuriama iš naujo, tikslas vis dar yra ir to ketinimo duomenys vis tiek naudojami kiekvieną kartą, kai iškviečiamas antrosios veiklos metodas onCreate().

Be to, galite pastebėti, kad kiekvienoje veikloje bet koks tekstas, kurį įvedėte į pranešimo arba atsakymo EditText elementus, išsaugomas net sukant įrenginį. Taip yra todėl, kad kai kurių išdėstymo rodinio elementų būsenos informacija automatiškai išsaugoma keičiant konfigūraciją, o dabartinė EditText reikšmė yra vienas iš tų atvejų.

Taigi vienintelė jus dominanti veiklos būsena yra atsakymo antraštės TextView elementai ir atsakymo tekstas pagrindinėje veikloje. Abu TextView elementai pagal numatytuosius nustatymus yra nematomi; jie rodomi tik tada, kai iš antrosios veiklos išsiunčiate pranešimą atgal į pagrindinę veiklą.

Šioje užduotyje pridedate kodą, kad išsaugotumėte šių dviejų „TextView“ elementų egzempliorių būseną naudodami onSaveInstanceState().

  1. Atidarykite pagrindinę veiklą.
  2. Pridėkite šį onSaveInstanceState() skeleto įgyvendinimą prie veiklos arba naudokite Kodas > Nepaisymo metodai, kad įterptumėte skeleto nepaisymą.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Patikrinkite, ar antraštė šiuo metu matoma, ir jei taip, įtraukite šią matomumo būseną į būseną Bundle naudodami putBoolean() metodą ir raktą "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Atminkite, kad atsakymo antraštė ir tekstas yra pažymėti kaip nematomi, kol nebus atsakymo iš antrosios veiklos. Jei antraštė matoma, yra atsakymo duomenų, kuriuos reikia išsaugoti. Atminkite, kad mus domina tik ta matomumo būsena – tikrojo antraštės teksto įrašyti nereikia, nes tas tekstas niekada nesikeičia.

  1. Į tą patį čekį pridėkite atsakymo tekstą į rinkinį.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jei antraštė matoma, galite manyti, kad matomas ir pats atsakymo pranešimas. Jums nereikia tikrinti ar išsaugoti dabartinės atsakymo pranešimo matomumo būsenos. Tik tikrasis pranešimo tekstas patenka į būsenos paketą su raktu "reply_text".

Išsaugote tik tų rodinio elementų būseną, kurie gali pasikeisti sukūrus veiklą. Kiti programos rodinio elementai (redagavimo tekstas, mygtukas) gali būti bet kuriuo metu atkurti naudojant numatytąjį išdėstymą.

Atminkite, kad sistema išsaugos kai kurių rodinio elementų būseną, pvz., EditText turinį.

2.2 Atkurkite veiklos egzemplioriaus būseną onCreate()

Išsaugoję veiklos egzemplioriaus būseną, taip pat turėsite ją atkurti, kai veikla bus iš naujo sukurta. Tai galite padaryti naudodami onCreate() arba įdiegę onRestoreInstanceState() atgalinį iškvietimą, kuris iškviečiamas po onStart() sukūrus veiklą.

Daugeliu atvejų geresnė vieta veiklos būsenai atkurti yra onCreate(), siekiant užtikrinti, kad vartotojo sąsaja, įskaitant būseną, būtų pasiekiama kuo greičiau. Kartais patogu tai padaryti naudojant onRestoreInstanceState() atlikus visą inicijavimą arba leisti poklasiams nuspręsti, ar naudoti numatytąjį diegimą.

  1. Taikant onCreate() metodą, rodinio kintamieji inicijuojami naudojant findViewById(), pridėkite testą, kad įsitikintumėte, jog savedInstanceState nėra nulinis.
// 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) {
}

Kai sukuriama jūsų veikla, sistema perduoda būsenos rinkinį į onCreate() kaip vienintelį argumentą. Pirmą kartą iškvietus onCreate() ir paleidus programą, paketas yra niekinis – pirmą kartą paleidus programą nėra būsenos. Vėlesni iškvietimai į onCreate() turi rinkinį, užpildytą duomenimis, kuriuos saugojote onSaveInstanceState().

  1. Šiame patikrinime nustatykite esamą matomumą (teisingą arba klaidingą) iš paketo naudodami raktą „reply_visible“.
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Pridėkite testą po ankstesne kintamojo isVisible eilute.
if (isVisible) {
}

Jei būsenos rinkinyje yra raktas reply_visible (ir todėl isVisible yra tiesa), turėsite atkurti būseną.

  1. Testo „isVisible“ viduje padarykite matomą antraštę.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Gaukite atsakymo tekstinį pranešimą iš paketo naudodami raktą „reply_text“ ir nustatykite atsakymo teksto rodinį, kad būtų rodoma ši eilutė.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Padarykite atsakymą TextView matomą:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Paleiskite programą. Pabandykite pasukti įrenginį arba emuliatorių, kad užtikrintumėte, jog atsakymo pranešimas (jei toks yra) liktų ekrane po to, kai veikla bus iš naujo sukurta.

2 užduoties sprendimo kodas

Šie kodo fragmentai rodo šios užduoties sprendimo kodą.

Pagrindinė veikla

Šie kodo fragmentai rodo pridėtą „MainActivity“ kodą, bet ne visą klasę.

OnSaveInstanceState() metodas:

@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());
   }
}

OnCreate() metodas:

@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);
       }
   }
}

Visas projektas:

Android Studio Project: TwoActivitiesLifecycle

5. Kodavimas

Iššūkis: sukurkite paprastą pirkinių sąrašo programą su pagrindine naudotojo kuriamo sąrašo veikla ir antrąja veikla, skirta įprastų pirkinių sąrašui.

  • Pagrindinėje veikloje turėtų būti sudarytas sąrašas, kurį turėtų sudaryti dešimt tuščių TextView elementų.
  • Pagrindinėje veikloje esantis mygtukas Pridėti prekę paleidžia antrąją veiklą, kurioje yra įprastų apsipirkimo prekių sąrašas (sūris, ryžiai, obuoliai ir pan.). Norėdami rodyti elementus, naudokite mygtukų elementus.
  • Pasirinkus elementą, vartotojas grąžinamas į pagrindinę veiklą ir atnaujinamas tuščias TextView, įtraukiant pasirinktą elementą.

Naudokite ketinimą perduoti informaciją iš vienos veiklos į kitą. Įsitikinkite, kad dabartinė pirkinių sąrašo būsena išsaugoma, kai vartotojas suka įrenginį.

6. Santrauka

  • Veiklos gyvavimo ciklas yra būsenų rinkinys, per kurį veikla perkeliama, pradedant nuo tada, kai ji pirmą kartą sukuriama, ir baigiant, kai „Android“ sistema atgauna tos veiklos išteklius.
  • Naudotojui naršant iš vienos veiklos į kitą, programoje ir už jos ribų, kiekviena veikla perkeliama iš vienos veiklos ciklo būsenos į kitą.
  • Kiekviena veiklos gyvavimo ciklo būsena turi atitinkamą atgalinio skambinimo metodą, kurį galite nepaisyti savo veiklos klasėje.
  • Veikimo ciklo metodai yra onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
  • Nepaisydami gyvavimo ciklo atgalinio iškvietimo metodo galite pridėti elgseną, kuri atsiranda, kai jūsų veikla pereina į tą būseną.
  • Galite pridėti skeleto nepaisymo metodus prie savo kursų „Android Studio“ naudodami Kodas > Nepaisyti.
  • Dėl įrenginio konfigūracijos pakeitimo, pvz., pasukimo, veikla sunaikinama ir atkuriama taip, lyg ji būtų nauja.
  • Dalis veiklos būsenos išsaugoma pakeitus konfigūraciją, įskaitant dabartines EditText elementų reikšmes. Visiems kitiems duomenims turite patys aiškiai išsaugoti tuos duomenis.
  • Išsaugokite veiklos egzemplioriaus būseną onSaveInstanceState() metodu.
  • Egzempliorių būsenos duomenys saugomi kaip paprastos rakto/vertės poros rinkinyje. Naudokite Bundle metodus, kad įtrauktumėte duomenis į rinkinį ir gautumėte juos atgal.
  • Atkurkite egzemplioriaus būseną onCreate(), kuris yra pageidaujamas būdas, arba onRestoreInstanceState(). Atgal