használatával ma meglátjuk, hogyan lehet kezelni (megtartani és visszaállítani) a tevékenységek állapotát a Xamarin-ban.Android alkalmazás annak érdekében, hogy az alkalmazás konzisztens és reaktív legyen a konfigurációs/állapotváltozásokra.

Tartalomjegyzék

miért kell tartani és visszaállítani a tevékenység állapotát?

amint azt az Android tevékenységekről szóló bejegyzésemben már leírtam, az operációs rendszer reagálhat néhány “állandó” állapotváltozásra azáltal, hogy életciklus-módszereket hív meg a tevékenység életében, amelyeket a programozó felülbírálhat néhány további művelet végrehajtása érdekében. Vannak azonban olyan viselkedések az Android-alkalmazásokban, amelyek megváltoztathatják a konfigurációt, amely után a tevékenység állapota (például: elrendezés vagy egyes felhasználói felület elemek vagy jelölőnégyzetek kiválasztása) elveszhet, ha nem kezelik megfelelően.

ahhoz, hogy egy igazi példa: a MoneyBack alkalmazás van egy főképernyőn két lapot. Észrevettem, hogy amikor a második lap van kiválasztva:

moneyback – 2nd lap kiválasztva

és a készülék el van forgatva:

pénzvisszafizetés – az elforgatás után kiválasztott 1.lap

első lap lesz kiválasztva. A felhasználó elveszíti bemenetét (a 2.lap kiválasztása).

a képernyő tájolásának megváltoztatása az egyik oka annak, hogy törődnünk kell a tevékenységek állapotának mentésével és helyreállításával.

az állapotváltozások megtartása-OnSaveInstanceState ()

minden tevékenység lehetővé teszi számunkra, hogy felülbíráljuk az OnSaveInstanceState(Bundle outState) módszert, amelyet akkor hívnak meg, amikor az aktuális tevékenységet meg kell ölni (például amikor az eszköz képernyő tájolása megváltozik, vagy a tevékenységet az Androidnak meg kell ölnie bizonyos erőforrások felszabadítása érdekében).

kérjük, ne keverje össze az Activity Lifecycle módszerekkel (amelyeket itt már leírtam), mint például az OnPause () vagy az OnStop (), amelyeket az operációs rendszer mindig hív, amikor egy adott művelet bekövetkezik. Az OnSaveInstanceState() metódust általában OnPause () és onstop () után hívják, de ez nem mindig így van. Például egyáltalán nem hívják meg, amikor a felhasználó visszatér az ActivityB-ről az ActivityA-ra, mivel ebben az esetben az ActivityB soha nem lesz megölve. További részletek a hivatalos Android dokumentációban találhatók.

OnSaveInstanceState () hívják Bundle paraméter biztosított. Ez egy egyszerű kulcs-érték szótárt képvisel, amely emellett sorosított, ezért egyszerű értékek, például karakterláncok, egész számok stb. Vannak más struktúrák és technikák a bonyolultabb adatok tárolására az Állapotváltozási eseményekről (lásd a linket a bejegyzés “összefoglaló” szakaszában).

annak érdekében, hogy mentse az aktuálisan kiválasztott lap, tudjuk végrehajtani a módszert az alábbiak szerint:

védett felülbírálása void OnSaveInstanceState(Bundle outState)

{

var tabselectedposition = ez.ActionBar.SelectedNavigationIndex;

outState.PutInt (“selectedTabPosition”, tabSelectedPosition);

bázis.OnSaveInstanceState (outState);

}

nyers OnSaveInstanceState megtekintése.cs hosted with ++ by GitHub

most, minden képernyő tájolás változás teszi ezt a módszert hívják, és az index a kiválasztott lap kerül mentésre Bundle outState dictionary alatt “selectedTabPosition” gombot.

állapotváltozások visszaállítása-OnRestoreInstanceState()

