vandaag gaan we bekijken hoe de activiteitsstatus in Xamarin beheerd (behouden en herstellen) kan worden.Android-applicatie om de app consistent en reactief te houden voor configuratie / statuswijzigingen.

inhoudsopgave

waarom de status van activiteit behouden en herstellen?

zoals ik al heb beschreven in mijn bericht over Android-activiteiten, kan het besturingssysteem reageren op een aantal “constante” statuswijzigingen door lifecycle-methoden aan te roepen tijdens het leven van de activiteit, die door de programmeur kunnen worden overschreven om wat extra acties te ondernemen. Echter, er zijn een aantal gedragingen in Android-apps die de configuratie kan wijzigen, waarna de toestand van de activiteit (bijvoorbeeld: arrangement of sommige UI-elementen of selectievakjes’) kan verloren gaan als niet goed behandeld.

om u een echt voorbeeld te geven: in de toepassing MoneyBack is er een hoofdscherm met twee tabbladen. Ik heb gemerkt dat, wanneer het tweede tabblad is geselecteerd:

Geld – 2e tabblad geselecteerd

en het apparaat wordt gedraaid:

Geld – 1e tabblad geselecteerd na het draaien

het eerste tabblad wordt geselecteerd. Gebruiker verliest zijn input (selectie van het 2e tabblad).

verandering van schermoriëntatie is een van de redenen waarom we ons moeten bekommeren om het opslaan en herstellen van de status van activiteiten.

statuswijzigingen bijhouden – OnSaveInstanceState ()

elke activiteit stelt ons in staat om de methode OnSaveInstanceState(Bundle outState) te overschrijven, die wordt aangeroepen wanneer de huidige activiteit moet worden uitgeschakeld (bijvoorbeeld wanneer de schermoriëntatie van het apparaat verandert of de activiteit moet worden uitgeschakeld door Android om enkele bronnen vrij te geven).

verwar het alsjeblieft niet met Activity Lifecycle methoden (die ik hier al heb beschreven), zoals OnPause() of OnStop() die altijd door het besturingssysteem worden aangeroepen wanneer een bepaalde actie plaatsvindt. OnSaveInstanceState () methode wordt over het algemeen genoemd na OnPause() en voor OnStop(), maar het is niet altijd het geval. Bijvoorbeeld, het zal niet worden aangeroepen op alle wanneer de gebruiker navigeert terug van ActivityB naar ActivityA, zoals in dit geval ActivityB zal nooit worden gedood. Meer details zijn te vinden in de officiële Android documentatie.

OnSaveInstanceState () wordt aangeroepen met bundel parameter opgegeven. Het vertegenwoordigt een eenvoudig sleutel-waarde woordenboek, dat bovendien wordt geserialiseerd, dus het moet worden gebruikt voor het opslaan van eenvoudige waarden zoals strings, gehele getallen etc. Er zijn andere structuren en technieken voor het opslaan van meer complexe gegevens over gebeurtenissen van toestandsveranderingen (zie de link in “Samenvatting” sectie van dit bericht).

om op te slaan geselecteerde tabblad, kunnen wij de uitvoering van de methode als volgt:

protected override void OnSaveInstanceState(Bundel outState)

{

var tabSelectedPosition = dit.ActionBar.SelectedNavigationIndex;

outState.PutInt (“selectedTabPosition”, tabSelectedPosition);

basis.OnSaveInstanceState (outState);

}

bekijk ruwe OnSaveInstanceState.cs gehost met ❤ by GitHub

nu zal elke schermoriëntatie verandering deze methode aanroepen en de index van het geselecteerde tabblad zal worden opgeslagen in Bundle outState dictionary onder” selectedTabPosition ” sleutel.

statuswijzigingen herstellen-OnRestoreInstanceState ()

zodra de beschouwde activiteit weer tot leven komt (wordt hervat), wordt de methode OnRestoreInstanceState(Bundle savedInstanceState) aangeroepen door het besturingssysteem. Het zal alleen worden aangeroepen als er een opgeslagen instantie gehouden door het aanroepen van onsaveinstancestate() methode voor. Zoals je kunt zien, wordt deze methode ook geleverd met een bundel parameter, die hetzelfde sleutelwaarde serialized woordenboek is dat we hebben gebruikt voor het opslaan van de status van de activiteit.

