Today we ’ re going to see how to managing (keep and restore) state of Activities in Xamarin.Android-sovellus, jotta sovellus pysyy johdonmukaisena ja reaktiivinen kokoonpano / tila muutoksia.

Sisällysluettelo

miksi pitää ja palauttaa toiminnan tila?

kuten jo kuvasin postauksessani Androidin toiminnasta, käyttöjärjestelmä saattaa reagoida joihinkin ”jatkuviin” tilamuutoksiin kutsumalla elinkaarimenetelmiä aktiviteetin aikana, jotka ohjelmoija saattaa ohittaa lisätoimien toteuttamiseksi. Android-sovelluksissa on kuitenkin joitakin käyttäytymismalleja, jotka voivat muuttaa sen asetuksia, minkä jälkeen toiminnan tila (esimerkiksi: järjestely tai jotkin käyttöliittymäelementit tai valintaruudut) voi kadota, jos sitä ei käsitellä oikein.

antaa todellisen esimerkin: MoneyBack-sovelluksessa on päänäyttö, jossa on kaksi välilehteä. Huomasin, että kun toinen välilehti on valittu:

MoneyBack – 2nd tab selected

ja laitetta käännetään:

moneyback – 1.välilehti valittu pyörimisen jälkeen

ensimmäinen välilehti tulee valituksi. Käyttäjä menettää syötteensä (valinta 2.välilehti).

seulan linjanmuutos on yksi syy, miksi meidän pitäisi välittää toiminnan tilan pelastamisesta ja palauttamisesta.

Keeping state changes – onsaveinstancestate ()

jokainen toiminto mahdollistaa OnSaveInstanceState(Bundle outState) – menetelmän ohittamisen, jota kutsutaan kun nykyinen toiminto on tapettava (esim.kun laitteen näytön suunta muuttuu tai Androidin on lopetettava toiminta joidenkin resurssien vapauttamiseksi).

älä sekoita sitä toiminnan Elinkaarimenetelmiin (jotka olen jo kuvannut tässä), kuten OnPause() tai OnStop (), joita käyttöjärjestelmä kutsuu aina tietyn toiminnon tapahtuessa. OnSaveInstanceState () – menetelmää kutsutaan yleensä Onpausen () jälkeen ja ennen Onstopia (), mutta aina näin ei ole. Sitä ei esimerkiksi kutsuta lainkaan, kun käyttäjä navigoi Takaisin ActivityB: stä Activityaan, sillä tässä tapauksessa ActivityB: tä ei koskaan tapeta. Tarkemmat tiedot löytyvät virallisista Android-dokumenteista.

Onsaveinstancestaattia() kutsutaan Bundle-parametrilla. Se edustaa yksinkertaista avainarvosanakirjaa, joka on lisäksi sarjallistettu, joten sitä tulisi käyttää yksinkertaisten arvojen, kuten merkkijonojen, kokonaislukujen jne.tallentamiseen. On olemassa muita rakenteita ja tekniikoita tallentaa monimutkaisempia tietoja valtion muutoksia tapahtumia (Katso linkki ”yhteenveto” osassa tätä viestiä).

tällä hetkellä valitun välilehden tallentamiseksi menetelmä voidaan toteuttaa seuraavasti:

suojattu ohitusjäte onsaveinstancestate(Bundle outState)

var tabselectedposition = this.ActionBar.SelectedNavigationIndex;

outState.Putintti (”selectedTabPosition”, tabSelectedPosition);

base.OnSaveInstanceState (outState);

}

view raw onsaveinstancestate.cs isännöi ❤ by github

nyt jokainen näytön suunnan muutos tekee tästä menetelmästä kutsutun ja valitun välilehden indeksi tallennetaan Bundle outState-sanakirjaan ”selectedTabPosition” – näppäimen alle.

tilan muutosten palauttaminen – onrestoreinstancestate ()

heti kun backs to life-toimintaa jatketaan, kutsutaan käyttöjärjestelmäksi Onrestoreinstancestate (Bundle savedInstanceState) – menetelmää. Se kutsutaan vain, jos on tallennettu esimerkiksi pidetään kutsumalla OnSaveInstanceState() menetelmä ennen. Kuten näette, tämä menetelmä tulee myös Bundle parametri, joka on sama avain-arvo serialized sanakirja käytimme tallentaa toiminnan tila.

