Aktiviteetin elinkaaren ja tilan käyttäminen

1. Tervetuloa

Tämä käytännöllinen koodilaboratorio on osa Unit 1: Aloita Android Developer Fundamentals (Version 2) -kurssilla. Saat eniten hyötyä tästä kurssista, jos käytät koodilaboratorioita järjestyksessä:

  • Täydellinen luettelo kurssin koodilaboista on kohdassa Codelabs for Android Developer Fundamentals (V2).
  • Lisätietoja kurssista, mukaan lukien linkit kaikkiin konseptilukuihin, sovelluksiin ja dioihin, on kohdassa Android Developer Fundamentals (versio 2).

Johdanto

Tässä harjoituksessa opit lisää toiminnan elinkaaresta. Elinkaari on joukko tiloja, joissa aktiviteetti voi olla koko elinkaarensa ajan, sen luomisesta siihen, kun se tuhoutuu ja järjestelmä ottaa resurssejaan takaisin. Kun käyttäjä liikkuu sovelluksesi toimintojen välillä (sekä sovellukseesi sisään ja sieltä pois), toiminnot siirtyvät elinkaarensa aikana eri tiloista toiseen.

Kaksinkertainen ongelma

Jokaisella aktiviteetin elinkaaren vaiheella on vastaava takaisinkutsumenetelmä: onCreate(), onStart(), onPause() ja niin edelleen. Kun aktiviteetti muuttaa tilaa, siihen liittyvä takaisinsoittomenetelmä kutsutaan. Olet jo nähnyt yhden seuraavista tavoista: onCreate(). Ohitamalla minkä tahansa elinkaarikutsun toimintoluokissasi, voit muuttaa aktiviteetin oletuskäyttäytymistä vastauksena käyttäjän tai järjestelmän toimiin.

Aktiivisuustila voi myös muuttua laitteen konfiguraatiomuutosten seurauksena, esimerkiksi kun käyttäjä kääntää laitteen pystyasennosta vaakasuuntaan. Kun nämä konfiguraatiomuutokset tapahtuvat, aktiviteetti tuhotaan ja luodaan uudelleen oletustilaansa, ja käyttäjä saattaa menettää toimintoon syöttämänsä tiedot. Käyttäjien hämmentämisen välttämiseksi on tärkeää, että kehität sovelluksesi odottamattomien tietojen häviämisen estämiseksi. Myöhemmin tässä harjoituksessa kokeilet konfiguraatiomuutoksia ja opit säilyttämään toiminnan tilan vastauksena laitteen konfiguraatiomuutoksiin ja muihin toiminnan elinkaaren tapahtumiin.

Tässä käytännössä lisäät kirjauslausuntoja TwoActivities-sovellukseen ja tarkkailet toimintojen elinkaaren muutoksia sovellusta käyttäessäsi. Sen jälkeen alat työskennellä näiden muutosten kanssa ja tutkia, kuinka käsitellä käyttäjän syötteitä näissä olosuhteissa.

Edellytykset

Sinun pitäisi pystyä:

  • Luo ja suorita sovellusprojekti Android Studiossa .
  • Lisää lokilausuntoja sovellukseesi ja tarkastele niitä Logcat-ruudussa.
  • Ymmärrä toiminto ja tarkoitus ja työskentele niiden kanssa ja ole mukava vuorovaikutuksessa niiden kanssa.

Mitä opit

  • Kuinka toiminnan elinkaari toimii.
  • Kun toiminto alkaa, se pysähtyy, pysähtyy ja tuhoutuu.
  • Tietoja toimintojen muutoksiin liittyvistä elinkaaren takaisinkutsumenetelmistä.
  • Toimien (kuten kokoonpanomuutosten) vaikutus, joka voi johtaa toiminnan elinkaaritapahtumiin.
  • Aktiviteettitilan säilyttäminen koko elinkaaren ajan.

Mitä aiot tehdä

  • Lisää koodi TwoActivities -sovellukseen edellisestä käytännöstä, jotta voit ottaa käyttöön eri toiminnan elinkaarikutsut ja sisällyttää kirjauslausunnot.
  • Tarkkaile tilan muutoksia, kun sovelluksesi toimii ja olet vuorovaikutuksessa kunkin sovelluksesi toiminnon kanssa.
  • Muokkaa sovellustasi niin, että se säilyttää sellaisen Aktiviteetin ilmentymän tilan, joka luodaan odottamatta uudelleen vastauksena käyttäjän käyttäytymiseen tai laitteen määrityksen muutoksiin.

2. Sovelluksen yleiskatsaus

Tässä käytännössä lisäät TwoActivities -sovellukseen. Sovellus näyttää ja käyttäytyy suunnilleen samalta kuin edellisessä koodilaboratoriossa. Se sisältää kaksi toimintototeutusta ja antaa käyttäjälle mahdollisuuden lähettää niiden välillä. Tässä käytännössä sovellukseen tekemäsi muutokset eivät vaikuta sen näkyvään käyttäjäkäyttäytymiseen.

3. 3. Tehtävä 1: Lisää elinkaarikutsut TwoActivitiesiin

Tässä tehtävässä otat käyttöön kaikki toimintojen elinkaaren takaisinkutsun menetelmät viestien tulostamiseksi logcatiin, kun näitä menetelmiä kutsutaan. Näiden lokiviestien avulla voit nähdä, milloin Toiminnan elinkaari muuttaa tilaa ja kuinka elinkaaritilan muutokset vaikuttavat sovellukseesi sen toimiessa.

1.1 (Valinnainen) Kopioi TwoActivities-projekti

Tämän käytännön tehtäviä varten muokkaat olemassa olevaa TwoActivities -projektia, jonka rakensit edellisessä harjoituksessa. Jos haluat mieluummin pitää edellisen TwoActivities-projektin ennallaan, tee kopio projektista noudattamalla kohdan Liite: Apuohjelmat ohjeita .

1.2 Ota takaisinkutsut käyttöön MainActivityssä

  1. Avaa TwoActivities-projekti Android Studiossa ja avaa MainActivity Project > Android -ruudussa.
  2. Lisää onCreate()-menetelmään seuraavat lokilausekkeet:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Lisää ohitus onStart()-takaisinkutsulle ja käsky kyseisen tapahtuman lokiin:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Saat pikakuvakkeen valitsemalla Android Studiossa Koodi > Ohita menetelmät. Näyttöön tulee valintaikkuna, jossa on kaikki mahdolliset menetelmät, jotka voit ohittaa luokassasi. Yhden tai useamman takaisinkutsun menetelmän valitseminen luettelosta lisää näille menetelmille täydellisen mallin, mukaan lukien vaaditun kutsun superluokkaan.

  1. Käytä onStart()-metodia mallina toteuttaaksesi onPause(), onRestart(), onResume(), onStop() ja onDestroy() elinkaaren takaisinkutsut

Kaikilla takaisinsoittomenetelmillä on samat allekirjoitukset (nimeä lukuun ottamatta). Jos kopioit ja liität onStart():n luodaksesi nämä muut takaisinkutsun menetelmät, älä unohda päivittää sisältöä kutsumaan oikeaa metodia superluokassa ja kirjata oikea menetelmä.

  1. Suorita sovellus.
  2. Napsauta Android Studion alaosassa olevaa Logcat-välilehteä, niin Logcat-ruutu tulee näkyviin. Sinun pitäisi nähdä kolme lokiviestiä, jotka näyttävät kolme elinkaaritilaa, joissa toiminto on siirtynyt sen alkaessa:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Ota käyttöön elinkaarikutsut SecondActivityssä

Nyt kun olet ottanut käyttöön MainActivityn elinkaaren takaisinkutsun menetelmät, tee sama SecondActivitylle.

  1. Avaa SecondActivity.
  2. Lisää luokan yläosaan vakio LOG_TAG-muuttujalle:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Lisää elinkaarikutsut ja lokilausekkeet toiseen toimintoon. (Voit kopioida ja liittää takaisinsoittotavat MainActivitystä.)
  2. Lisää lokilauseke returnReply()-metodiin juuri ennen finish()-metodia:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Tarkkaile lokia, kun sovellus toimii**

  1. Suorita sovellus.
  2. Napsauta Android Studion alaosassa olevaa Logcat-välilehteä, niin Logcat-ruutu tulee näkyviin.
  3. Kirjoita Activity hakukenttään. Android logcat voi olla hyvin pitkä ja sekainen. Koska LOG_TAG-muuttuja kussakin luokassa sisältää joko sanat MainActivity tai SecondActivity, tällä avainsanalla voit suodattaa lokista vain sinua kiinnostavat asiat.

