dzisiaj zobaczymy, jak zarządzać (zachować i przywrócić) stanem aktywności w Xamarin.Aplikacja na Androida w celu utrzymania spójności aplikacji i reaktywności w przypadku zmian konfiguracji/stanu.

spis treści

dlaczego zachować i przywrócić stan aktywności?

jak już opisałem w moim poście o działaniach na Androidzie, System Operacyjny może reagować na pewne „stałe” zmiany stanu, wywołując metody cyklu życia podczas życia aktywności, które mogą zostać nadpisane przez programistę w celu podjęcia dodatkowych działań. Istnieją jednak pewne zachowania w aplikacjach na Androida, które mogą zmienić jego konfigurację, po czym stan aktywności (na przykład: układ lub niektóre elementy interfejsu użytkownika lub zaznaczenia pól wyboru) może zostać utracony, jeśli nie zostanie poprawnie obsłużony.

aby dać ci prawdziwy przykład: w aplikacji MoneyBack znajduje się główny ekran z dwiema zakładkami. Zauważyłem, że po wybraniu drugiej zakładki:

MoneyBack – druga zakładka wybrana

i urządzenie jest obrócone:

moneyback – pierwsza karta wybrana po obróceniu

pierwsza karta zostanie wybrana. Użytkownik traci swoje dane wejściowe (wybór drugiej zakładki).

zmiana orientacji ekranu jest jednym z powodów, dla których powinniśmy dbać o zapisywanie i przywracanie Stanów aktywności.

zachowanie zmian stanu – OnSaveInstanceState ()

każda aktywność pozwala nam nadpisać metodę Onsaveinstancestate(Bundle outState), która jest wywoływana, gdy bieżąca aktywność ma zostać zabita (np. gdy zmienia się orientacja ekranu urządzenia lub aktywność musi zostać zabita przez Androida w celu uwolnienia niektórych zasobów).

proszę nie mylić tego z metodami cyklu życia aktywności (które już opisałem), takimi jak OnPause() lub OnStop (), które są zawsze wywoływane przez system operacyjny, gdy dana akcja występuje. Metoda OnSaveInstanceState() jest zwykle wywoływana po onpause () i przed OnStop (), ale nie zawsze tak jest. Na przykład, nie będzie wywoływana w ogóle, gdy użytkownik powróci z ActivityB do ActivityA, ponieważ w tym przypadku ActivityB nigdy nie zostanie zabita. Więcej szczegółów można znaleźć w oficjalnej dokumentacji Androida.

onsaveinstancestate() jest wywoływana z podanym parametrem Bundle. Reprezentuje prosty słownik klucz-wartość, który jest dodatkowo serializowany, więc powinien być używany do przechowywania prostych wartości, takich jak ciągi znaków, liczby całkowite itp. Istnieją inne struktury i techniki przechowywania bardziej złożonych danych o zdarzeniach zmian stanu (patrz link w sekcji „Podsumowanie” tego postu).

aby zapisać aktualnie wybraną kartę, możemy zaimplementować metodę w następujący sposób:

protected override void onsaveinstancestate(Bundle outState)

{

var tabselectedposition = this.ActionBar.SelectedNavigationIndex;

outState.PutInt („selectedTabPosition”, tabSelectedPosition);

OnSaveInstanceState (outState);

}

zobacz raw onsaveinstancestate.cs hosted with ❤ by GitHub

teraz, każda zmiana orientacji ekranu spowoduje wywołanie tej metody, A Indeks wybranej karty zostanie zapisany do słownika Outstate Bundle pod kluczem „selectedTabPosition”.

Przywracanie zmian stanu – OnRestoreInstanceState ()

gdy tylko rozważana aktywność powraca do życia (jest wznawiana), metoda ONRESTOREINSTANCESTATE(Bundle savedInstanceState) jest wywoływana przez system operacyjny. Zostanie wywołana tylko wtedy, gdy istnieje zachowana instancja przez wywołanie metody onsaveinstancestate (). Jak widać, ta metoda zawiera również parametr Bundle, który jest tym samym serializowanym słownikiem klucz-wartość, którego użyliśmy do zapisania stanu aktywności.