in het geval van het herstellen van tabs selectie, kunnen we deze methode implementeren als de volgende code presenteert:

protected override void OnRestoreInstanceState(Bundle savedInstanceState)

{

base.OnRestoreInstanceState(savedInstanceState);

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

this.ActionBar.SetSelectedNavigationItem(previouslySelectedTabPosition);

}

view raw OnRestoreInstanceState.cs gehost met ❤ door GitHub

eerder geselecteerde tabposition variabele zal worden geïnitialiseerd met integer waarde uit Bundel woordenboek opgeslagen onder “selectedTabPosition” sleutel, of standaard waarde (0) als er niets is opgeslagen voor de sleutel.

opmerking: Bundelparameter gegeven in OnRestoreInstanceState () is precies hetzelfde, als degene die beschikbaar is in oncreate (Bundle bundle) methode die wordt aangeroepen bij het aanmaken van activiteit. We kunnen eigenlijk ook onze opgeslagen waarde daar ophalen, maar in veel gevallen het herstellen van de status (zoals het selecteren van eerder geselecteerde tabblad) vereist dat sommige UI-elementen al geïnitialiseerd zijn, die eerder binnen de oncreate() methode moeten worden afgehandeld. Vanwege dat, ik zou liever voorstellen om de staat van de activiteit te herstellen met behulp van OnRestoreInstanceState () als algemene regel (natuurlijk kunnen er een aantal uitzonderlijke gevallen 😉 ). OnRestoreInstanceState () zal altijd worden aangeroepen na OnCreate ().

bovendien, als we Bundle parameter in oncreate() methode willen gebruiken, zouden we elke keer moeten controleren of bundel niet NULL is (omdat we niet weten of OnSaveInstanceState() eerder was aangeroepen).

hierdoor wordt hetzelfde tabblad als voorheen geselecteerd, zelfs na het draaien van het apparaat op de hoofdactiviteit van MoneyBack:

MoneyBack – tabblad behouden geselecteerd bij draaien

” automatische “statuswijzigingen afgehandeld door Android OS

misschien is het u opgevallen in uw Android-applicatie, dat niet elk UI-element” handmatig ” moet worden behandeld door de bovengenoemde methoden te implementeren om de status op te slaan. Android voert een soort van “automatische” opslaan en herstellen van fundamentele UI-elementen’ Staten.

de regel hier is dat zolang UI element (zoals TextView of Button) zijn android:id heeft ingesteld .axml lay-out bestand, OS zal automatisch die elementen’ toestanden beheren (bijvoorbeeld tekst ingevoerd in EditText).

bijvoorbeeld, voor EditText die zo is gedeclareerd:

zijn eigenschappen (vooral zijn Teksteigenschap) zullen automatisch worden opgeslagen en hersteld op schermrichtingswijzigingen.

samenvatting

We hebben gezien hoe we met statuswijzigingen van Android-activiteiten moeten omgaan die worden veroorzaakt door configuratiewijzigingen (bijvoorbeeld verandering van schermoriëntatie, activiteit die wordt uitgeschakeld door het besturingssysteem om enkele bronnen vrij te maken, enz.) door OnSaveInstanceState () en OnRestoreInstanceState () te implementeren, waar we key-value data aan/uit Bundel serialized dictionary hebben toegevoegd en opgehaald. We hoeven alleen maar te onthouden dat deze methoden niet altijd worden aangeroepen (bijvoorbeeld bij het navigeren tussen activiteiten met behulp van de “terug” knop), dus deze moeten alleen worden gebruikt voor bepaalde soorten statuswijzigingen.

we hebben ook gezien dat UI-besturingselementen met hun android:id gedefinieerd in lay-outbestanden hun status resistent hebben voor configuratiewijzigingen (automatisch afgehandeld door Android OS).

bundel woordenboek is geserialiseerd voor betere prestaties en geheugengebruik, dus alleen eenvoudig getypte waarden moeten worden opgeslagen in het (zoals strings of gehele getallen). Om meer complexe gegevens op te slaan, Android biedt verschillende mogelijkheden om het te beheren (bijvoorbeeld met behulp van Onretinnonconfigurationinstance).

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.