Kaksinkertainen ongelma

Kokeile sovellustasi ja huomaa, että elinkaaritapahtumat tapahtuvat vastauksena eri toimiin. Kokeile erityisesti näitä asioita:

  • Käytä sovellusta normaalisti (lähetä viesti, vastaa toisella viestillä).
  • Käytä Takaisin-painiketta palataksesi toisesta toiminnasta päätoimintoon.
  • Käytä sovelluspalkin ylänuolta palataksesi toisesta toiminnasta päätoimintaan.
  • Pyöritä laitetta sekä pää- että toisessa toiminnossa eri aikoina sovelluksessasi ja tarkkaile, mitä * lokissa ja näytöllä tapahtuu.
  • Paina yleiskuvauspainiketta (Kodin oikealla puolella oleva neliöpainike) ja sulje sovellus (napauta X).
  • Palaa aloitusnäyttöön ja käynnistä sovellus uudelleen.

VINKKI: Jos käytät sovellustasi emulaattorissa, voit simuloida pyörimistä näppäimillä Control+F11 tai Control+Function+F11.

Tehtävän 1 ratkaisukoodi

Seuraavat koodinpätkät näyttävät ensimmäisen tehtävän ratkaisukoodin.

MainActivity

Seuraavat koodinpätkät näyttävät lisätyn koodin MainActivityssä, mutta eivät koko luokkaa.

OnCreate()-menetelmä:

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

Muut elinkaarimenetelmät:

@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

Seuraavat koodinpätkät näyttävät lisätyn koodin SecondActivityssä, mutta eivät koko luokkaa.

SecondActivity-luokan yläosassa:

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

returnReply() -menetelmä:

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

Muut elinkaarimenetelmät:

Sama kuin MainActivityssä yllä.

4. 4. Tehtävä 2: Tallenna ja palauta Activity-ilmentymän tila

Järjestelmäresursseista ja käyttäjien käyttäytymisestä riippuen jokainen sovelluksesi toiminto saatetaan tuhota ja rekonstruoida paljon useammin kuin uskotkaan.

Olet ehkä huomannut tämän toiminnan viimeisessä osassa, kun käänsit laitetta tai emulaattoria. Laitteen kääntäminen on yksi esimerkki laitteen kokoonpanon muuttamisesta. Vaikka kierto on yleisin, kaikki konfiguraatiomuutokset johtavat siihen, että nykyinen toiminto tuhotaan ja luodaan uudelleen ikään kuin se olisi uusi. Jos et huomioi tätä käyttäytymistä koodissasi, toimintojen asettelu saattaa palata oletusulkoasuun ja alkuarvoihinsa, kun kokoonpano muuttuu, ja käyttäjäsi voivat menettää paikkansa, tietonsa tai edistymistilansa sovelluksesi.

Kunkin toiminnon tila tallennetaan avain/arvo-parien joukkona Bundle-objektiin, jota kutsutaan Activity-ilmentymän tilaksi. Järjestelmä tallentaa oletustilatiedot ilmentymän tilanippuun juuri ennen toiminnon pysäyttämistä ja välittää sen uudelle toiminto-ilmentymälle palautettavaksi.

OnSaveInstanceState()-metodi on otettava käyttöön, jotta et menettäisi toiminnon tietoja, kun se tuhoutuu ja luodaan uudelleen. Järjestelmä kutsuu tätä menetelmää toiminnallesi (onPause() ja onStop() välillä), kun on mahdollista, että toiminto voidaan tuhota ja luoda uudelleen.

Ilmentymän tilassa tallennetut tiedot koskevat vain tämän tietyn toiminnon tätä esiintymää nykyisen sovellusistunnon aikana. Kun lopetat ja käynnistät uuden sovellusistunnon uudelleen, toiminto-ilmentymän tila katoaa ja toiminto palaa oletusulkoasuunsa. Jos sinun on tallennettava käyttäjätietoja sovellusistuntojen välillä, käytä jaettuja asetuksia tai tietokantaa. Opit näistä molemmista myöhemmissä käytännöissä.

2.1 Tallenna Activity-ilmentymän tila komennolla onSaveInstanceState()

Olet ehkä huomannut, että laitteen pyörittäminen ei vaikuta toisen toiminnon tilaan ollenkaan. Tämä johtuu siitä, että toinen toiminnon asettelu ja tila luodaan asettelusta ja sen aktivoineesta Intentistä. Vaikka toiminto luodaan uudelleen, Intent on edelleen olemassa ja sen tietoja käytetään edelleen joka kerta, kun toisen toiminnon onCreate()-menetelmää kutsutaan.

Lisäksi saatat huomata, että jokaisessa toiminnassa viestiin tai vastaukseen kirjoittamasi teksti EditText-elementteihin säilyy, vaikka laitetta käännetään. Tämä johtuu siitä, että joidenkin asettelusi View-elementtien tilatiedot tallennetaan automaattisesti kokoonpanomuutosten yhteydessä, ja EditTextin nykyinen arvo on yksi näistä tapauksista.

Joten ainoa toimintotila, josta olet kiinnostunut, ovat TextView-elementit vastauksen otsikossa ja vastausteksti päätoiminnossa. Molemmat TextView-elementit ovat oletuksena näkymättömiä; ne näkyvät vain, kun lähetät viestin takaisin päätoimintoon toisesta toiminnasta.

Tässä tehtävässä lisäät koodin näiden kahden TextView-elementin ilmentymän tilan säilyttämiseksi käyttämällä onSaveInstanceState(-komentoa).

  1. Avaa MainActivity.
  2. Lisää tämä onSaveInstanceState():n runkototeutus toimintoon tai käytä Koodi > Ohitusmenetelmät lisätäksesi rungon ohituksen.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Tarkista, onko otsikko tällä hetkellä näkyvissä, ja jos on, aseta se näkyvyystila tilaan Bundle putBoolean()-metodilla ja avaimella "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Muista, että vastauksen otsikko ja teksti on merkitty näkymättömiksi, kunnes toisesta toiminnosta tulee vastaus. Jos otsikko on näkyvissä, on vastaustiedot, jotka on tallennettava. Huomaa, että olemme kiinnostuneita vain tuosta näkyvyystilasta – otsikon varsinaista tekstiä ei tarvitse tallentaa, koska teksti ei koskaan muutu.

  1. Lisää vastausteksti samaan ruutuun.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jos otsikko on näkyvissä, voit olettaa, että myös itse vastausviesti on näkyvissä. Sinun ei tarvitse testata tai tallentaa vastausviestin nykyistä näkyvyystilaa. Vain viestin varsinainen teksti menee tilaan Bundle avaimella "reply_text".

Tallennat vain niiden näkymäelementtien tilan, jotka saattavat muuttua toiminnon luomisen jälkeen. Muut sovelluksesi View-elementit (muokkausteksti, painike) voidaan luoda uudelleen oletusasettelusta milloin tahansa.

Huomaa, että järjestelmä tallentaa joidenkin View-elementtien tilan, kuten EditText-tekstin sisällön.

2.2 Palauta Activity-ilmentymän tila onCreate()

Kun olet tallentanut toiminnan esiintymän tilan, sinun on myös palautettava se, kun toiminto luodaan uudelleen. Voit tehdä tämän joko ohjelmassa onCreate() tai ottamalla käyttöön onRestoreInstanceState()-takaisinkutsun, jota kutsutaan onStart():n jälkeen toiminnon luomisen jälkeen.

