android – How can I save an activity state using the save instance state?

android – How can I save an activity state using the save instance state?

You need to override onSaveInstanceState(Bundle savedInstanceState) and write the application state values you want to change to the Bundle parameter like this:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
  super.onSaveInstanceState(savedInstanceState);
  // Save UI state changes to the savedInstanceState.
  // This bundle will be passed to onCreate if the process is
  // killed and restarted.
  savedInstanceState.putBoolean(MyBoolean, true);
  savedInstanceState.putDouble(myDouble, 1.9);
  savedInstanceState.putInt(MyInt, 1);
  savedInstanceState.putString(MyString, Welcome back to Android);
  // etc.
}

The Bundle is essentially a way of storing a NVP (Name-Value Pair) map, and it will get passed in to onCreate() and also onRestoreInstanceState() where you would then extract the values from activity like this:

@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
  super.onRestoreInstanceState(savedInstanceState);
  // Restore UI state from the savedInstanceState.
  // This bundle has also been passed to onCreate.
  boolean myBoolean = savedInstanceState.getBoolean(MyBoolean);
  double myDouble = savedInstanceState.getDouble(myDouble);
  int myInt = savedInstanceState.getInt(MyInt);
  String myString = savedInstanceState.getString(MyString);
}

Or from a fragment.

@Override
public void onViewStateRestored(@Nullable Bundle savedInstanceState) {
    super.onViewStateRestored(savedInstanceState);
    // Restore UI state from the savedInstanceState.
    // This bundle has also been passed to onCreate.
    boolean myBoolean = savedInstanceState.getBoolean(MyBoolean);
    double myDouble = savedInstanceState.getDouble(myDouble);
    int myInt = savedInstanceState.getInt(MyInt);
    String myString = savedInstanceState.getString(MyString);
}

You would usually use this technique to store instance values for your application (selections, unsaved text, etc.).

The savedInstanceState is only for saving state associated with a current instance of an Activity, for example current navigation or selection info, so that if Android destroys and recreates an Activity, it can come back as it was before. See the documentation for onCreate and onSaveInstanceState

For more long lived state, consider using a SQLite database, a file, or preferences. See Saving Persistent State.

android – How can I save an activity state using the save instance state?

Note that it is not safe to use onSaveInstanceState and onRestoreInstanceState for persistent data, according to the documentation on Activity.

The document states (in the Activity Lifecycle section):

Note that it is important to save
persistent data in onPause() instead
of onSaveInstanceState(Bundle)
because the later is not part of the
lifecycle callbacks, so will not be
called in every situation as described
in its documentation.

In other words, put your save/restore code for persistent data in onPause() and onResume()!

For further clarification, heres the onSaveInstanceState() documentation:

This method is called before an activity may be killed so that when it
comes back some time in the future it can restore its state. For
example, if activity B is launched in front of activity A, and at some
point activity A is killed to reclaim resources, activity A will have
a chance to save the current state of its user interface via this
method so that when the user returns to activity A, the state of the
user interface can be restored via onCreate(Bundle) or
onRestoreInstanceState(Bundle).

Leave a Reply

Your email address will not be published.