Cómo usar el ejemplo de onSavedInstanceState, por favor

Estoy confundido cuando se trata de salvar un estado. Así que sé que se onSaveInstanceState(Bundle) cuando la actividad está a punto de destruirse. Pero, ¿cómo almacena su información y la devuelve a su estado original en onCreate(Bundle savedInstanceState) ? No entiendo cómo este paquete restaurará la información. Sería útil si alguien puede dar un ejemplo. La guía Dev no hace un buen trabajo al explicar esto.

 public class Conversation extends Activity { private ProgressDialog progDialog; int typeBar; TextView text1; EditText edit; Button respond; private String name; private String textAtView; private String savedName; public void onCreate(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.dorothydialog); text1 = (TextView)findViewById(R.id.dialog); edit = (EditText)findViewById(R.id.repsond); respond = (Button)findViewById(R.id.button01); if(savedInstanceState != null){ savedInstanceState.get(savedName); text1.setText(savedName); } else{ text1.setText("Hello! What is your name?"); respond.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { name = edit.getText().toString(); text1.setText("Nice to meet you "+ name); } }); } } @Override public void onSaveInstanceState(Bundle outState){ super.onSaveInstanceState(outState); outState.putString(savedName, name); } } 

El Bundle es un contenedor de toda la información que desea guardar. Utiliza las funciones put * para insertar datos en ella. Aquí hay una lista breve (hay más) de funciones put que puede usar para almacenar datos en el Bundle .

 putString putBoolean putByte putChar putFloat putLong putShort putParcelable (used for objects but they must implement Parcelable) 

En su función onCreate , este Bundle se devuelve al progtwig. La mejor forma de comprobar si la aplicación se está recargando o iniciando por primera vez es:

 if (savedInstanceState != null) { // Then the application is being reloaded } 

Para recuperar los datos, use las funciones get * como las funciones put *. Los datos se almacenan como un par nombre-valor. Esto es como un hashmap. Usted proporciona una clave y el valor, luego, cuando desea recuperar el valor, le da la clave y la función obtiene el valor. Aquí hay un pequeño ejemplo.

 @Override public void onSaveInstanceState(Bundle outState) { outState.putString("message", "This is my message to be reloaded"); super.onSaveInstanceState(outState); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); if (savedInstanceState != null) { String message = savedInstanceState.getString("message"); Toast.makeText(this, message, Toast.LENGTH_LONG).show(); } } 

Su mensaje guardado será tostado en la pantalla. Espero que esto ayude.

Una nota importante que todos los nuevos desarrolladores de Android deberían saber es que Android mantendrá automáticamente cualquier información en Widgets (TextView, Buttons, etc.) siempre que les asigne un ID. Eso significa que la mayor parte del estado de UI se soluciona sin problemas. Solo cuando necesite almacenar otros datos, esto se convertirá en un problema.

De los documentos de Android :

El único trabajo que necesita es proporcionar una identificación única (con el atributo android: id) para cada widget en el que quiera guardar su estado. Si un widget no tiene una ID, entonces no puede guardar su estado

Una buena información: no es necesario verificar si el objeto Bundle es nulo en el método onCreate (). Utilice el método onRestoreInstanceState (), que el sistema llama después del método onStart (). El sistema llama a RestoreInstanceState () solo si hay un estado guardado para restaurar, por lo que no es necesario verificar si el paquete es nulo.

Almacenar información:

 static final String PLAYER_SCORE = "playerScore"; static final String PLAYER_LEVEL = "playerLevel"; @Override public void onSaveInstanceState(Bundle savedInstanceState) { // Save the user's current game state savedInstanceState.putInt(PLAYER_SCORE, mCurrentScore); savedInstanceState.putInt(PLAYER_LEVEL, mCurrentLevel); // Always call the superclass so it can save the view hierarchy state super.onSaveInstanceState(savedInstanceState); } 

Si no desea restaurar la información en su método onCreate:

Estos son los ejemplos: Recreando una actividad

En lugar de restaurar el estado durante onCreate () puede optar por implementar onRestoreInstanceState (), que el sistema llama después del método onStart (). El sistema llama a RestoreInstanceState () solo si hay un estado guardado para restaurar, por lo que no es necesario verificar si el paquete es nulo.

 public void onRestoreInstanceState(Bundle savedInstanceState) { // Always call the superclass so it can restre the view hierarchy super.onRestoreInstanceState(savedInstanceState); // Restore state members from saved instance mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE); mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL); } 

Básicamente onSaveInstanceState (Bundle outBundle) le dará un paquete. Cuando mires la clase Bundle, verás que puedes poner muchas cosas diferentes dentro de ella. En la siguiente llamada de onCreate (), recuperas ese paquete como argumento. Luego puede leer sus valores nuevamente y restaurar su actividad.

Digamos que tienes una actividad con un EditText. El usuario escribió un texto dentro de él. Después de eso, el sistema llama a yourSaveInstanceState (). Lees el texto de EditText y lo escribes en Bundle a través de Bundle.putString (“edit_text_value”, theValue).

Ahora se llama a onCreate. Verifica si el paquete suministrado no es nulo. Si ese es el caso, puede restaurar su valor a través de Bundle.getString (“edit_text_value”) y ponerlo nuevamente en su EditText.

Esto es para obtener información adicional.

Imagina este escenario

  1. ActivityA lanza ActivityB.
  2. ActivityB lanza una nueva ActivityAPrime por

     Intent intent = new Intent(getApplicationContext(), ActivityA.class); startActivity(intent); 
  3. ActivityAPrime no tiene ninguna relación con ActivityA.
    En este caso, el paquete en ActivityAPrime.onCreate () será nulo.

Si ActivityA y ActivityAPrime deben ser la misma actividad en lugar de diferentes actividades, ActivityB debe llamar a finish () que usar startActivity ().

Si los datos no están cargados desde savedInstanceState use el siguiente código.
El problema es que la llamada url no debe completarse por completo, así que compruebe si los datos están cargados y luego muestre el valor de instanceState.

 //suppose data is not Loaded to savedInstanceState at 1st swipe if (savedInstanceState == null && !mAlreadyLoaded){ mAlreadyLoaded = true; GetStoryData();//Url Call } else { if (listArray != null) { //Data Array From JsonArray(ListArray) System.out.println("LocalData " + listArray); view.findViewById(R.id.progressBar).setVisibility(View.GONE); }else{ GetStoryData();//Url Call } }