Useimmiten paras paikka Activity-tilan palauttamiseen on onCreate(), jotta voidaan varmistaa, että käyttöliittymä, mukaan lukien tila, on käytettävissä mahdollisimman pian. Joskus on kätevää tehdä se onRestoreInstanceState():ssä, kun kaikki alustus on tehty, tai antaa alaluokkien päättää, käytetäänkö oletustoteutusta.

  1. Kun näkymämuuttujat on alustettu findViewById() -menetelmässä onCreate(), lisää testi varmistaaksesi, että savedInstanceState ei ole tyhjä.
// 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) {
}

Kun toimintosi on luotu, järjestelmä välittää tilapaketin onCreate():lle ainoana argumenttina. Kun onCreate() kutsutaan ensimmäistä kertaa ja sovelluksesi käynnistyy, paketti on tyhjä – sovelluksen ensimmäisen käynnistyksen yhteydessä ei ole olemassa olevaa tilaa. Myöhemmissä onCreate()-kutsuissa on nippu, joka on täytetty onSaveInstanceState()-kenttään tallentamillasi tiedoilla.

  1. Hae tämän tarkistuksen sisällä nykyinen näkyvyys (tosi tai epätosi) paketista näppäimellä "reply_visible".
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Lisää testi edellisen rivin alle isVisible-muuttujalle.
if (isVisible) {
}

Jos tilapaketissa on reply_visible-avain (ja isVisible on siis tosi), sinun on palautettava tila.

  1. Tee isVisible-testin ylätunniste näkyväksi.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Hae tekstivastausviesti nipusta avaimella "reply_text" ja aseta vastaustekstinäkymä näyttämään kyseinen merkkijono.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Tee myös vastaus TextView näkyväksi:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Suorita sovellus. Yritä kääntää laitetta tai emulaattoria varmistaaksesi, että vastausviesti (jos sellainen on) pysyy näytöllä toiminnon uudelleenluomisen jälkeen.

Tehtävän 2 ratkaisukoodi

Seuraavat koodinpätkät näyttävät tämän tehtävän ratkaisukoodin.

MainActivity

Seuraavat koodinpätkät näyttävät lisätyn koodin MainActivityssä, mutta eivät koko luokkaa.

OnSaveInstanceState() -menetelmä:

@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()-menetelmä:

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

Koko projekti:

Android Studio Project: TwoActivitiesLifecycle

5. Koodaus

Haaste: Luo yksinkertainen ostoslistasovellus, jossa on päätoiminto käyttäjän laatimalle listalle ja toinen toiminto yleisten ostostuotteiden luettelolle.

  • Päätoiminnon tulee sisältää rakennettava luettelo, jonka tulee koostua kymmenestä tyhjästä TextView-elementistä.
  • Päätoiminnon Lisää tuote -painike käynnistää toisen toiminnon, joka sisältää luettelon tavallisista ostostuotteista (juusto, riisi, omenat ja niin edelleen). Käytä Button-elementtejä näyttääksesi kohteet.
  • Kohteen valitseminen palauttaa käyttäjän päätoimintoon ja päivittää tyhjän TextView-näkymän sisältämään valitun kohteen.

Käytä Intentia tietojen siirtämiseen toiminnosta toiseen. Varmista, että ostoslistan nykyinen tila tallennetaan, kun käyttäjä kääntää laitetta.

6. Yhteenveto

  • Aktiviteetin elinkaari on joukko tiloja, joiden läpi toiminto siirtyy, alkaen siitä, kun se luodaan ensimmäisen kerran, ja päättyy, kun Android-järjestelmä ottaa takaisin kyseisen toiminnon resurssit.
  • Kun käyttäjä siirtyy toiminnosta toiseen sekä sovelluksesi sisällä ja ulkopuolella, jokainen toiminto siirtyy toiminnan elinkaaren tiloista toiseen.
  • Jokaisella toimintojen elinkaaren tilassa on vastaava takaisinsoittomenetelmä, jonka voit ohittaa Activity-luokassa.
  • Elinkaarimenetelmät ovat onCreate(), onStart(), onPause(), onRestart(), onResume(), onStop(), onDestroy().
  • Elinkaaren takaisinkutsumenetelmän ohittaminen antaa sinun lisätä toimintaa, joka ilmenee, kun toimintosi siirtyy tähän tilaan.
  • Voit lisätä luokkien ohitusmenetelmiä Android Studion luokkiin valitsemalla Koodi > Ohita.
  • Laitteen konfiguraatiomuutokset, kuten kierto, johtavat siihen, että toiminto tuhotaan ja luodaan uudelleen ikään kuin se olisi uusi.
  • Osa toimintotilasta säilyy kokoonpanomuutoksen yhteydessä, mukaan lukien EditText-elementtien nykyiset arvot. Kaikkien muiden tietojen osalta sinun on tallennettava tiedot erikseen.
  • Tallenna toiminto-ilmentymän tila onSaveInstanceState()-metodissa.
  • Ilmentymän tilatiedot tallennetaan yksinkertaisina avain/arvo-pareina nippuun. Käytä nippumenetelmiä tietojen lisäämiseen nippuun ja tietojen palauttamiseen nippuun.
  • Palauta ilmentymän tila kohdassa onCreate(), joka on suositeltava tapa, tai onRestoreInstanceState(). Takaisin
,

1. Tervetuloa

Tämä käytännöllinen koodilaboratorio on osa Unit 1: Aloita Android Developer Fundamentals (Version 2) -kurssilla. Saat eniten hyötyä tästä kurssista, jos käytät koodilaboratorioita järjestyksessä:

  • Täydellinen luettelo kurssin koodilaboista on kohdassa Codelabs for Android Developer Fundamentals (V2).
  • Lisätietoja kurssista, mukaan lukien linkit kaikkiin konseptilukuihin, sovelluksiin ja dioihin, on kohdassa Android Developer Fundamentals (versio 2).

Johdanto

Tässä harjoituksessa opit lisää toiminnan elinkaaresta. Elinkaari on joukko tiloja, joissa aktiviteetti voi olla koko elinkaarensa ajan, sen luomisesta siihen, kun se tuhoutuu ja järjestelmä ottaa resurssejaan takaisin. Kun käyttäjä liikkuu sovelluksesi toimintojen välillä (sekä sovellukseesi sisään ja sieltä pois), toiminnot siirtyvät elinkaarensa aikana eri tiloista toiseen.

Kaksinkertainen ongelma

Jokaisella toiminnon elinkaaren vaiheella on vastaava takaisinkutsumenetelmä: onCreate(), onStart(), onPause() ja niin edelleen. Kun aktiviteetti muuttaa tilaa, siihen liittyvä takaisinsoittomenetelmä kutsutaan. Olet jo nähnyt yhden seuraavista tavoista: onCreate(). Ohitamalla minkä tahansa elinkaarikutsun toimintoluokissasi, voit muuttaa aktiviteetin oletuskäyttäytymistä vastauksena käyttäjän tai järjestelmän toimiin.

Aktiivisuustila voi myös muuttua laitteen konfiguraatiomuutosten seurauksena, esimerkiksi kun käyttäjä kääntää laitteen pystyasennosta vaakasuuntaan. Kun nämä konfiguraatiomuutokset tapahtuvat, aktiviteetti tuhotaan ja luodaan uudelleen oletustilaansa, ja käyttäjä saattaa menettää toimintoon syöttämänsä tiedot. Käyttäjien hämmentämisen välttämiseksi on tärkeää, että kehität sovelluksesi odottamattomien tietojen häviämisen estämiseksi. Myöhemmin tässä harjoituksessa kokeilet konfiguraatiomuutoksia ja opit säilyttämään toiminnan tilan vastauksena laitteen konfiguraatiomuutoksiin ja muihin toiminnan elinkaaren tapahtumiin.

Tässä käytännössä lisäät kirjauslausuntoja TwoActivities-sovellukseen ja tarkkailet toimintojen elinkaaren muutoksia sovellusta käyttäessäsi. Sen jälkeen alat työskennellä näiden muutosten kanssa ja tutkia, kuinka käsitellä käyttäjän syötteitä näissä olosuhteissa.

Edellytykset

