astăzi vom vedea cum să gestionăm (să păstrăm și să restaurăm) starea activităților în Xamarin.Aplicație Android pentru a menține aplicația consecventă și reactivă pentru modificările de configurare/stare.

cuprins

De ce să păstrăm și să restabilim starea activității?

așa cum am descris deja în postarea mea despre activitățile Android, Sistemul de operare poate reacționa la unele modificări de stare „constante” apelând metode ale ciclului de viață în timpul vieții activității, care pot fi înlocuite de programator pentru a întreprinde unele acțiuni suplimentare. Cu toate acestea, există unele comportamente în aplicațiile Android care îi pot schimba configurația, după care starea activității (de exemplu: aranjament sau unele elemente UI sau selecțiile casetelor de selectare) poate fi pierdută dacă nu este tratată corect.

pentru a vă oferi un exemplu real: în aplicația MoneyBack există un ecran principal cu două file. Am observat că atunci când este selectată a doua filă:

MoneyBack – a 2 – a filă selectată

și dispozitivul este rotit:

moneyback-fila 1 selectată după rotirea

prima filă devine selectată. Utilizatorul își pierde intrarea (selectarea filei a 2-a).

schimbarea orientării ecranului este unul dintre motivele pentru care ar trebui să ne pese de salvarea și restabilirea stărilor activităților.

păstrarea modificărilor de stat – OnSaveInstanceState ()

fiecare activitate ne permite să suprascrie OnSaveInstanceState(Bundle outState) metodă, care se numește atunci când activitatea curentă este de a fi ucis (de exemplu, atunci când orientarea ecranului dispozitivului se schimbă sau activitatea trebuie să fie ucis de Android, în scopul de a elibera unele resurse).

vă rugăm să nu o confundați cu metodele ciclului de viață al activității (pe care le-am descris deja aici), cum ar fi OnPause() sau OnStop() care sunt întotdeauna apelate de sistemul de operare atunci când are loc o anumită acțiune. OnSaveInstanceState () metoda este, în general, numit după OnPause() și înainte de OnStop (), dar nu este întotdeauna cazul. De exemplu, nu va fi apelat deloc atunci când utilizatorul navighează înapoi de la ActivityB la ActivityA, deoarece în acest caz ActivityB nu va fi ucis niciodată. Mai multe detalii pot fi găsite în documentația oficială Android.

OnSaveInstanceState() se numește cu parametrul Bundle furnizat. Acesta reprezintă un simplu dicționar cheie-valoare, care este în plus serializat, deci ar trebui să fie utilizat pentru stocarea valori simple, cum ar fi siruri de caractere, numere întregi etc. Există și alte structuri și tehnici pentru stocarea de date mai complexe cu privire la schimbările de stat evenimente (A se vedea link-ul din „Rezumat” secțiune a acestui post).

pentru a salva fila selectată în prezent, putem implementa metoda după cum urmează:

protejat override void OnSaveInstanceState(Bundle outState)

{

var tabselectedposition = aceasta.ActionBar.Selectednavigationindex;

outState.PutInt („selectedTabPosition”, tabSelectedPosition);

bază.Onsaveinstancestate (outState);

}

vezi onsaveinstancestate brut.acum, fiecare schimbare de orientare a ecranului va face această metodă apelată și indexul filei selectate va fi salvat în dicționarul Bundle outState sub tasta „selectedTabPosition”.

restaurarea modificărilor de stare – OnRestoreInstanceState ()

De îndată ce activitatea considerată revine la viață (este reluată), metoda OnRestoreInstanceState(Bundle savedInstanceState) este apelată de sistemul de operare. Acesta va fi apelat numai dacă există o instanță salvată păstrată apelând metoda OnSaveInstanceState() înainte. După cum puteți vedea, această metodă vine și cu un parametru Bundle, care este același dicționar serializat cheie-valoare pe care l-am folosit pentru salvarea stării activității.

în cazul restaurării selecției filelor, putem implementa această metodă după cum prezintă următorul cod:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

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

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs găzduit cu de github de github

anterior variabila selectedtabposition va fi inițializat cu valoarea întreg din dicționar pachet salvat sub „selectedTabPosition” cheie, sau valoarea implicită (0) dacă nimic salvat pentru cheia este găsit.

notă: parametrul Bundle furnizat în OnRestoreInstanceState() este exact același, ca și cel Disponibil în OnCreate(Bundle bundle) metoda numită crearea activității. De fapt, am putea prelua și valoarea salvată acolo, dar în multe cazuri restaurarea stării (cum ar fi selectarea filei selectate anterior) necesită ca unele elemente UI să fie deja inițializate, care ar trebui tratate în OnCreate() metoda înainte. Din această cauză, aș sugera mai degrabă restabilirea stării activității folosind OnRestoreInstanceState() ca regulă generală (desigur, pot exista unele cazuri excepționale ). OnRestoreInstanceState () va fi întotdeauna apelat după OnCreate ().

Mai mult decât atât, dacă am vrut să folosească parametrul Bundle în OnCreate() metoda, am avea nevoie pentru a verifica de fiecare dată dacă bundle nu este nul (așa cum nu știm dacă OnSaveInstanceState() a fost numit înainte).

ca rezultat, aceeași filă ca și anterior este selectat chiar și după rotirea dispozitivului pe MainActivity MoneyBack lui:

fila de păstrare a banilor selectată la rotirea

modificări de stare „automate” gestionate de sistemul de operare Android

poate ați observat în aplicația dvs. Android efectuează un fel de salvare și restaurare „automată” a stărilor elementelor UI de bază.

regula Aici este că, atâta timp cât elementul UI (cum ar fi TextView sau buton) are android sale:id-ul setat în .fișier aspect axml, sistemul de operare va gestiona automat stările acestor elemente (de exemplu, textul introdus în EditText).

de exemplu, pentru EditText declarat astfel:

proprietățile sale (în special proprietatea textului) vor fi salvate și restaurate automat la modificările de orientare a ecranului.

rezumat

am văzut cum să gestionăm modificările de stare ale activităților Android cauzate de modificarea configurației (de exemplu, schimbarea orientării ecranului, activitatea fiind ucisă de sistemul de operare pentru a elibera unele resurse etc.) prin punerea în aplicare OnSaveInstanceState () și OnRestoreInstanceState (), în cazul în care am adăugat și preluate date cheie-valoare la/de la Bundle dicționar serializat. Trebuie doar să ne amintim că aceste metode nu sunt întotdeauna numite (de exemplu, atunci când navigați între activități folosind butonul „înapoi”), deci acestea ar trebui utilizate numai pentru anumite tipuri de modificări de stare.

am văzut, de asemenea, că controalele UI cu android lor:id-ul definit în fișierele de aspect au stările lor rezistente pentru modificările de configurare (manipulate automat de sistemul de operare Android).

Bundle dictionary este serializat pentru o performanță mai bună și utilizarea memoriei, astfel încât numai valorile simple tastate ar trebui să fie stocate în ea (cum ar fi siruri de caractere sau numere întregi). Pentru a stoca date mai complexe, Android oferă diferite posibilități de gestionare a acestora (de exemplu, folosind OnRetainNonConfigurationInstance).

Lasă un răspuns

Adresa ta de email nu va fi publicată.