¿Cuándo se llama exactamente aavaveinstancestate() y onRestoreInstanceState ()?


La siguiente figura (de el documento oficial) describe el conocido ciclo de vida de una actividad de Android:

introduzca la descripción de la imagen aquí

Por otro lado, cuando la actividad es destruida por el sistema (por ejemplo porque la memoria necesita ser recuperada), el estado de la actividad a veces se guarda y restaura automáticamente por medio de los métodosonSaveInstanceState() y onRestoreInstanceState(), como se ilustra en la siguiente figura (también de el doc):

introduzca la descripción de la imagen aquí

Soy consciente de que onSaveInstanceState() no siempre se llama cuando una actividad está a punto de ser destruida. Por ejemplo, si se destruye porque el usuario ha presionado el botón "atrás", el estado de la actividad no se conserva. Pero en los casos en que el estado es salvado y restaurado, y onSaveInstanceState() / onRestoreInstanceState() get called, ¿cuándo exactamente se les llama?

Por ejemplo, de acuerdo con las cifras anteriores, onRestoreInstanceState() podría ser llamado antes de onStart(), o después de onStart() pero antes de onResume(), o después de onResume(). Del mismo modo, existen varias posibilidades para onSaveInstanceState(). Entonces, ¿cuándo se llaman exactamente?

Idealmente, lo que me gustaría es ver un diagrama combinado que muestre los estados del ciclo de vida de la actividad y los métodos de guardar/restaurar, si eso existe.

Author: azizbekian, 2013-12-30

5 answers

Según la documentación :

Void onRestoreInstanceState (Bundle savedInstanceState)

Este método se llama entre onStart() y onPostCreate(Bundle).

Void onSaveInstanceState (Bundle outState)

Si se llama, este método ocurrirá antes de onStop(). No hay garantías sobre si ocurrirá antes o después onPause().

No se define cuándo onSaveInstanceState() puede ser llamado, la única garantía que tenemos es ese rango.

 73
Author: Steve M,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-05 08:53:52

Por doc1 y doc2

OnSaveInstanceState

Antes del panal, las actividades no se consideraban matables hasta después de que se había detenido, lo que significa que onSaveInstanceState() fue llamado inmediatamente antes de onPause(). Comenzando con el panal, sin embargo, las actividades se consideran matable solo después de que han sido detenidos, lo que significa que onSaveInstanceState() ahora se llama antes de onStop() en lugar de inmediatamente antes de onPause ().

OnRestoreInstanceState

Este método se llama entre onStart() y onPostCreate(Bundle) cuando la actividad se está reinicializando desde un estado guardado previamente

 13
Author: Bhuvnesh Varma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-06 10:09:09

Esta es una información adicional para {[1] }avaveinstancestate (Bundle)

De docs

No confunda este método con las devoluciones de llamada del ciclo de vida de la actividad, como onPause (), que siempre se llama cuando se coloca una actividad en el fondo o en su camino a la destrucción, o onStop () que es llamado antes de la destrucción. Un ejemplo de cuando onPause () y onStop() se llama y no este método es cuando un usuario navega de vuelta desde actividad B a actividad A: no hay necesidad de llamar Bundleaveinstancestate (Bundle) en B porque esa instancia en particular nunca se restaurará, por lo que el sistema evita llamarlo. Un ejemplo cuando onPause () se llama y noavaveinstancestate (Bundle) es cuando la actividad B se inicia delante de la actividad A: el sistema puede evitar llamar onSaveInstanceState(Bundle) en Una actividad si no se muere durante la vida útil de B desde el estado de la interfaz de usuario de A se mantendrá intacto.

So es la implementación predeterminada para..

La implementación predeterminada se encarga de la mayor parte de la interfaz de usuario por instancia estado llamando a onSaveInstanceState() en cada vista en el jerarquía que tiene un id, y guardando el id de la vista enfocada (todo lo cual es restaurado por la implementación predeterminada de onRestoreInstanceState (Bundle)). Si anula este método para guardar información adicional no capturada por cada vista individual, usted es probable que desee llamar hasta la implementación predeterminada, de lo contrario, prepárese para salvar todo el estado de cada vista usted mismo.

 4
Author: Mahmoud Mzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-13 09:26:33

Además de las respuestas ya publicadas, hay un cambio sutil introducido en Android P, que es:

Void onSaveInstanceState(Bundle outState)

Si se llama, este método se producirá DESPUÉS onStop() para aplicaciones dirigidas a plataformas que comiencen con P . Para aplicaciones dirigidas a versiones anteriores de la plataforma, este método ocurrirá antes de onStop() y no hay garantías sobre si ocurrirá antes o después onPause().

En cuanto a por qué se está introduciendo este cambio, aquí está la respuesta:

... por lo tanto, una aplicación puede realizar transacciones de fragmentos de forma segura en onStop() y podrá guardar el estado persistente más adelante.

Fuente: documentos

 4
Author: azizbekian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-12 09:16:13
String activityState;
@Override 
public void onCreate(Bundle savedInstanceState) {
// call the super class onCreate to complete the creation of activity like 
// the view hierarchy 
super.onCreate(savedInstanceState);

// recovering the instance state 
if (savedInstanceState != null) {
     activityState = savedInstanceState.getString(STATE_KEY);
 } 

   setContentView(R.layout.main_activity);
   mTextView = (TextView) findViewById(R.id.text_view);
} 

/ / Esta devolución de llamada se llama solo cuando hay una instancia guardada previamente guardado usando //onSaveInstanceState(). Restauramos algún estado en onCreate () mientras podemos restauración opcional // otro estado aquí, posiblemente utilizable después de que onStart() se haya completado. // El paquete savedInstanceState es el mismo que se usa en onCreate ().

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) {
 mTextView.setText(savedInstanceState.getString(STATE_KEY));
  } 


// invoked when the activity may be temporarily destroyed, save the instance 
//state here 
//this method will be called before onstop

@Override 
 public void onSaveInstanceState(Bundle outState) {
    outState.putString(STATE_KEY, activityState);

    // call superclass to save any view hierarchy 
    super.onSaveInstanceState(outState);
} 
 0
Author: parvez rafi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-07-12 12:13:31