Sinun pitäisi pystyä:

  • Luo ja suorita sovellusprojekti Android Studiossa .
  • Lisää lokilausuntoja sovellukseesi ja tarkastele niitä Logcat-ruudussa.
  • Ymmärrä toiminto ja tarkoitus ja työskentele niiden kanssa ja ole mukava vuorovaikutuksessa niiden kanssa.

Mitä opit

  • Kuinka toiminnan elinkaari toimii.
  • Kun toiminto alkaa, se pysähtyy, pysähtyy ja tuhoutuu.
  • Tietoja toimintojen muutoksiin liittyvistä elinkaaren takaisinkutsumenetelmistä.
  • Toimien (kuten kokoonpanomuutosten) vaikutus, joka voi johtaa toiminnan elinkaaritapahtumiin.
  • Aktiviteettitilan säilyttäminen koko elinkaaren ajan.

Mitä aiot tehdä

  • Lisää koodi TwoActivities -sovellukseen edellisestä käytännöstä, jotta voit ottaa käyttöön eri toiminnan elinkaarikutsut ja sisällyttää kirjauslausunnot.
  • Tarkkaile tilan muutoksia, kun sovelluksesi toimii ja olet vuorovaikutuksessa kunkin sovelluksesi toiminnon kanssa.
  • Muokkaa sovellustasi niin, että se säilyttää sellaisen Aktiviteetin ilmentymän tilan, joka luodaan odottamatta uudelleen vastauksena käyttäjän käyttäytymiseen tai laitteen määrityksen muutoksiin.

2. Sovelluksen yleiskatsaus

Tässä käytännössä lisäät TwoActivities -sovellukseen. Sovellus näyttää ja käyttäytyy suunnilleen samalta kuin edellisessä koodilaboratoriossa. Se sisältää kaksi toimintototeutusta ja antaa käyttäjälle mahdollisuuden lähettää niiden välillä. Tässä käytännössä sovellukseen tekemäsi muutokset eivät vaikuta sen näkyvään käyttäjäkäyttäytymiseen.

3. 3. Tehtävä 1: Lisää elinkaarikutsut TwoActivitiesiin

Tässä tehtävässä otat käyttöön kaikki toimintojen elinkaaren takaisinkutsun menetelmät viestien tulostamiseksi logcatiin, kun näitä menetelmiä kutsutaan. Näiden lokiviestien avulla voit nähdä, milloin Toiminnan elinkaari muuttaa tilaa ja kuinka elinkaaritilan muutokset vaikuttavat sovellukseesi sen toimiessa.

1.1 (Valinnainen) Kopioi TwoActivities-projekti

Tämän käytännön tehtäviä varten muokkaat olemassa olevaa TwoActivities -projektia, jonka rakensit edellisessä harjoituksessa. Jos haluat mieluummin pitää edellisen TwoActivities-projektin ennallaan, tee kopio projektista noudattamalla kohdan Liite: Apuohjelmat ohjeita .

1.2 Ota takaisinkutsut käyttöön MainActivityssä

  1. Avaa TwoActivities-projekti Android Studiossa ja avaa MainActivity Project > Android -ruudussa.
  2. Lisää onCreate()-menetelmään seuraavat lokilausekkeet:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Lisää ohitus onStart()-takaisinkutsulle ja käsky kyseisen tapahtuman lokiin:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Saat pikakuvakkeen valitsemalla Android Studiossa Koodi > Ohita menetelmät. Näyttöön tulee valintaikkuna, jossa on kaikki mahdolliset menetelmät, jotka voit ohittaa luokassasi. Yhden tai useamman takaisinkutsun menetelmän valitseminen luettelosta lisää näille menetelmille täydellisen mallin, mukaan lukien vaaditun kutsun superluokkaan.

  1. Käytä onStart()-metodia mallina toteuttaaksesi onPause(), onRestart(), onResume(), onStop() ja onDestroy() elinkaaren takaisinkutsut

Kaikilla takaisinsoittomenetelmillä on samat allekirjoitukset (nimeä lukuun ottamatta). Jos kopioit ja liität onStart():n luodaksesi nämä muut takaisinkutsun menetelmät, älä unohda päivittää sisältöä kutsumaan oikeaa metodia superluokassa ja kirjata oikea menetelmä.

  1. Suorita sovellus.
  2. Napsauta Android Studion alaosassa olevaa Logcat-välilehteä, niin Logcat-ruutu tulee näkyviin. Sinun pitäisi nähdä kolme lokiviestiä, jotka näyttävät kolme elinkaaritilaa, joissa toiminto on siirtynyt sen alkaessa:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 Ota käyttöön elinkaarikutsut SecondActivityssä

Nyt kun olet ottanut käyttöön MainActivityn elinkaaren takaisinkutsun menetelmät, tee sama SecondActivitylle.

  1. Avaa SecondActivity.
  2. Lisää luokan yläosaan vakio LOG_TAG-muuttujalle:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Lisää elinkaarikutsut ja lokilausekkeet toiseen toimintoon. (Voit kopioida ja liittää takaisinsoittotavat MainActivitystä.)
  2. Lisää lokilauseke returnReply()-metodiin juuri ennen finish()-metodia:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Tarkkaile lokia, kun sovellus toimii**

  1. Suorita sovellus.
  2. Napsauta Android Studion alaosassa olevaa Logcat-välilehteä, niin Logcat-ruutu tulee näkyviin.
  3. Kirjoita Activity hakukenttään. Android logcat voi olla hyvin pitkä ja sekainen. Koska LOG_TAG-muuttuja kussakin luokassa sisältää joko sanat MainActivity tai SecondActivity, tällä avainsanalla voit suodattaa lokista vain sinua kiinnostavat asiat.

Kaksinkertainen ongelma

Kokeile sovellustasi ja huomaa, että elinkaaritapahtumat tapahtuvat vastauksena eri toimiin. Kokeile erityisesti näitä asioita:

  • Käytä sovellusta normaalisti (lähetä viesti, vastaa toisella viestillä).
  • Käytä Takaisin-painiketta palataksesi toisesta toiminnasta päätoimintoon.
  • Käytä sovelluspalkin ylänuolta palataksesi toisesta toiminnasta päätoimintaan.
  • Pyöritä laitetta sekä pää- että toisessa toiminnossa eri aikoina sovelluksessasi ja tarkkaile, mitä * lokissa ja näytöllä tapahtuu.
  • Paina yleiskuvauspainiketta (Kodin oikealla puolella oleva neliöpainike) ja sulje sovellus (napauta X).
  • Palaa aloitusnäyttöön ja käynnistä sovellus uudelleen.

VINKKI: Jos käytät sovellustasi emulaattorissa, voit simuloida pyörimistä näppäimillä Control+F11 tai Control+Function+F11.

Tehtävän 1 ratkaisukoodi

Seuraavat koodinpätkät näyttävät ensimmäisen tehtävän ratkaisukoodin.

MainActivity

Seuraavat koodinpätkät näyttävät lisätyn koodin MainActivityssä, mutta eivät koko luokkaa.

OnCreate()-menetelmä:

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

Muut elinkaarimenetelmät:

@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

Seuraavat koodinpätkät näyttävät lisätyn koodin SecondActivityssä, mutta eivät koko luokkaa.

SecondActivity-luokan yläosassa:

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

returnReply() -menetelmä:

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

Muut elinkaarimenetelmät:

Sama kuin MainActivityssä yllä.

4. 4. Tehtävä 2: Tallenna ja palauta Activity-ilmentymän tila

Järjestelmäresursseista ja käyttäjien käyttäytymisestä riippuen jokainen sovelluksesi toiminto saatetaan tuhota ja rekonstruoida paljon useammin kuin uskotkaan.

Olet ehkä huomannut tämän toiminnan viimeisessä osassa, kun käänsit laitetta tai emulaattoria. Laitteen kääntäminen on yksi esimerkki laitteen kokoonpanon muuttamisesta. Vaikka kierto on yleisin, kaikki konfiguraatiomuutokset johtavat siihen, että nykyinen toiminto tuhotaan ja luodaan uudelleen ikään kuin se olisi uusi. Jos et huomioi tätä käyttäytymistä koodissasi, toimintojen asettelu saattaa palata oletusulkoasuun ja alkuarvoihinsa, kun kokoonpano muuttuu, ja käyttäjäsi voivat menettää paikkansa, tietonsa tai edistymistilansa sovelluksesi.