Jos välilehtien valinta palauttaa, voimme toteuttaa tämän menetelmän, kuten seuraava koodi esittää:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

var previouslySelectedTabPosition = savedInstanceState.GetInt(”selectedTabPosition”, 0);

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs hosted with ❤ by github

previously selectedtabposition-muuttuja alustetaan kokonaislukuarvolla Bundle-sanakirjasta, joka on tallennettu ”selectedTabPosition” – avaimeen, tai oletusarvolla (0), jos avaimelle ei löydy mitään tallennettua.

huomautus: Onrestoreinstancestatessa() annettu Bundle-parametri on täsmälleen sama, kuin onCreate-menetelmässä(Bundle bundle), jota kutsutaan Activityn luomiseksi. Voisimme itse asiassa myös hakea meidän tallennettu arvo siellä, mutta monissa tapauksissa palauttaa tilan (kuten valitsemalla aiemmin valittu välilehti) vaatii joitakin UI elementtejä on jo alustettu, joka olisi käsiteltävä sisällä OnCreate() menetelmä ennen. Siksi, että, mieluummin ehdottaa palauttaa toiminnan tila käyttäen OnRestoreInstanceState () yleissääntönä (tietenkin voi olla joitakin poikkeustapauksia😉). OnRestoreInstanceState () kutsutaan aina Oncreaten () jälkeen.

Lisäksi, jos halusimme käyttää Bundle-parametria OnCreate () – menetelmässä, meidän on tarkistettava joka kerta, jos bundle ei ole NULL (koska emme tiedä, onko onsaveinstancestate() oli kutsuttu aiemmin).

tämän seurauksena valitaan sama välilehti kuin aiemmin, vaikka laitetta olisi pyöritetty Moneybackin Pääaktiivisuudella:

MoneyBack – keeping tab selected when rotating

”Automatic” state changes handled by Android OS

Maybe you noted in your Android application, that every UI element needs need to be handle ”many” by implementing the over-used methods to save its state. Android suorittaa jonkinlaista” automaattista ” käyttöliittymän peruselementtien tilan tallentamista ja palauttamista.

sääntö tässä on, että niin kauan kuin KÄYTTÖLIITTYMÄELEMENTISSÄ (kuten TextView tai Button) on android:id asetettu .axml layout-tiedosto, OS hallinnoi automaattisesti näiden elementtien tiloja (esim.editext-tekstiin syötetty teksti).

esimerkiksi näin julistetussa Edittekstissä:

sen ominaisuudet (erityisesti tekstin ominaisuus) tallentuvat automaattisesti ja palautuvat näytön suunnanmuutoksissa.

Yhteenveto

olemme nähneet, miten käsitellä Android-toimintojen konfiguraatiomuutosten aiheuttamia tilamuutoksia (esim.näytön suunnan muutos, käyttöjärjestelmän toiminnan lopettaminen joidenkin resurssien vapauttamiseksi jne.) toteuttamalla OnSaveInstanceState () ja OnRestoreInstanceState (), jossa lisäsimme ja haimme avainarvotiedot Bundle serialized Dictionaryyn/Bundle serialized Dictionaryyn. Meidän tarvitsee vain muistaa, että näitä menetelmiä ei aina kutsuta (esim.navigoitaessa toimintojen välillä käyttämällä ”takaisin” – painiketta), joten näitä tulisi käyttää vain tietynlaisiin tilan muutoksiin.

olemme myös nähneet, että KÄYTTÖLIITTYMÄOHJAIMET Androidilla:layout-tiedostoissa määritellyillä id: llä kestävät konfiguraatiomuutoksia (hoitaa automaattisesti Android OS).

Nippusanakirja on sarjallistettu paremman suorituskyvyn ja muistin hyödyntämisen vuoksi, joten siihen tulee tallentaa vain yksinkertaisilla tyypeillä kirjoitettuja arvoja (kuten merkkijonoja tai kokonaislukuja). Jotta voidaan tallentaa monimutkaisempia tietoja, Android tarjoaa erilaisia mahdollisuuksia hallita sitä (esim.käyttämällä OnRetainNonConfigurationInstance).

Vastaa

Sähköpostiosoitettasi ei julkaista.