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
:
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:
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:
Tuttavia, quando si ruota il dispositivo in modalità orizzontale, questo conteggio viene perso:
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.
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.