Kunkin toiminnon tila tallennetaan avain/arvo-parien joukkona Bundle-objektiin, jota kutsutaan Activity-ilmentymän tilaksi. Järjestelmä tallentaa oletustilatiedot ilmentymän tilanippuun juuri ennen toiminnon pysäyttämistä ja välittää sen uudelle toiminto-ilmentymälle palautettavaksi.

OnSaveInstanceState()-metodi on otettava käyttöön, jotta et menettäisi toiminnon tietoja, kun se tuhoutuu ja luodaan uudelleen. Järjestelmä kutsuu tätä menetelmää toiminnallesi (onPause() ja onStop() välillä), kun on mahdollista, että toiminto voidaan tuhota ja luoda uudelleen.

Ilmentymän tilassa tallennetut tiedot koskevat vain tämän tietyn toiminnon tätä esiintymää nykyisen sovellusistunnon aikana. Kun lopetat ja käynnistät uuden sovellusistunnon uudelleen, toiminto-ilmentymän tila katoaa ja toiminto palaa oletusulkoasuunsa. Jos sinun on tallennettava käyttäjätietoja sovellusistuntojen välillä, käytä jaettuja asetuksia tai tietokantaa. Opit näistä molemmista myöhemmässä käytännössä.

2.1 Tallenna Activity-ilmentymän tila komennolla onSaveInstanceState()

Olet ehkä huomannut, että laitteen pyörittäminen ei vaikuta toisen toiminnon tilaan ollenkaan. Tämä johtuu siitä, että toinen toiminnon asettelu ja tila luodaan asettelusta ja sen aktivoineesta Intentistä. Vaikka toiminto luodaan uudelleen, Intent on edelleen olemassa ja sen tietoja käytetään edelleen joka kerta, kun toisen toiminnon onCreate()-menetelmää kutsutaan.

Lisäksi saatat huomata, että jokaisessa toiminnassa viestiin tai vastaukseen kirjoittamasi teksti EditText-elementteihin säilyy, vaikka laitetta käännetään. Tämä johtuu siitä, että joidenkin asettelusi View-elementtien tilatiedot tallennetaan automaattisesti kokoonpanomuutosten yhteydessä, ja EditTextin nykyinen arvo on yksi näistä tapauksista.

Joten ainoa toimintotila, josta olet kiinnostunut, ovat TextView-elementit vastauksen otsikossa ja vastausteksti päätoiminnossa. Molemmat TextView-elementit ovat oletuksena näkymättömiä; ne näkyvät vain, kun lähetät viestin takaisin päätoimintoon toisesta toiminnasta.

Tässä tehtävässä lisäät koodin näiden kahden TextView-elementin ilmentymän tilan säilyttämiseksi käyttämällä onSaveInstanceState(-komentoa).

  1. Avaa MainActivity.
  2. Lisää tämä onSaveInstanceState():n runkototeutus toimintoon tai käytä Koodi > Ohitusmenetelmät lisätäksesi rungon ohituksen.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Tarkista, onko otsikko tällä hetkellä näkyvissä, ja jos on, aseta se näkyvyystila tilaan Bundle putBoolean()-metodilla ja avaimella "reply_visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Muista, että vastauksen otsikko ja teksti on merkitty näkymättömiksi, kunnes toisesta toiminnosta tulee vastaus. Jos otsikko on näkyvissä, on vastaustiedot, jotka on tallennettava. Huomaa, että olemme kiinnostuneita vain tuosta näkyvyystilasta – otsikon varsinaista tekstiä ei tarvitse tallentaa, koska teksti ei koskaan muutu.

  1. Lisää vastausteksti samaan ruutuun.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jos otsikko on näkyvissä, voit olettaa, että myös itse vastausviesti on näkyvissä. Sinun ei tarvitse testata tai tallentaa vastausviestin nykyistä näkyvyystilaa. Vain viestin varsinainen teksti menee tilaan Bundle avaimella "reply_text".

Tallennat vain niiden näkymäelementtien tilan, jotka saattavat muuttua toiminnon luomisen jälkeen. Muut sovelluksesi View-elementit (muokkausteksti, painike) voidaan luoda uudelleen oletusasettelusta milloin tahansa.

Huomaa, että järjestelmä tallentaa joidenkin View-elementtien tilan, kuten EditText-tekstin sisällön.

2.2 Palauta Activity-ilmentymän tila onCreate()

Kun olet tallentanut toiminnan esiintymän tilan, sinun on myös palautettava se, kun toiminto luodaan uudelleen. Voit tehdä tämän joko ohjelmassa onCreate() tai ottamalla käyttöön onRestoreInstanceState()-takaisinkutsun, jota kutsutaan onStart():n jälkeen toiminnon luomisen jälkeen.

Useimmiten paras paikka Activity-tilan palauttamiseen on onCreate(), jotta voidaan varmistaa, että käyttöliittymä, mukaan lukien tila, on käytettävissä mahdollisimman pian. Joskus on kätevää tehdä se onRestoreInstanceState():ssä, kun kaikki alustus on tehty, tai antaa alaluokkien päättää, käytetäänkö oletustoteutusta.

  1. Kun näkymämuuttujat on alustettu findViewById() -menetelmässä onCreate(), lisää testi varmistaaksesi, että savedInstanceState ei ole tyhjä.
// 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) {
}

Kun toimintosi on luotu, järjestelmä välittää tilapaketin onCreate():lle ainoana argumenttina. Kun onCreate() kutsutaan ensimmäistä kertaa ja sovelluksesi käynnistyy, paketti on tyhjä – sovelluksen ensimmäisen käynnistyksen yhteydessä ei ole olemassa olevaa tilaa. Myöhemmissä onCreate()-kutsuissa on nippu, joka on täytetty onSaveInstanceState()-kenttään tallentamillasi tiedoilla.

  1. Hae tämän tarkistuksen sisällä nykyinen näkyvyys (tosi tai epätosi) paketista näppäimellä "reply_visible".
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Lisää testi edellisen rivin alle isVisible-muuttujalle.
if (isVisible) {
}

Jos tilapaketissa on reply_visible-avain (ja isVisible on siis tosi), sinun on palautettava tila.

  1. Tee isVisible-testin ylätunniste näkyväksi.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Hae tekstivastausviesti nipusta avaimella "reply_text" ja aseta vastaustekstinäkymä näyttämään kyseinen merkkijono.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Tee myös vastaus TextView näkyväksi:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Suorita sovellus. Yritä kääntää laitetta tai emulaattoria varmistaaksesi, että vastausviesti (jos sellainen on) pysyy näytöllä toiminnon uudelleenluomisen jälkeen.

Tehtävän 2 ratkaisukoodi

Seuraavat koodinpätkät näyttävät tämän tehtävän ratkaisukoodin.

MainActivity

Seuraavat koodinpätkät näyttävät lisätyn koodin MainActivityssä, mutta eivät koko luokkaa.

OnSaveInstanceState() -menetelmä:

@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()-menetelmä:

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

Koko projekti:

Android Studio Project: TwoActivitiesLifecycle

5. Koodaus

Haaste: Luo yksinkertainen ostoslistasovellus, jossa on päätoiminto käyttäjän laatimalle listalle ja toinen toiminto yleisten ostostuotteiden luettelolle.

  • Päätoiminnon tulee sisältää rakennettava luettelo, jonka tulee koostua kymmenestä tyhjästä TextView-elementistä.
  • Päätoiminnon Lisää tuote -painike käynnistää toisen toiminnon, joka sisältää luettelon tavallisista ostostuotteista (juusto, riisi, omenat ja niin edelleen). Näytä kohteet.
  • Kohteen valitseminen palauttaa käyttäjän päätoimintaan ja päivittää tyhjän TextView -tiedoston sisällyttämään valitun kohteen.

Käytä aikomusta välittää tietoja toiminnasta toiseen. Varmista, että ostosluettelon nykyinen tila tallennetaan, kun käyttäjä kiertää laitetta.

