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
никогда не называется
- Проверьте, звоните ли вы
super.onSaveInstanceState(outState);
во всех вашихonSaveInstanceState
функции. - Проверьте, что у вас нет
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 не вызывается после поворота экрана