w przypadku przywracania wyboru kart możemy zaimplementować tę metodę w następujący sposób:

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 variable will be initialized with integer value from Bundle dictionary saved under „selectedTabPosition” key, or default value (0) if not saved for the key is found.

Uwaga: parametr Bundle podany w onrestoreinstancestate() jest dokładnie taki sam, jak ten dostępny w metodzie OnCreate(Bundle bundle) wywołanej podczas tworzenia Activity. Moglibyśmy tam również pobrać zapisaną wartość, ale w wielu przypadkach przywrócenie stanu (np. wybranie wcześniej wybranej karty) wymaga, aby niektóre elementy interfejsu użytkownika były już zainicjowane, co powinno być wcześniej obsługiwane w metodzie OnCreate (). Z tego powodu wolałbym raczej sugerować przywrócenie stanu aktywności za pomocą onrestoreinstancestate () jako ogólnej zasady (oczywiście mogą być pewne wyjątkowe przypadki😉). Onrestoreinstancestate () będzie zawsze wywoływana po OnCreate ().

ponadto, gdybyśmy chcieli użyć parametru Bundle w metodzie OnCreate (), musielibyśmy za każdym razem sprawdzać, czy bundle nie jest równe NULL (ponieważ nie wiemy, czy OnSaveInstanceState() była wcześniej wywoływana).

w rezultacie, ta sama zakładka, co poprzednio jest zaznaczona nawet po obróceniu urządzenia na głównej aktywności MoneyBack:

MoneyBack – keeping tab selected when rotating

„Automatic” state changes handed by Android OS

być może zauważyłeś w swojej aplikacji na Androida, że nie każdy element interfejsu użytkownika musi być obsługiwany „ręcznie” poprzez implementację wyżej wymienionych metod w celu zapisania jego stanu. Android wykonuje pewnego rodzaju „automatyczne” zapisywanie i przywracanie Stanów podstawowych elementów interfejsu użytkownika.

regułą jest to, że tak długo, jak element UI (taki jak TextView lub Button) ma ustawiony android:id .plik układu axml, OS będzie automatycznie zarządzać Stanami tych elementów (np. tekst wprowadzony do EditText).

na przykład dla EditText zadeklarowanego w ten sposób:

jego właściwości (zwłaszcza właściwości tekstowe) zostaną automatycznie zapisane i przywrócone przy zmianie orientacji ekranu.

podsumowanie

widzieliśmy, jak obsługiwać zmiany stanu działań Androida spowodowane modyfikacją konfiguracji (np. zmiana orientacji ekranu, aktywność zabijana przez system operacyjny w celu uwolnienia niektórych zasobów itp.) poprzez implementację onsaveinstancestate () i onrestoreinstancestate (), gdzie dodaliśmy i pobraliśmy dane wartości klucza do / z seryjnego słownika pakietu. Musimy tylko pamiętać, że metody te nie zawsze są wywoływane (np. podczas poruszania się między działaniami za pomocą przycisku „wstecz”), więc powinny być używane tylko do pewnych zmian stanu.

zauważyliśmy również, że kontrolki UI z ich identyfikatorem android:ID zdefiniowanym w plikach układów mają swoje stany odporne na zmiany konfiguracji (obsługiwane automatycznie przez system operacyjny Android).

Bundle dictionary jest serializowany dla lepszej wydajności i wykorzystania pamięci, więc tylko proste wpisane wartości powinny być przechowywane w nim (jak ciągi znaków lub liczby całkowite). W celu przechowywania bardziej złożonych danych, Android oferuje różne możliwości zarządzania nimi (np. przy użyciu OnRetainNonConfigurationInstance).

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.