6. Yhteenveto

  • Aktiviteetin elinkaari on joukko tiloja, jotka toiminta kulkee läpi, alkaen, kun se luodaan ja päättyy, kun Android -järjestelmä palauttaa resurssit kyseiselle toiminnalle.
  • Kun käyttäjä navigoi toiminnasta toiseen ja sovelluksesi sisä- ja ulkopuolelle, jokainen toiminta liikkuu toiminnan elinkaaren tilojen välillä.
  • Jokaisella toiminnan elinkaaren tilalla on vastaava takaisinsoittomenetelmä, jonka voit ohittaa toimintaluokassa.
  • Elinkaarimenetelmät ovat onCreate (), onStart (), onPause (), onRestart (), onResume (), OnStop (), OnDestroy ().
  • Elinkaaren takaisinsoittomenetelmän ohittaminen antaa sinun lisätä käyttäytymistä, joka tapahtuu, kun toiminta siirtyy kyseiseen tilaan.
  • Voit lisätä luurankojen ohitusmenetelmiä luokkiisi Android Studiossa koodilla> ohitus.
  • Laitteen kokoonpanon muutokset, kuten kierto, johtaa siihen, että toiminta tuhoutuu ja luodaan uudelleen ikään kuin se olisi uusi.
  • Osa toimintatilasta säilyy konfiguraatiomuutoksessa, mukaan lukien EditText -elementtien nykyiset arvot. Kaikille muille tiedoille on tallennettava nämä tiedot nimenomaisesti.
  • Tallenna aktiviteettitapatila OnSaveInStanceState () -menetelmässä.
  • Esimerkkitilatiedot tallennetaan yksinkertaisina avain-/arvopareina nipussa. Käytä nipun menetelmiä laittaaksesi tiedot ja saadaksesi tiedot takaisin nipusta.
  • Palauta esiintymistila oncreate (), joka on suositeltava tapa tai onrestoreInStancestate (). Takaisin
,

1. Tervetuloa

Tämä käytännöllinen CodeLab on osa yksikköä 1: Aloita Android Developer Fundamentals -kurssilla (versio 2). Saat eniten arvoa tästä kurssista, jos työskentelet koodelabien läpi peräkkäin:

  • Kurssin täydellinen luettelo codelabs -ohjelmista on Android Developer Fundamentals for CodeLabs (V2).
  • Lisätietoja kurssista, mukaan lukien linkit kaikkiin konseptilukuihin, sovelluksiin ja dioihin, on Android Developer Fundamentals (versio 2).

Johdanto

Tässä käytännössä opit lisää toiminnan elinkaaresta. Elinkaari on valtioiden joukko, jolloin toiminta voi olla koko elämänsä ajan, kun se luodaan sen tuhoamiseen ja järjestelmä palauttaa resurssit. Kun käyttäjä navigoi sovelluksesi toimintojen välillä (samoin kuin sovelluksesi ja sen ulkopuolelle), aktiviteetit siirtyvät elinkaariensa eri valtioiden välillä.

IDouble -ongelmat

Jokaisella toiminnan elinkaaren vaiheella on vastaava takaisinsoittomenetelmä: oncreate (), onstart (), onpause () ja niin edelleen. Kun toiminta muuttaa tilaa, siihen liittyvää takaisinsoittomenetelmää vedotaan. Olet jo nähnyt yhden näistä menetelmistä: onCreate (). Ohittamalla minkä tahansa elinkaaren takaisinsoittomenetelmät aktiviteettiryhmäsi, voit muuttaa toiminnan oletuskäyttäytymistä vastauksena käyttäjän tai järjestelmän toimintoihin.

Aktiviteettitila voi myös muuttua vastauksena laitteen määritysmuutoksiin, esimerkiksi kun käyttäjä kiertää laitetta muotokuvasta maisemaan. Kun nämä kokoonpano muuttuu, toiminta tuhoutuu ja luodaan uudelleen oletustilassaan, ja käyttäjä voi menettää toimintaansa antamat tiedot. Käyttäjien sekoittamiseksi on tärkeää, että kehität sovellustasi odottamattoman tietojen menetyksen estämiseksi. Myöhemmin tässä käytännössä kokeilet kokoonpanomuutoksia ja oppia säilyttämään toiminnan tila vastauksena laitteen kokoonpanomuutoksiin ja muihin toimintojen elinkaaren tapahtumiin.

Tässä käytännössä lisäät kirjauslausekkeita kahden aktiviteetin sovellukseen ja tarkkailet toiminnan elinkaaren muutoksia sovelluksen käyttäessä. Sitten aloitat työskentelyn näiden muutosten kanssa ja tutkimalla, miten käyttäjän syöttöä käsitellään näissä olosuhteissa.

Edellytykset

Sinun pitäisi pystyä:

  • Luo ja suorita sovellusprojekti Android Studiossa .
  • Lisää lokilausekkeet sovellukseesi ja katso nämä lokit logcat -ruudussa.
  • Ymmärrä ja työskentele toiminnan ja aikomuksen kanssa ja ole mukava vuorovaikutuksessa heidän kanssaan.

Mitä opit

  • Kuinka toiminnan elinkaari toimii.
  • Kun toiminta alkaa, pysähtyy, pysähtyy ja tuhoutuu.
  • Tietoja elinkaaren takaisinsoittomenetelmistä, jotka liittyvät aktiivisuuden muutoksiin.
  • Toimintojen (kuten konfiguraatiomuutokset) vaikutus, joka voi johtaa toiminnan elinkaaren tapahtumiin.
  • Kuinka säilyttää toimintatila elinkaaritapahtumissa.

Mitä teet

  • Lisää koodi kahden aktiviteettisovellukseen edellisestä käytännöllisestä toiminnan erilaisten elinkaaren takaisinsoittojen toteuttamiseksi hakkuuljetusten sisällyttämiseksi.
  • Tarkkaile, että tila muuttuu sovelluksen suoriutuessa ja kun olet vuorovaikutuksessa sovelluksesi jokaisen toiminnan kanssa.
  • Muokkaa sovellustasi säilyttämään toiminnan ilmentymätila, joka on yllättäen luotu uudelleen vastauksena laitteen käyttäjän käyttäytymiseen tai kokoonpanon muutokseen.

2. Sovelluksen yleiskatsaus

Tässä käytännössä lisäät kaksi aktiviteettisovellusta. Sovellus näyttää ja käyttäytyy suunnilleen samalta kuin viimeisessä kodelabissa. Se sisältää kaksi toiminnan toteutusta ja antaa käyttäjälle kyvyn lähettää niiden välillä. Tämän käytännön sovellukseen tekemäsi muutokset eivät vaikuta sen näkyvään käyttäjän käyttäytymiseen.

3. 3. Tehtävä 1: Lisää elinkaaren takaisinsoitto kahteen aktiviteettiin

Tässä tehtävässä otat kaikki toiminnan elinkaaren takaisinsoittomenetelmät tulostaaksesi viestit LOGCAT: lle, kun näitä menetelmiä vedotaan. Näiden lokiviestien avulla voit nähdä, milloin toiminnan elinkaari muuttaa tilaa ja kuinka nämä elinkaaren tilan muutokset vaikuttavat sovellukseesi sen toiminnan aikana.

1.1 (valinnainen) Kopioi kaksi aktiviteettihanketta

Tämän käytännöllisen tehtävien osalta muokkaat viimeisen käytännöllisen rakentamasi olemassa olevaa kahden aktiviteettiprojektia. Jos haluat pitää kaksi edellistä kahta aktiviteettiprojektia ehjänä, noudata liite: apuohjelmia tehdäksesi kopion projektista.

1.2 Toteuta takaisinsoitto pääaktiivisuuteen

  1. Avaa kaksi aktiviteettiprojektia Android -studiossa ja avoin mainActivity projekti> Android -ruudussa.
  2. Lisää onCreate () -menetelmään seuraavat lokilauseet:
Log.d(LOG_TAG, "-------");
Log.d(LOG_TAG, "onCreate");
  1. Lisää ohitus onStart () -soittoon, lausunnolla kyseisen tapahtuman lokiin:
