onSaveInstanceState не сохраняет мои значения (входной пакет onCreate всегда равен нулю)

Сохранение пакета (мероприятие А):

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

Переход к действию B;

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

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

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));
}

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

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

5 ответов

Решение

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

saved instance is nullfalse

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

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

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

Я получил это решение, имея:

intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);

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

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

Вы должны сделать super.onSaveInstanceState(outState), прежде чем добавлять к нему контент.

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

  1. Проверьте, звоните ли вы super.onSaveInstanceState(outState); во всех ваших onSaveInstanceState функции.
  2. Проверьте, что у вас нет android:configChanges в вашем AndroidManifest.xml.

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

public void onSaveInstanceState (Bundle outState, PersistableBundle outPersistentState);

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

public void onSaveInstanceState (Bundle outState);

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

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

Другие вопросы по тегам