2013-03-28 3 views
5

Я знаю, этот вопрос задан раньше в stackoverflow, но ответы не работали для меня.onCreate (Bundle savedInstanceState) всегда всегда null

Вероятно, стоит отметить:

  • Я использую ActionBarSherlock с пакетом поддержки.
  • Способ onSaveInstanceState Вызывается при нажатии кнопки «домой». Метод onCreate всегда дает NULL для Bundle savedInstanceState.
  • Метод onRestoreInstanceState никогда не называется вообще. (Я бы не возражал, если работал onCreate;)).
  • Также (это не должно иметь значения) Я попытался поставить super.onSaveInstanceState(outState) внизу onSaveInstanceState. Не повезло.

Введите код. Надеюсь, у кого-то была эта проблема и она была решена.

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

} 

Каротаж четко говорится onSaveInstanceState вызывается и OnCreate получает savedInstanceState = NULL.

ответ

2

onRestoreInstanceState (или сохраненный пакет в onCreate) будет запущен, когда активность была убита системой из-за нехватки ресурсов и перезапущена, когда вы вернетесь к ней. Активность не может быть убита (просто остановлена) и перезапущена без прохождения onRestoreInstanceState. Другими словами, onSaveInstanceState будет всегда вызываться, но onRestoreInstanceState будет вызываться, если он будет убит и восстановлен системой. Не просто остановился и перезапустился, не приостановился и не возобновился, а не начинался с нового намерения.

Ознакомьтесь с моим объяснением здесь. Я уверен, что это покрывает ваш вопрос.

when is onRestoreInstanceState called?

+0

Выглядит хорошо, но как я могу это проверить? Как я могу запустить приложение kill/stop системой?Все, что я пробовал на телефоне Android, не вызывало onRestoreInstanceState. Кроме того, если это работает, как мне сохранить состояние, если пользователь останавливает/убивает это приложение сам? Мне кажется, что я могу использовать SharedPreferences, тогда ... – Almer

+0

onSaveInstanceState используется для сохранения и восстановления состояния, которое было прервано системой (открытые диалоги, позиция списка и т. Д.). Если вы хотите сохранить часть своего состояния, которое должно быть сохранено при закрытии приложения или перезагрузке, вы должны пойти в SharedPreferences и сохранить состояние в onPause(). –

+0

@DoctororDrive Ваша деятельность может быть вызвана дважды, так что у вас есть один экземпляр, работающий в фоновом режиме, готовый к восстановлению позднее, и один активный на переднем плане. Например, когда у вас есть Activity, который также отвечает на android.intent.action.CREATE_SHORTCUT. В этом случае действие для создания ярлыка выполняется на переднем плане и будет уничтожено до того, как фон снова появится на переднем плане, который может быть в нескольких положениях назад в стеке истории. В этом случае режим создания ярлыка заменит старые предпочтения старого. –

3

При нажатии кнопки HOME, ваша деятельность паузы и не разрушается Таким образом, когда вы запускаете приложение снова с главного экрана, OnCreate не вызывается, если операционная система не убить ваше приложение, чтобы вернуть память. Если вы хотите, чтобы ваша деятельность была воссоздана при запуске с главного экрана, поместите эту строку android:finishOnTaskLaunch="true" в манифест активности.

+0

Возможно, нужно было упомянуть об этом более четко, но у меня есть вызываемый onCreate (просто всегда возвращает null), так как я остановил приложение в диспетчере задач, сдвинув его вправо. В моих журналах я вижу, как onCreate IS вызывается, когда я снова запускаю приложение. – Almer

+0

Если вы убьете свое приложение, я не думаю, что ОС будет поддерживать состояние вашей активности. Но попробуйте андроид: alwaysRetainTaskState = "true" и посмотрите, работает ли он. –

11

Убедитесь, что ваш манифест не содержит андроида: noHistory = "true".

Я потратил часы на поиск ответа, и все было так просто.

+1

Что делать, если я все еще хочу, чтобы 'noHistory' была' истина'? – Jonas

4

В моем случае причина заключалась в том, что в конкретном действии не было темы, объявленной в файле манифеста.

Чтобы исправить это, откройте AndroidManifest.xml, нажмите «Приложение», выберите аварийную активность в «Узлах приложений» и добавьте тему в поле «Тема» атрибутов. В моем случае это было

@style/Theme.AppCompat.Light.DarkActionBar 

но вы могли бы скопировать тему из одной из ваших других мероприятий.

P.S .: Я знаю, что это ответ на старый вопрос, но я наткнулся на него во время поиска исправления и не нашел рабочего решения, чтобы это могло помочь другим.