Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I've been working on the Android SDK platform, and it is a little unclear how to save an application's state. So given this minor re-tooling of the 'Hello, Android' example:

package com.android.hello;  import android.app.Activity; import android.os.Bundle; import android.widget.TextView;  public class HelloAndroid extends Activity {    private TextView mTextView = null;    /** Called when the activity is first created. */   @Override   public void onCreate(Bundle savedInstanceState) {     super.onCreate(savedInstanceState);      mTextView = new TextView(this);      if (savedInstanceState == null) {        mTextView.setText("Welcome to HelloAndroid!");     } else {        mTextView.setText("Welcome back.");     }      setContentView(mTextView);   } } 

I thought it would be enough for the simplest case, but it always responds with the first message, no matter how I navigate away from the app.

I'm sure the solution is as simple as overriding onPause or something like that, but I've been poking away in the documentation for 30 minutes or so and haven't found anything obvious.

like image 495
Bernard Avatar asked Sep 30 '08 04:09

Bernard


People also ask

How do I save an instance state to save an activity state?

In order to save sates of UI, I override onSaveInstanceState(Bundle savedInstanceState) and save all the data of the UI in savedInstanceState Bundle. This method is called before onStop() in older versions of Android (till android 8.0) and can be called after onStop() for newer versions.

What is Save instance state?

The savedInstanceState is a reference to a Bundle object that is passed into the onCreate method of every Android Activity. Activities have the ability, under special circumstances, to restore themselves to a previous state using the data stored in this bundle.

What is activity instance state?

The state of each activity is stored as a set of key/value pairs in a Bundle object called the activity instance state. The system saves default state information to instance state bundle just before the activity is stopped, and passes that bundle to the new activity instance to restore.


2 Answers

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.).

like image 65
Reto Meier Avatar answered Sep 24 '22 00:09

Reto Meier


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.

like image 29
Dave L. Avatar answered Sep 23 '22 00:09

Dave L.