amint a figyelembe vett tevékenység életre kel (folytatódik), az ONRESTOREINSTANCESTATE(Bundle savedInstanceState) módszert az operációs rendszer hívja. Csak akkor hívják meg, ha van egy Mentett példány, amelyet az OnSaveInstanceState() metódus hívásával tartanak fenn. Mint látható, ez a módszer egy Kötegparaméterrel is rendelkezik, amely ugyanaz a kulcs-érték sorosított szótár, amelyet a tevékenység állapotának mentéséhez használtunk.

fülek kiválasztása esetén visszaállíthatjuk ezt a módszert a következő kód bemutatásával:

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

previouslySelectedTabPosition változó inicializálódik egész értéket Bundle szótár mentett a “selectedTabPosition” gombot, vagy az alapértelmezett érték (0), ha nem mentett a kulcs található.

megjegyzés: Bundle paraméter megadott OnRestoreInstanceState () pontosan ugyanaz, mint az egyik elérhető OnCreate(Bundle bundle) módszer hívott tevékenység létrehozása. Valójában ott is lekérhetjük a mentett értékünket, de sok esetben az állapot visszaállítása (például a korábban kiválasztott fül kiválasztása) megköveteli, hogy néhány UI elemet már inicializáljanak, amelyeket korábban az OnCreate() metóduson belül kell kezelni. Emiatt inkább azt javaslom, hogy visszaállítsa a tevékenység állapotát az OnRestoreInstanceState() használatával általános szabályként(természetesen lehetnek kivételes esetek). OnRestoreInstanceState () mindig hívják után OnCreate ().

Továbbá, ha a Bundle paramétert az OnCreate() metódusban szeretnénk használni, akkor minden alkalommal ellenőriznünk kell, hogy a bundle nem NULL-e (mivel nem tudjuk, hogy az OnSaveInstanceState () – t korábban hívták-e).

ennek eredményeként ugyanazt a lapot választja ki, mint korábban, még akkor is, ha az eszközt elforgatja a MoneyBack MainActivity-jén:

MoneyBack – keeping fül kiválasztva forgatáskor

” automatikus “állapotváltozások által kezelt Android OS

talán észrevette az Android alkalmazás, hogy nem minden UI elem kell kezelni” kézzel ” végrehajtásával a fent említett módszerek annak érdekében, hogy mentse az állam. Az Android valamilyen “automatikus” mentést és helyreállítást hajt végre az alapvető felhasználói felület elemeinek állapotaiban.

a szabály itt az, hogy mindaddig, amíg UI elem (mint TextView vagy gomb) megvan a android:id beállítva .axml layout file, az operációs rendszer automatikusan kezeli az elemek állapotát (például az EditText-be bevitt szöveget).

például az így deklarált EditText esetében:

tulajdonságai (különösen a szöveg tulajdonsága) automatikusan mentésre kerülnek és visszaállnak a képernyő tájolásának változásakor.

Összefoglalás

láttuk, hogyan kell kezelni az Android tevékenységek állapotváltozásait, amelyeket a konfiguráció módosítása okoz (pl. képernyő tájolás megváltoztatása, az operációs rendszer által megölt tevékenység bizonyos erőforrások felszabadítása érdekében stb.) az OnSaveInstanceState () és az OnRestoreInstanceState () implementálásával, ahol kulcsérték-adatokat adtunk hozzá a Bundle serialized dictionary-hez/ – ből. Csak arra kell emlékeznünk, hogy ezeket a módszereket nem mindig hívják meg (például amikor a tevékenységek között a “Vissza” gombbal navigálunk), ezért ezeket csak bizonyos állapotváltozásokhoz szabad használni.

azt is láttuk, hogy UI ellenőrzések azok android: id meghatározott elrendezési fájlok állapotuk ellenálló konfigurációs változások (automatikusan kezeli az Android OS).

a Bundle dictionary sorosított a jobb teljesítmény és a memória kihasználása érdekében, ezért csak egyszerű típusú értékeket kell tárolni benne (például karakterláncok vagy egész számok). A bonyolultabb adatok tárolása érdekében az Android különböző kezelési lehetőségeket kínál (például az Onretainnonkonfigurationinstance használatával).

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.