@Override
public void onStart(){
    super.onStart();
    Log.d(LOG_TAG, "onStart");
}

Pikakuvakkeesta valitse koodi> Ohita menetelmät Android Studiossa. Valintaikkuna näkyy kaikilla mahdollisilla menetelmillä, joita voit ohittaa luokassa. Yhden tai useamman takaisinsoittomenetelmän valitseminen luettelosta lisää täydellisen mallin näille menetelmille, mukaan lukien vaadittava puhelu superluokkaan.

  1. Käytä ONTART () -menetelmää mallistona onPause (), onRestart (), onResume (), OnStop () ja OnDestroy () Lifecycle -soittimien toteuttamisessa

Kaikilla takaisinsoittomenetelmillä on samat allekirjoitukset (nimeä paitsi). Jos kopioit ja liität onStart () luodaksesi nämä muut takaisinsoittomenetelmät, älä unohda päivittää sisältöä kutsuaksesi oikean menetelmän superluokkaan ja kirjaamaan oikea menetelmä.

  1. Suorita sovelluksesi.
  2. Napsauta Android Studion alareunan LogCat -välilehteä näyttääksesi LogCat -ruudun. Sinun pitäisi nähdä kolme lokiviestiä, jotka esittävät kolme elinkaaren tilaa, jotka aktiviteetti on siirtynyt läpi, kun se alkoi:
D/MainActivity: -------
D/MainActivity: onCreate
D/MainActivity: onStart
D/MainActivity: onResume

1.3 toteuttaa elinkaaren takaisinsoitukset toissijaisessa aktiivisuudessa

Nyt kun olet toteuttanut elinkaaren takaisinsoittomenetelmät mainosaktiivisuuteen, tee sama toissijaisesti.

  1. Avoin SecondActivity.
  2. Lisää luokan yläosaan vakio log_tag -muuttujalle:
private static final String LOG_TAG = SecondActivity.class.getSimpleName();
  1. Lisää elinkaaren takaisinsoitto ja lokilausekkeet toiseen toimintaan. (Voit kopioida ja liittää takaisinsoittomenetelmät MainActivityltä.)
  2. Lisää lokilausunto returnreply () -menetelmään juuri ennen viimeistelyä () menetelmää:
Log.d(LOG_TAG, "End SecondActivity");

1.4 Tarkkaile loki sovelluksen suoriutuessa **

  1. Suorita sovelluksesi.
  2. Napsauta Android Studion alareunan LogCat -välilehteä näyttääksesi LogCat -ruudun.
  3. Kirjoita aktiviteetti hakukenttään. Android -logcat voi olla erittäin pitkä ja sotkuinen. Koska kunkin luokan log_tag -muuttuja sisältää joko sanat pääactivity tai toissijaisuus, tämän avainsanan avulla voit suodattaa lokin vain kiinnostuneille asioille.

IDouble -ongelmat

Kokeile sovellustasi ja huomaa, että elinkaaritapahtumat, jotka tapahtuvat vastauksena eri toimiin. Erityisesti kokeile näitä asioita:

  • Käytä sovellusta normaalisti (lähetä viesti, vastaa toisella viestillä).
  • Palaa takaisin -painikkeella toisesta toiminnasta päätoimintaan.
  • Käytä sovelluspalkin UP -nuolta palataksesi toisesta toiminnasta päätoimintaan.
  • Kierrä laitetta sekä pää- että toisessa toiminnassa sovelluksesi eri aikoina ja tarkkaile, mitä lokilla ja näytöllä tapahtuu.
  • Paina Yleiskatsauspainiketta (neliöpainike kodin oikealla puolella) ja sulje sovellus (napauta x).
  • Palaa aloitusnäyttöön ja käynnistä sovelluksesi uudelleen.

Vinkki: Jos käytät sovellusta emulaattorissa, voit simuloida kiertoa ohjauksella+F11 tai Control+Function+F11.

Tehtävä 1 Ratkaisukoodi

Seuraavat koodinpätkät näyttävät ratkaisun ensimmäiselle tehtävälle.

Päätoiminta

Seuraavat koodinpätkät osoittavat lisätyn koodin pääactivity, mutta eivät koko luokka.

OnCreate () -menetelmä:

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

Muut elinkaarimenetelmät:

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

Toissijaisuus

Seuraavat koodinpätkät osoittavat lisätyn koodin toisessa aktiivisuudessa, mutta eivät koko luokan.

SecondActivity -luokan yläosassa:

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

ReturnReply () -menetelmä:

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

Muut elinkaarimenetelmät:

Sama kuin yllä olevalla MainActivityllä.

4. 4. Tehtävä 2: Tallenna ja palauta aktiviteetin ilmentymistila

Järjestelmäresurssien ja käyttäjän käyttäytymisen mukaan jokainen sovelluksesi toiminta voidaan tuhota ja rekonstruoida paljon useammin kuin luuletkaan.

Olet ehkä huomannut tämän käyttäytymisen viimeisessä osassa, kun kierrät laitetta tai emulaattoria. Laitteen kiertäminen on yksi esimerkki laitteen kokoonpanon muutoksesta. Vaikka kierto on yleisin, kaikki konfiguraatiomuutokset johtavat nykyisen toiminnan tuhoamiseen ja uudelleen ikään kuin se olisi uusi. Jos et ota huomioon tätä käyttäytymistä koodissasi, kun kokoonpanonmuutos tapahtuu, aktiviteettisi asettelu voi palata oletusasetukseensa ja alkuperäisiin arvoihin, ja käyttäjät voivat menettää paikkansa, heidän tietonsa tai heidän etenemisen tilansa sovelluksesi.

Kunkin toiminnan tila tallennetaan avain-/arvoparien joukkoksi nippu -objektissa, jota kutsutaan aktiviteetti -ilmentymistilaan. Järjestelmä tallentaa oletustilaa koskevat tiedot esimerkkitilan nippuun juuri ennen aktiviteetin lopettamista ja siirtyy kimppuun uuteen aktiviteetin ilmentymään palauttamiseksi.

Jotta voit menettää tietoja toiminnassa, kun se on odottamatta tuhota ja luodaan uudelleen, sinun on toteutettava onSaveInStaceState () -menetelmä. Järjestelmä kutsuu tätä menetelmää toiminnassasi (onPause () ja onstop ()), kun on mahdollista, että toiminta voidaan tuhota ja luoda uudelleen.

Esimerkkitilassa tallentamasi tiedot ovat erityisiä vain tämän erityistoiminnan esiintymiselle nykyisen sovellusistunnon aikana. Kun lopetat ja käynnistät uuden sovellusistunnon uudelleen, aktiviteetti -ilmentymistila katoaa ja aktiviteetti palautuu sen oletuksena. Jos joudut tallentamaan käyttäjätiedot sovellusistuntojen välillä, käytä jaettuja mieltymyksiä tai tietokantaa. Opit näistä molemmista myöhemmässä käytännössä.

2.1 Tallenna aktiviteetti -ilmentymistila onSaveInStanceState ()

Olet ehkä huomannut, että laitteen kiertäminen ei vaikuta ollenkaan toisen toiminnan tilaan. Tämä johtuu siitä, että toinen aktiivisuuden asettelu ja tila syntyy asettelusta ja sen aktivoituneesta aikomuksesta. Vaikka aktiviteetti luodaan uudelleen, aikomus on edelleen olemassa ja kyseisen aikomuksen tietoja käytetään edelleen joka kerta, kun toisessa toiminnassa onCreate () -menetelmää kutsutaan.

Lisäksi saatat huomata, että jokaisessa toiminnassa kaikki viestit tai vastaat EditText -elementit säilytetään myös laitteen kiertäessä. Tämä johtuu siitä, että joidenkin asettelun näkymäelementtien tilatiedot tallennetaan automaattisesti määritysmuutosten välillä, ja EditText -arvo on yksi näistä tapauksista.

Joten ainoa kiinnostunut toimintatila on vastauksen otsikon TextView -elementit ja päätoiminnan vastausteksti. Molemmat TextView -elementit ovat oletuksena näkymättömiä; Ne ilmestyvät vasta, kun lähetät viestin takaisin päätoiminnasta toisesta toiminnasta.

