Подтвердить что ты не робот

OnSaveInstanceState не сохраняет мои значения (onCreate input Bundle всегда равно null)

Сохранение пучка (активность A):

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putString("test", "value");
    super.onSaveInstanceState(outState);
}

Переход к активности B;

startActivity(new Intent(getBaseContext(), B.class));

Возвращаясь к активности A:

startActivity(new Intent(getBaseContext(), A.class));

Попытка загрузить значение, которое я написал, для связывания в активности A:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

Log.d("MY", "saved instance is null"+ Boolean.toString(savedInstanceState == null));
}

Возвращает всегда savedInstanceState = null. Что мне здесь не хватает?

onRestoreInstanceState никогда не запускается, когда я возвращаюсь к основной активности

4b9b3361

Ответ 1

В коде нет ничего плохого. Попытайтесь повернуть устройство, когда будете действовать на активность A. В журнале вы увидите следующее: это означает, что ваш onSaveInstanceState() работает нормально:

saved instance is nullfalse

Вот выдержка из сайта разработчика Android, который может показаться вам интересным:

Метод обратного вызова, в котором вы можете сохранять информацию о текущем состоянии вашей активности, - onSaveInstanceState(). Система вызывает этот метод, прежде чем сделать объект уязвимым для уничтожения и передает ему объект Bundle. В Bundle вы можете хранить информацию о состоянии активности как пары имя-значение, используя такие методы, как putString(). Затем, если система убивает ваш процесс активности, и пользователь переходит к вашей активности, система передает Bundle на onCreate(), поэтому вы можете восстановить состояние активности, которое вы сохранили во время onSaveInstanceState(). Если нет информации о состоянии для восстановления, тогда пакет, переданный в onCreate(), имеет значение null.

Примечание. Нет гарантии, что onSaveInstanceState() будет вызван до того, как ваша активность будет уничтожена, потому что есть случаи, когда нет необходимости сохранять состояние (например, когда пользователь покидает вашу деятельность с помощью клавиши BACK, потому что пользователь явно закрывает активность). Если метод вызывается, он всегда вызывается перед onStop() и, возможно, перед onPause().

Ответ 2

Я понял, что:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

при повторном запуске старого намерения с сохраненным состоянием из фона. Без этого флага я думаю, что когда вызывается startActivity, он создает новый экземпляр Activity вместо того, чтобы стареть из стека.

Ответ 3

Перед добавлением в него контента вы должны сделать super.onSaveInstanceState(outState).

Ответ 4

Если вы перейдете к другому действию и вернетесь, лучше всего сохранить его в SharedPreference в методе onPause(), который должен выполняться при загрузке нового действия. На другом Activity доступ к значению можно получить в onCreate() путем доступа к общим предпочтениям.

Ответ 5

Если вы хотите сохранить состояние своего фрагмента за поворот устройства, и вам интересно, что onSaveInstanceState никогда не вызывается:

  • Убедитесь, что вы вызываете super.onSaveInstanceState(outState); во всех ваших функциях onSaveInstanceState.
  • Убедитесь, что у вас нет android:configChanges в вашем AndroidManifest.xml.

Ответ 6

Если ваше приложение не работает на Lollipop (API21) версии Android или новее, ваш

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);

не будет вызываться, так как он просто не существует в более ранних версиях платформы, чем 21. Для поддержки устройств до API 21 вместо вышеуказанного необходимо переопределить следующий метод:

public void onSaveInstanceState (Bundle outState);

Это будет работать и с API 21+, поэтому вам, разумеется, не нужно переопределять оба метода (если вы не знаете, что вам нужно иметь дело с PersistableBundle, который предлагает новый).

(Скопировано, потому что это работает для меня) Источник: onSaveInstanceState не вызывается после поворота экрана