¿Cómo usar onSaveInstanceState () y onRestoreInstanceState ()?

Estoy tratando de guardar datos a través de cambios de orientación. Como se demuestra en el siguiente código, uso onSaveInstanceState() y onRestoreInstanceState() . Intento obtener el valor guardado y compruebo si es el valor correcto en onRestoreInstanceState() . Pero cuando trato de usar el nuevo valor en onCreate() , no tengo el nuevo valor, sino el anterior.

 protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putString("TEXT", user); } protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); savedUser = savedInstanceState.getString("TEXT"); Log.d("enregistred value", savedUser); } public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int display_mode = getResources().getConfiguration().orientation; if (display_mode == 1) { setContentView(R.layout.main_grid); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); mGrid.setVisibility(0x00000000); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } else { setContentView(R.layout.main_grid_land); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); Log.d("Mode", "land"); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } Log.d("savedUser", savedUser); if (savedUser.equals("admin")) { //value 0 adapter.setApps(appManager.getApplications()); } else if (savedUser.equals("prof")) { //value 1 adapter.setApps(appManager.getTeacherApplications()); } else {// default value appManager = new ApplicationManager(this, getPackageManager()); appManager.loadApplications(true); bindApplications(); } } 

Cuando se recrea su actividad después de que se destruyó previamente, puede recuperar su estado guardado del paquete para que el sistema pase su actividad. Los métodos de callback onCreate () y onRestoreInstanceState () reciben el mismo Bundle que contiene la información de estado de la instancia.

Debido a que se llama al método onCreate () ya sea que el sistema esté creando una nueva instancia de su actividad o recreando una anterior, debe verificar si el paquete de estado es nulo antes de intentar leerlo. Si es nulo, el sistema está creando una nueva instancia de la actividad, en lugar de restaurar una anterior que se destruyó.

 static final String STATE_USER = "user"; private String mUser; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Check whether we're recreating a previously destroyed instance if (savedInstanceState != null) { // Restore value of members from saved state mUser = savedInstanceState.getString(STATE_USER); } else { // Probably initialize members with default values for a new instance mUser = "NewUser"; } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { savedInstanceState.putString(STATE_USER, mUser); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } 

http://developer.android.com/training/basics/activity-lifecycle/recreating.html

  • onSaveInstanceState() es un método utilizado para almacenar datos antes de pausar la actividad.

Descripción: Hook que permite una vista para generar una representación de su estado interno que luego puede usarse para crear una nueva instancia con ese mismo estado. Este estado solo debe contener información que no es persistente o no puede reconstruirse más tarde. Por ejemplo, nunca almacenará su posición actual en la pantalla porque se volverá a calcular cuando se coloque una nueva instancia de la vista en su jerarquía de vistas.

  • onRestoreInstanceState() es el método utilizado para recuperar esos datos.

Descripción: Este método se invoca después de onStart () cuando la actividad se reinicializa desde un estado previamente guardado, dado aquí en savedInstanceState. La mayoría de las implementaciones simplemente usarán onCreate (Bundle) para restaurar su estado, pero a veces es conveniente hacerlo aquí después de que se haya realizado toda la inicialización o para permitir que las subclases decidan si usarán su implementación predeterminada. La implementación predeterminada de este método realiza una restauración de cualquier estado de vista que haya sido previamente congelado por onSaveInstanceState (Bundle).

Considera este ejemplo aquí:
Su aplicación tiene 3 cuadros de edición donde el usuario estaba ingresando información, pero recibe una llamada, por lo que si no usó los métodos anteriores, se perderá todo lo que ingresó.
Por lo tanto, siempre guarde los datos actuales en el método onPause() de Activity como un paquete y en el método onResume() llame al método onRestoreInstanceState() .

Por favor mira :

Cómo usar el ejemplo de onSavedInstanceState, por favor

http://www.how-to-develop-android-apps.com/tag/onrestreinstancestate/

Esto sucede porque usa savedValue en el método onCreate() . savedValue se actualiza en el método onRestoreInstanceState() , pero se llama a onCreate() después del método onCreate() . Tu también puedes:

  1. Actualice savedValue en el método onCreate() , o
  2. Mueva el código que usa el nuevo savedValue en el método onRestoreInstanceState() .

Pero te sugiero que uses el primer enfoque, haciendo el código así:

 public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); int display_mode = getResources().getConfiguration().orientation; if (display_mode == 1) { setContentView(R.layout.main_grid); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); mGrid.setVisibility(0x00000000); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } else { setContentView(R.layout.main_grid_land); mGrid = (GridView) findViewById(R.id.gridview); mGrid.setColumnWidth(95); Log.d("Mode", "land"); // mGrid.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION); } if (savedInstanceState != null) { savedUser = savedInstanceState.getString("TEXT"); } else { savedUser = "" } Log.d("savedUser", savedUser); if (savedUser.equals("admin")) { //value 0 adapter.setApps(appManager.getApplications()); } else if (savedUser.equals("prof")) { //value 1 adapter.setApps(appManager.getTeacherApplications()); } else {// default value appManager = new ApplicationManager(this, getPackageManager()); appManager.loadApplications(true); bindApplications(); } }