Tässä tehtävässä lisäät koodia näiden kahden TextView -elementin esiintymätilan säilyttämiseksi onSaveInStaceState () -sovelluksella.

  1. Avoin mainaktiivisuus.
  2. Lisää tämä onSaveInStanceState (): n luurankojen toteutus toimintaan tai käytä koodi> ohitusmenetelmiä luurankojen ohittamisen asettamiseen.
@Override
public void onSaveInstanceState(Bundle outState) {
          super.onSaveInstanceState(outState);
}
  1. Tarkista, onko otsikko tällä hetkellä näkyvissä, ja jos niin aseta tämä näkyvyystila valtion nippuun putboolean () -menetelmällä ja avain "Reply_Visible".
 if (mReplyHeadTextView.getVisibility() == View.VISIBLE) {
        outState.putBoolean("reply_visible", true);
    }

Muista, että vastausotsikko ja teksti on merkitty näkymättömäksi, kunnes toisesta toiminnasta on vastaus. Jos otsikko on näkyvissä, on vastaustiedot, jotka on tallennettava. Huomaa, että olemme kiinnostuneita vain siitä näkyvyystilasta - otsikon todellista tekstiä ei tarvitse tallentaa, koska tämä teksti ei koskaan muutu.

  1. Lisää saman tarkistuksen sisälle vastausteksti kimppuun.
outState.putString("reply_text",mReplyTextView.getText().toString());

Jos otsikko on näkyvissä, voit olettaa, että itse vastausviesti on myös näkyvissä. Sinun ei tarvitse testata tai tallentaa vastausviestin nykyistä näkyvyystilaa. Vain viestin todellinen teksti menee State -kimppuun avaimella "Reply_Text".

Säästät vain niiden näkemyselementtien tilan, jotka saattavat muuttua toiminnan luomisen jälkeen. Muut sovelluksesi näkymäelementit (EditText, painike) voidaan luoda uudelleen oletusasettelusta milloin tahansa.

Huomaa, että järjestelmä tallentaa joidenkin näkemyselementtien tilan, kuten EditText -sisällön.

2.2 Palauta aktiviteetti -ilmentymätila oncreate ()

Kun olet tallentanut aktiviteetti -ilmentymän tilan, sinun on myös palautettava se, kun aktiviteetti luodaan uudelleen. Voit tehdä tämän joko onCreate () -sovelluksessa tai toteuttamalla onRestoreInStaNtate () -soitto, jota kutsutaan onStartin () jälkeen toiminnan luomisen jälkeen.

Suurimman osan ajasta, mitä parempi paikka aktiviteettitilan palauttamiseen on, on imete () varmistaa, että käyttöliittymä, mukaan lukien valtio, on saatavana mahdollisimman pian. Toisinaan on kätevää tehdä se onrestoreInStancetate () -sovelluksessa sen jälkeen, kun kaikki alustaminen on tehty, tai antaa alaluokkien päättää käyttää oletusarvoasi.

  1. OnCreate () -menetelmässä, kun näkymämuuttujat on alustettu findViewById () -sovelluksella, lisää testi varmistaaksesi, että SavedInStancestate ei ole tyhjä.
// 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) {
}

Kun toiminta luodaan, järjestelmä siirtää valtion nipun onCreate () -sovellukselle. Ensimmäistä kertaa oncreate () kutsutaan ja sovelluksesi käynnistyy, nippu on nolla - ei ole olemassa olevaa tilaa, kun sovelluksesi alkaa ensimmäistä kertaa. Myöhemmät puhelut onCreate () -pakettiin on paketti onSaveInStancestate () -sivustossa tallentamasi tiedot.

  1. Tämän tarkistuksen sisällä saat nykyisen näkyvyyden (tosi tai väärä) kimppuun avaimella "Reply_Visible".
if (savedInstanceState != null) {
    boolean isVisible = 
                     savedInstanceState.getBoolean("reply_visible");
}
  1. Lisää testi edellisellä rivillä istuvalle muuttujalle.
if (isVisible) {
}

Jos osavaltion nipussa on vastausavain (ja siksi on totta), sinun on palautettava valtio.

  1. Aseta joutumattoman testin sisällä otsikosta näkyvä.
mReplyHeadTextView.setVisibility(View.VISIBLE);
  1. Hanki tekstin vastausviesti nipun kanssa näppäimellä "Reply_Text" ja aseta vastaustekstiview näyttääksesi merkkijonon.
mReplyTextView.setText(savedInstanceState.getString("reply_text"));
  1. Tee myös vastaustekstiview näkyvä:
mReplyTextView.setVisibility(View.VISIBLE);
  1. Suorita sovellus. Kokeile kiertää laitetta tai emulaattoria varmistaaksesi, että vastausviesti (jos sellaista on) pysyy näytöllä toiminnan luomisen jälkeen.

Tehtävä 2 Ratkaisukoodi

Seuraavat koodinpätkät näyttävät ratkaisukäytön tälle tehtävälle.

Päätoiminta

Seuraavat koodinpätkät osoittavat lisätyn koodin pääactivity, mutta eivät koko luokka.

OnSaveInStaNtate () -menetelmä:

@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 () -menetelmä:

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

Koko projekti:

Android Studio Project: TwoActivitylifecycle

5. Koodaus

Haaste: Luo yksinkertainen ostoslista-sovellus, jolla on päätoiminta luettelolle, jota käyttäjä rakentaa, ja toinen toiminta luetteloon yleisistä ostoskohteista.

  • Päätoiminnan tulisi sisältää rakennettava luettelo, joka koostuu kymmenestä tyhjästä TextView -elementtiä.
  • Pääaktiviteetin lisäaine -painike käynnistää toisen toiminnan, joka sisältää luettelon yleisistä ostostuotteista (juusto, riisi, omenat ja niin edelleen). Näytä kohteet.
  • Kohteen valitseminen palauttaa käyttäjän päätoimintaan ja päivittää tyhjän TextView -tiedoston sisällyttämään valitun kohteen.

Käytä aikomusta välittää tietoja toiminnasta toiseen. Varmista, että ostosluettelon nykyinen tila tallennetaan, kun käyttäjä kiertää laitetta.

6. Yhteenveto

  • Aktiviteetin elinkaari on joukko tiloja, jotka toiminta kulkee läpi, alkaen, kun se luodaan ja päättyy, kun Android -järjestelmä palauttaa resurssit kyseiselle toiminnalle.
  • Kun käyttäjä navigoi toiminnasta toiseen ja sovelluksesi sisä- ja ulkopuolelle, jokainen toiminta liikkuu toiminnan elinkaaren tilojen välillä.
  • Jokaisella toiminnan elinkaaren tilalla on vastaava takaisinsoittomenetelmä, jonka voit ohittaa toimintaluokassa.
  • Elinkaarimenetelmät ovat onCreate (), onStart (), onPause (), onRestart (), onResume (), OnStop (), OnDestroy ().
  • Elinkaaren takaisinsoittomenetelmän ohittaminen antaa sinun lisätä käyttäytymistä, joka tapahtuu, kun toiminta siirtyy kyseiseen tilaan.
  • Voit lisätä luurankojen ohitusmenetelmiä luokkiisi Android Studiossa koodilla> ohitus.
  • Laitteen kokoonpanon muutokset, kuten kierto, johtaa siihen, että toiminta tuhoutuu ja luodaan uudelleen ikään kuin se olisi uusi.
  • Osa toimintatilasta säilyy konfiguraatiomuutoksessa, mukaan lukien EditText -elementtien nykyiset arvot. Kaikille muille tiedoille on tallennettava nämä tiedot nimenomaisesti.
  • Tallenna aktiviteettitapatila OnSaveInStanceState () -menetelmässä.
  • Esimerkkitilatiedot tallennetaan yksinkertaisina avain-/arvopareina nipussa. Käytä nipun menetelmiä laittaaksesi tiedot ja saadaksesi tiedot takaisin nipusta.
  • Palauta esiintymistila oncreate (), joka on suositeltava tapa tai onrestoreInStancestate (). Takaisin