Almer
Almer

Reputation: 1199

onCreate(Bundle savedInstanceState) in always null

I know, this question is asked before on stackoverflow, but non of the answers worked for me.

Probably worth mentioning:

Here's the code. I hope someone had this problem and solved it.

public class MainActivity extends SherlockFragmentActivity {

    private static final String LOG_TAG = MainActivity.class.getSimpleName();

    private static String STATE_TO_STORE = "state_to_store";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        

        Log.d(LOG_TAG, "onCreate: savedInstanceState = " + (savedInstanceState == null ? "NULL" : "Not NULL"));

        // ... more code...
    }

    @Override
    public void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);

        Log.d(LOG_TAG, "onRestoreInstanceState: savedInstanceState = " + (savedInstanceState == null ? "NULL" : "Not NULL"));
    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);

        outState.putInt(STATE_TO_STORE, 5); // store some int

        Log.d(LOG_TAG, "onSaveInstanceState bundle: " + outState.toString());
    }

    // ... more code ...

}

The logging clearly states onSaveInstanceState is being called and onCreate gets savedInstanceState = NULL.

Upvotes: 6

Views: 21049

Answers (4)

Vlad Schnakovszki
Vlad Schnakovszki

Reputation: 8601

In my case, the reason was that the specific activity did not have a theme declared in the manifest file.

To fix this, open AndroidManifest.xml, click Application, select the crashing activity in Application Nodes and add the theme in the Theme field of Attributes. In my case, it was

@style/Theme.AppCompat.Light.DarkActionBar

but you could copy the theme from one of your other activities.

P.S.: I know this is an answer to an old question, but I've stumbled upon it while searching for a fix and didn't find a working solution so this might help others.

Upvotes: 3

user2360033
user2360033

Reputation: 129

Check that your manifest does not contain android:noHistory="true".

I spent hours looking for an answer and it was that simple.

Upvotes: 12

Hoan Nguyen
Hoan Nguyen

Reputation: 18151

When you press the HOME button, your activity is pause and not destroyed Thus when you launch the app again from home screen, onCreate is not called, unless the OS kill your app to reclaim memory. If you want your activity to be recreated when launch from the home screen, put this line android:finishOnTaskLaunch="true" in the activity manifest.

Upvotes: 2

Yaroslav Mytkalyk
Yaroslav Mytkalyk

Reputation: 17115

onRestoreInstanceState (or saved bundle in onCreate) will be fired when the Activity was killed by the system due to lack of resources and restarted when you get back to it. The Activity might not be killed (just stopped) and restarted without going through onRestoreInstanceState. Another words, onSaveInstanceState will be always called, but onRestoreInstanceState will be called if it is killed and restored by the system. Not just stopped and restarted, not paused and resumed and not started by a new intent.

Check my explanation here. I'm sure it covers your question.

when is onRestoreInstanceState called?

Upvotes: 2

Related Questions