Salvando la Instancia

En esta entrada vamos a ver los métodos que tenemos que utilizar para guardar elementos que queremos recuperar en caso de que la Actividad muera y posteriormente Android la re-cree, pasándole entonces un Bundle con nuestros valores guardados.

Cuando se crea una Activity se llama al método onCreate, que recibe un Bundle. La primera vez que se crea la Activity el Bundle es null, no recibe nada. Cuando Android gestiona la muerte de nuestra Activity, por ejemplo en un cambio de orientación, primero llamará a un método para permitirnos guardar aquello que creamos importante recuperar.

Cuando por fin vuelve a crear la Activity tras la rotación, le pasará la información que hayamos guardado. El Bundle ya no será null y podremos acceder a la información que guardamos en el.

onSavedInstanceState

Para guardar información en un Bundle que queramos recuperar, sobrecargaremos el método onSaveInstanceState(Bundle savedInstanceState). Como vemos recibe un Bundle. En éste es donde tenemos que guardar la información que queramos. Veamos un ejemplo:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
// Save state information with a collection of key-value pairs
savedInstanceState.putInt("counterCreate", mCounterCreate);
savedInstanceState.putInt("counterRestart", mCounterRestart);
savedInstanceState.putInt("counterStart", mCounterStart);
savedInstanceState.putInt("counterResume", mCounterResume);
Log.d(TAG, "onSaveInstanceState() Saved data");
super.onSaveInstanceState(savedInstanceState);
}

En el ejemplo, guardamos variables enteras, utilizando el método putInt(), que son contadores que hemos utilizado en la Activity y que no queremos perder. A su vez llamamos a Log.d para dejar constancia de la entrada en este callback en el Logcat. Finalmente llamamos al método padre pasándole el Bundle.

Recuperando lo guardado

Posteriormente, cuando Android vuelve a llamar a onCreate, le pasará el Bundle que guardamos previamente en el método onSavedInstanceSate(). Pero tenemos que comprobar que este Bundle no es null, ya que en la primera llamada lo es. Aquí vemos como recuperar la información que guardamos en el ejemplo anterior:

// Check for previously saved state
if (savedInstanceState != null) {
// Restore value of counters from saved state
mCounterCreate = savedInstanceState.getInt("counterCreate");
mCounterRestart = savedInstanceState.getInt("counterRestart");
mCounterStart = savedInstanceState.getInt("counterStart");
mCounterResume = savedInstanceState.getInt("counterResume");
Log.d(TAG, "Restoring Data in onCreate savedInstanceState != null");
}

En el ejemplo recuperamos en las variables enteras el valor que obtenemos del Bundle con el método getInt().

Ver Bundle para ver que otros tipos de datos podemos guardar y recuperar.