FileDocCategorySizeDatePackage
PersistentState.javaAPI DocAndroid 1.5 API4797Wed May 06 22:41:08 BST 2009com.example.android.apis.app

PersistentState

public class PersistentState extends android.app.Activity
Simple example of using persistent preferences to retain a screen's state.

This can be used as an alternative to the normal onSaveInstanceState() mechanism, if you wish the state to persist even after an activity is finished.

Note that using this approach requires more care, since you are sharing the persistent state potentially across multiple instances of the activity. In particular, if you allow a new instance of the activity to be launched directly on top of the existing instance, the state can get out of sync because the new instance is resumed before the old one is paused.

For any persistent state that is not simplistic, a content provider is often a better choice.

In this example we are currently saving and restoring the state of the top text editor, but not of the bottom text editor. You can see the difference by editing the two text fields, then going back from the activity and starting it again.

Demo

App/Activity/Save & Restore State

Source files

src/com.example.android.apis/app/PersistentState.java The Save/Restore Screen implementation
/res/any/layout/save_restore_state.xml Defines contents of the screen

Fields Summary
private android.widget.EditText
mSaved
Constructors Summary
Methods Summary
protected voidonCreate(android.os.Bundle savedInstanceState)
Initialization of the Activity after it is first created. Here we use {@link android.app.Activity#setContentView setContentView()} to set up the Activity's content, and retrieve the EditText widget whose state we will persistent.

        // Be sure to call the super class.
        super.onCreate(savedInstanceState);

        // See assets/res/any/layout/save_restore_state.xml for this
        // view layout definition, which is being set here as
        // the content of our screen.
        setContentView(R.layout.save_restore_state);

        // Set message to be appropriate for this screen.
        ((TextView)findViewById(R.id.msg)).setText(R.string.persistent_msg);

        // Retrieve the EditText widget whose state we will save.
        mSaved = (EditText)findViewById(R.id.saved);
    
protected voidonPause()
Any time we are paused we need to save away the current state, so it will be restored correctly when we are resumed.

        super.onPause();

        SharedPreferences.Editor editor = getPreferences(0).edit();
        editor.putString("text", mSaved.getText().toString());
        editor.putInt("selection-start", mSaved.getSelectionStart());
        editor.putInt("selection-end", mSaved.getSelectionEnd());
        editor.commit();
    
protected voidonResume()
Upon being resumed we can retrieve the current state. This allows us to update the state if it was changed at any time while paused.

        super.onResume();

        SharedPreferences prefs = getPreferences(0); 
        String restoredText = prefs.getString("text", null);
        if (restoredText != null) {
            mSaved.setText(restoredText, TextView.BufferType.EDITABLE);

            int selectionStart = prefs.getInt("selection-start", -1);
            int selectionEnd = prefs.getInt("selection-end", -1);
            if (selectionStart != -1 && selectionEnd != -1) {
                mSaved.setSelection(selectionStart, selectionEnd);
            }
        }