How to use onSavedInstanceState example please

AndroidSavestate

Android Problem Overview


I'm confused when it comes down to saving a state. So I know that onSaveInstanceState(Bundle) is called when the activity is about to be destroyed. But how do you store your information in it and bring it back to its original state in onCreate(Bundle savedInstanceState)? I don't understand how this bundle will restore information. It would be helpful if someone can provide an example. The Dev guide doesn't do a good job of explaining this.

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);
    }
}

Android Solutions


Solution 1 - Android

The Bundle is a container for all the information you want to save. You use the put* functions to insert data into it. Here's a short list (there are more) of put functions you can use to store data in the Bundle.

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

In your onCreate function, this Bundle is handed back to the program. The best way to check if the application is being reloaded, or started for the first time is:

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

To get the data back out, use the get* functions just like the put* functions. The data is stored as a name-value pair. This is like a hashmap. You provide a key and the value, then when you want the value back, you give the key and the function gets the value. Here's a short example.

@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();
    }
}

Your saved message will be toasted to the screen. Hope this helps.

Solution 2 - Android

One major note that all new Android developers should know is that any information in Widgets (TextView, Buttons, etc.) will be persisted automatically by Android as long as you assign an ID to them. So that means most of the UI state is taken care of without issue. Only when you need to store other data does this become an issue.

From Android Docs:

> The only work required by you is to > provide a unique ID (with the > android:id attribute) for each widget > you want to save its state. If a > widget does not have an ID, then it > cannot save its state

Solution 3 - Android

A good information: you don't need to check whether the Bundle object is null into the onCreate() method. Use the onRestoreInstanceState() method, which the system calls after the onStart() method. The system calls onRestoreInstanceState() only if there is a saved state to restore, so you do not need to check whether the Bundle is null

Solution 4 - Android

Store information:

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);
}

If you don't want to restore information in your onCreate-Method:

Here are the examples: Recreating an Activity

> Instead of restoring the state during onCreate() you may choose to implement onRestoreInstanceState(), which the system calls after the onStart() method. The system calls onRestoreInstanceState() only if there is a saved state to restore, so you do not need to check whether the Bundle is null

public void onRestoreInstanceState(Bundle savedInstanceState) {
// Always call the superclass so it can restore the view hierarchy
super.onRestoreInstanceState(savedInstanceState);

// Restore state members from saved instance
mCurrentScore = savedInstanceState.getInt(PLAYER_SCORE);
mCurrentLevel = savedInstanceState.getInt(PLAYER_LEVEL);
}

Solution 5 - Android

Basically onSaveInstanceState(Bundle outBundle) will give you a bundle. When you look at the Bundle class, you will see that you can put lots of different stuff inside it. At the next call of onCreate(), you just get that Bundle back as an argument. Then you can read your values again and restore your activity.

Lets say you have an activity with an EditText. The user wrote some text inside it. After that the system calls your onSaveInstanceState(). You read the text from the EditText and write it into the Bundle via Bundle.putString("edit_text_value", theValue).

Now onCreate is called. You check if the supplied bundle is not null. If thats the case, you can restore your value via Bundle.getString("edit_text_value") and put it back into your EditText.

Solution 6 - Android

This is for extra information.

Imagine this scenario

  1. ActivityA launch ActivityB.

  2. ActivityB launch a new ActivityAPrime by

    Intent intent = new Intent(getApplicationContext(), ActivityA.class);
    startActivity(intent);
    
  3. ActivityAPrime has no relationship with ActivityA.
    In this case the Bundle in ActivityAPrime.onCreate() will be null.

If ActivityA and ActivityAPrime should be the same activity instead of different activities, ActivityB should call finish() than using startActivity().

Solution 7 - Android

If Data Is not Loaded From savedInstanceState use following code.
The problem is url call is not to complete fully so, check if data is loaded then to show the instanceState value.

//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
	}
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questiontj walkerView Question on Stackoverflow
Solution 1 - AndroidSpidyView Answer on Stackoverflow
Solution 2 - AndroidKeith AdlerView Answer on Stackoverflow
Solution 3 - AndroidDiego SouzaView Answer on Stackoverflow
Solution 4 - AndroidKlatschenView Answer on Stackoverflow
Solution 5 - Androiduser658042View Answer on Stackoverflow
Solution 6 - AndroidkenView Answer on Stackoverflow
Solution 7 - AndroidMathan ChinnaView Answer on Stackoverflow