Procedura dettagliata - Salvataggio dello stato dell'attività

La teoria alla base del salvataggio dello stato è stata illustrata nella guida al ciclo di vita delle attività; ora, esaminiamo un esempio.

Procedura dettagliata sullo stato dell'attività

Aprire il progetto ActivityLifecycle_Start , compilarlo ed eseguirlo. Si tratta di un progetto molto semplice che include due attività per illustrare il ciclo di vita delle attività e come vengono chiamati i vari metodi del ciclo di vita. Quando si avvia l'applicazione, viene visualizzata la schermata di MainActivity :

Schermata Attività A

Visualizzazione delle transizioni di stato

Ogni metodo in questo esempio scrive nella finestra di output dell'applicazione IDE per indicare lo stato dell'attività. Per aprire la finestra di output in Visual Studio, digitare CTRL-ALT-O; per aprire la finestra di output in Visual Studio per Mac, fare clic su Visualizza > riquadri > di output dell'applicazione.

All'avvio dell'app, nella finestra di output vengono visualizzate le modifiche di stato dell'attività A:

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Quando si fa clic sul pulsante Avvia attività B , viene visualizzata la sospensione e l'arresto dell'attività A mentre l'attività B passa attraverso le modifiche dello stato:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.SecondActivity] Activity B - OnCreate
[ActivityLifecycle.SecondActivity] Activity B - OnStart
[ActivityLifecycle.SecondActivity] Activity B - OnResume
[ActivityLifecycle.MainActivity] Activity A - OnStop

Di conseguenza, l'attività B viene avviata e visualizzata al posto dell'attività A:

Schermata B dell'attività

Quando si fa clic sul pulsante Indietro, l'attività B viene eliminata definitivamente e l'attività A viene ripresa:

[ActivityLifecycle.SecondActivity] Activity B - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnRestart
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume
[ActivityLifecycle.SecondActivity] Activity B - OnStop
[ActivityLifecycle.SecondActivity] Activity B - OnDestroy

Aggiunta di un contatore click

Successivamente, si modificherà l'applicazione in modo che sia presente un pulsante che conta e visualizzi il numero di volte in cui viene fatto clic. Aggiungere prima di tutto una _counter variabile di istanza a MainActivity:

int _counter = 0;

Modificare quindi il file di layout Resource/layout/Main.axml e aggiungere un nuovo clickButton oggetto che visualizza il numero di volte in cui l'utente ha fatto clic sul pulsante. Il file Main.axml risultante dovrebbe essere simile al seguente:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <Button
        android:id="@+id/myButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/mybutton_text" />
    <Button
        android:id="@+id/clickButton"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="@string/counterbutton_text" />
</LinearLayout>

Aggiungere ora il codice seguente alla fine del metodo OnCreate in MainActivity . Questo codice gestisce gli eventi click da clickButton:

var clickbutton = FindViewById<Button> (Resource.Id.clickButton);
clickbutton.Text = Resources.GetString (
    Resource.String.counterbutton_text, _counter);
clickbutton.Click += (object sender, System.EventArgs e) =>
{
    _counter++;
    clickbutton.Text = Resources.GetString (
        Resource.String.counterbutton_text, _counter);
} ;

Quando si compila ed esegue di nuovo l'app, viene visualizzato un nuovo pulsante che incrementa e visualizza il valore di _counter su ogni clic:

Aggiungere il conteggio dei tocco

Tuttavia, quando si ruota il dispositivo in modalità orizzontale, questo conteggio viene perso:

La rotazione in orizzontale imposta il conteggio su zero

Esaminando l'output dell'applicazione, si noterà che l'attività A è stata sospesa, arrestata, eliminata, ricreata, riavviata, quindi ripresa durante la rotazione dalla modalità verticale alla modalità orizzontale:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Poiché l'attività A viene eliminata e ricreata nuovamente quando il dispositivo viene ruotato, lo stato dell'istanza viene perso. Si aggiungerà quindi il codice per salvare e ripristinare lo stato dell'istanza.

Aggiunta di codice per mantenere lo stato dell'istanza

Aggiungere un metodo per MainActivity salvare lo stato dell'istanza. Prima che l'attività A venga eliminata definitivamente, Android chiama automaticamente OnSaveInstanceState e passa un bundle che è possibile usare per archiviare lo stato dell'istanza. Verrà ora usato per salvare il conteggio dei clic come valore intero:

protected override void OnSaveInstanceState (Bundle outState)
{
    outState.PutInt ("click_count", _counter);
    Log.Debug(GetType().FullName, "Activity A - Saving instance state");

    // always call the base implementation!
    base.OnSaveInstanceState (outState);    
}

Quando l'attività A viene ricreata e ripresa, Android lo passa Bundle nuovamente al OnCreate metodo. Aggiungere il codice a per OnCreate ripristinare il _counter valore dall'oggetto passato Bundle. Aggiungere il codice seguente subito prima della riga in cui clickbutton è definita:

if (bundle != null)
{
    _counter = bundle.GetInt ("click_count", 0);
    Log.Debug(GetType().FullName, "Activity A - Recovered instance state");
}

Compilare ed eseguire di nuovo l'app, quindi fare clic sul secondo pulsante alcune volte. Quando si ruota il dispositivo in modalità orizzontale, il conteggio viene mantenuto.

La rotazione dello schermo mostra il numero di quattro mantenuti

Si esaminerà ora la finestra di output per vedere cosa è successo:

[ActivityLifecycle.MainActivity] Activity A - OnPause
[ActivityLifecycle.MainActivity] Activity A - Saving instance state
[ActivityLifecycle.MainActivity] Activity A - OnStop
[ActivityLifecycle.MainActivity] Activity A - On Destroy

[ActivityLifecycle.MainActivity] Activity A - OnCreate
[ActivityLifecycle.MainActivity] Activity A - Recovered instance state
[ActivityLifecycle.MainActivity] Activity A - OnStart
[ActivityLifecycle.MainActivity] Activity A - OnResume

Prima della chiamata al metodo OnStop, è stato chiamato il nuovo OnSaveInstanceState metodo per salvare il _counter valore in un oggetto Bundle. Android ha passato questo Bundle indietro a noi quando ha chiamato il nostro OnCreate metodo e siamo stati in grado di usarlo per ripristinare il _counter valore in cui è stato interrotto.

Riepilogo

In questa procedura dettagliata è stata usata la conoscenza del ciclo di vita delle attività per conservare i dati sullo stato.