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 asetusten muutokseen.

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():iin 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