I Dag skal vi se, hvordan man styrer (beholder og gendanner) aktivitetsstatus i Ksamarin.Android-applikation for at holde appen konsistent og reaktiv til konfiguration/tilstandsændringer.

Indholdsfortegnelse

hvorfor holde og genoprette aktivitetens tilstand?

som jeg allerede har beskrevet i mit indlæg om Android-aktiviteter, kan operativsystemet reagere på nogle “konstante” tilstandsændringer ved at kalde livscyklusmetoder under aktivitetens liv, hvilket kan tilsidesættes af programmøren for at tage nogle yderligere handlinger. Der er dog nogle adfærd i Android-apps, der kan ændre dens konfiguration, hvorefter Aktivitetstilstanden (for eksempel: arrangement eller nogle UI-elementer eller afkrydsningsfelternes valg) kan gå tabt, hvis den ikke håndteres korrekt.

for at give dig et rigtigt eksempel: i MoneyBack-applikationen er der en hovedskærm med to faner. Jeg bemærkede, at når den anden fane er valgt:

MoneyBack – 2.fane valgt

og enheden roteres:

Moneyback – 1. fane valgt efter rotation

første fane bliver valgt. Brugeren mister sit input (valg af 2.fane).

Skærmorienteringsændring er en af grundene til, at vi skal bekymre os om at gemme og gendanne Aktivitetstilstande.

Keeping state changes – OnSaveInstanceState ()

hver aktivitet giver os mulighed for at tilsidesætte onsaveinstancestate(Bundle outState) metode, som kaldes, når den aktuelle aktivitet skal dræbes (f.eks. når enhedens skærmretning ændrer sig, eller aktiviteten skal dræbes af Android for at frigive nogle ressourcer).

vær venlig ikke at forveksle det med aktivitet livscyklus metoder (som jeg allerede beskrevet her), ligesom OnPause() eller OnStop (), som altid kaldes af OS, når en bestemt handling opstår. Onsaveinstancestate () metode kaldes generelt efter OnPause () og før OnStop (), men det er ikke altid tilfældet. For eksempel, det vil ikke blive kaldt på alle, når brugeren navigerer tilbage fra ActivityB til ActivityA, som i dette tilfælde ActivityB vil aldrig blive dræbt. Flere detaljer kan findes i officiel Android-dokumentation.

OnSaveInstanceState() kaldes med Bundle parameter forudsat. Det repræsenterer en simpel nøgleværdiordbog, som desuden er serialiseret, så den skal bruges til lagring af enkle værdier som strenge, heltal osv. Der er andre strukturer og teknikker til lagring af mere komplekse data om tilstandsændringshændelser (se linket i afsnittet “Oversigt” i dette indlæg).

for at gemme den aktuelt valgte fane kan vi implementere metoden som følger:

beskyttet tilsidesættelse void OnSaveInstanceState(Bundle outState)

var tabselectedposition = dette.ActionBar.Vælg navigationsindeks;

outState.PutInt (“selectedTabPosition”, tabSelectedPosition);

base.OnSaveInstanceState (outState);

}

se rå OnSaveInstanceState.cs, der er hostet med Kris by GitHub

nu vil hver skærmorienteringsændring gøre denne metode kaldet, og indekset for den valgte fane gemmes i Bundle outState dictionary under “selectedTabPosition” – tasten.

Gendannelse af tilstandsændringer – OnRestoreInstanceState ()

så snart den betragtede aktivitet er tilbage til livet (genoptages), kaldes OnRestoreInstanceState(Bundle savedInstanceState) – metoden af OS. Det vil kun blive kaldt, hvis der er en gemt instans holdes ved at kalde onsaveinstancestate() metode før. Som du kan se, leveres denne metode også med en Bundtparameter, som er den samme nøgleværdi serialiserede ordbog, som vi brugte til at gemme aktivitetens tilstand.

i tilfælde af gendannelse af faner, kan vi implementere denne metode, som følgende kode præsenterer:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

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

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs hostet med Kris by GitHub

previouslySelectedTabPosition-variablen initialiseres med heltalværdi fra Bundle dictionary gemt under “selectedTabPosition” – tasten eller standardværdi (0), hvis der ikke findes noget gemt til nøglen.

Bemærk: Bundtparameter, der findes i OnRestoreInstanceState (), er nøjagtig den samme som den, der er tilgængelig i onCreate(Bundle bundle) – metoden kaldet Activity ‘ s creation. Vi kunne faktisk også hente vores gemte værdi der, men i mange tilfælde genoprette tilstanden (som at vælge tidligere valgt fane) kræver, at nogle UI-elementer allerede er initialiseret, som skal håndteres inden for OnCreate () – metoden før. På grund af det vil jeg hellere foreslå at genoprette aktivitetens tilstand ved hjælp af OnRestoreInstanceState() som en generel regel (selvfølgelig kan der være nogle ekstraordinære tilfælde. OnRestoreInstanceState () vil altid blive kaldt efter OnCreate ().

desuden, hvis vi ønskede at bruge Bundle parameter i OnCreate() metode, ville vi nødt til at kontrollere hver gang, hvis bundle er IKKE NULL (som vi ikke ved, om OnSaveInstanceState() var blevet kaldt før).

som følge heraf vælges den samme fane som tidligere, selv efter at enheden er drejet på Moneybacks hovedaktivitet:

Moneyback – keeping tab valgt, når du roterer

“automatiske” tilstandsændringer håndteret af Android OS

måske har du bemærket i din Android-applikation, at ikke alle UI-elementer skal håndteres “manuelt” ved at implementere ovennævnte metoder for at gemme dens tilstand. Android udfører en slags “Automatisk” lagring og gendannelse af grundlæggende UI-elementers tilstande.

reglen her er, at så længe UI-elementet (som tekstvisning eller knap) har sin android:id indstillet .os administrerer automatisk disse elementers tilstande (f.eks.

for eksempel til Redigeringtekst erklæret sådan:

dens egenskaber (især dens Tekstegenskab) gemmes automatisk og gendannes ved ændringer i skærmretningen.

oversigt

Vi har set, hvordan man håndterer Android-aktiviteters tilstandsændringer forårsaget af konfigurationsændring (f.eks.) ved at implementere OnSaveInstanceState () og OnRestoreInstanceState (), hvor vi tilføjede og hentede nøgledata til/fra Bundle serialiseret ordbog. Vi skal bare huske, at disse metoder ikke altid kaldes (f.eks. når du navigerer mellem aktiviteter ved hjælp af “tilbage” – knappen), så disse bør kun bruges til visse slags tilstandsændringer.

Vi har også set, at UI-kontroller med deres android:id defineret i layoutfiler har deres tilstande resistente for konfigurationsændringer (håndteres automatisk af Android OS).Bundle dictionary er serialiseret for bedre ydeevne og hukommelsesudnyttelse, så kun enkle indtastede værdier skal gemmes i den (som strenge eller heltal). For at gemme mere komplekse data giver Android forskellige muligheder for at styre dem (f.eks.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.