简体   繁体   中英

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:

  • I use ActionBarSherlock with the support package.
  • Method onSaveInstanceState IS called when I press the home button. The method onCreate just always gives NULL for the Bundle savedInstanceState .
  • Method onRestoreInstanceState is never called at all. (I wouldn't mind if the onCreate worked ;)).
  • Also (it shouldn't matter) I tried putting super.onSaveInstanceState(outState) at the bottom of onSaveInstanceState . No luck either.

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 .

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

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

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.

PS: 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.

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?

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.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM