Cosa salvare e cosa non fare?
Vi siete mai chiesti perché il testo in EditText
viene salvato automaticamente mentre cambia un orientamento? Bene, questa risposta è per te.
Quando un'istanza di un'attività viene distrutta e il sistema ricrea una nuova istanza (ad esempio, modifica della configurazione). Tenta di ricrearlo utilizzando un set di dati salvati del vecchio stato attività ( stato istanza ).
Lo stato dell'istanza è una raccolta di coppie chiave-valore memorizzate in un Bundle
oggetto.
Per impostazione predefinita, il sistema salva ad esempio gli oggetti Visualizza nel pacchetto.
- Testo in
EditText
- Posizione di scorrimento in a
ListView
, ecc.
Se è necessario salvare un'altra variabile come parte dello stato dell'istanza, è necessario eseguire l'override onSavedInstanceState(Bundle savedinstaneState)
metodo .
Per esempio, int currentScore
in un GameActivity
Maggiori dettagli su onSavedInstanceState (pacchetto salvato instaneState) durante il salvataggio dei dati
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save the user's current game state
savedInstanceState.putInt(STATE_SCORE, mCurrentScore);
// Always call the superclass so it can save the view hierarchy state
super.onSaveInstanceState(savedInstanceState);
}
Quindi, per errore, se si dimentica di chiamare
super.onSaveInstanceState(savedInstanceState);
il comportamento predefinito non funzionerà, ovvero il testo in EditText non verrà salvato.
Quale scegliere per ripristinare lo stato dell'attività?
onCreate(Bundle savedInstanceState)
O
onRestoreInstanceState(Bundle savedInstanceState)
Entrambi i metodi ottengono lo stesso oggetto Bundle, quindi non importa dove si scrive la logica di ripristino. L'unica differenza è che nel onCreate(Bundle savedInstanceState)
metodo dovrai dare un controllo nullo mentre non è necessario in quest'ultimo caso. Altre risposte hanno già frammenti di codice. Puoi riferirli.
Maggiori dettagli su onRestoreInstanceState (pacchetto salvato instaneState)
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);
// Restore state members from the saved instance
mCurrentScore = savedInstanceState.getInt(STATE_SCORE);
}
Chiamare sempre in super.onRestoreInstanceState(savedInstanceState);
modo che il sistema ripristini la gerarchia di visualizzazione per impostazione predefinita
indennità
Il onSaveInstanceState(Bundle savedInstanceState)
viene invocato dal sistema solo quando l'utente intende tornare all'attività. Ad esempio, stai usando App X e all'improvviso ricevi una chiamata. Passare all'app del chiamante e tornare all'app X. In questo caso, ilonSaveInstanceState(Bundle savedInstanceState)
metodo verrà richiamato.
Ma considera questo se un utente preme il pulsante Indietro. Si presume che l'utente non intenda tornare all'attività, quindi in questo caso onSaveInstanceState(Bundle savedInstanceState)
non verrà invocato dal sistema. Il punto è che dovresti considerare tutti gli scenari mentre salvi i dati.
Link rilevanti:
Demo sul comportamento predefinito
Documentazione ufficiale Android .