#android #bundle #parcelable #onsaveinstancestate
#Android #пакет #разделяемый #onsaveinstancestate
Вопрос:
Я пытаюсь восстановить свое приложение после того, как оно было убито в фоновом режиме. Он всегда вылетает при попытке получить доступ к переменной «config», потому что она равна нулю, даже после того, как она была сохранена в onSaveInstanceState (это всегда так, я тестировал его в режиме отладки, и у внешнего состояния объект находится внутри его карты).
Что меня действительно смущает, так это то, что это отлично работает в случае вращения. Поэтому я думаю, что в построении объекта из parcel нет ничего плохого. Это просто не работает, когда я убиваю приложение в фоновом режиме.
Когда я регистрирую savedInstanceState в onCreate после завершения работы приложения в фоновом режиме, настройте.BUNDLE возвращает null = null (нет ключа, нет значения), но учетная запись.BUNDLE, который является аналогичным объектом, не поврежден.
Кроме того, я попытался добавить еще один строковый объект в savedInstanceState, и он также сохраняется правильно.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
Config config = savedInstanceState.getParcelable(Config.BUNDLE);
Config.setInstance(config);
Account account = savedInstanceState.getParcelable(Account.BUNDLE);
Account.setInstance(account);
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable(Config.BUNDLE, Config.getInstance());
outState.putParcelable(Account.BUNDLE, Account.getInstance());
}
Комментарии:
1.
onSaveInstanceState
иBundle savedInstanceState
предназначены для случаев вращения или других, очень временных, сценариев уничтожения / повторного создания. Уничтожение приложения в фоновом режиме было бы эквивалентно извлечению батареи из вашего приложения, поэтому ни один из методов жизненного цикла не полезен в этом сценарии.2. я думаю, вам нужно ввести параметры вашего пакета в конфигурацию
Ответ №1:
Я только что узнал, что проблема заключается в строке ключа пакета.
Конфигурация.BUNDLE — это строка со значением «BUNDLE_CONFIG» и учетной записью.BUNDLE — это «BUNDLE_ACCOUNT».
Если я изменю конфигурацию.СВЯЗЫВАЙТЕ строку с любым другим значением, не включая «CONFIG» в любой части строки, это работает, в противном случае это не так. Я даже очистил проект, но результат тот же. Я не понимаю, почему.
Пример:
public final static String BUNDLE = "BUNDLE_CONFIG"; //NOT OK
public final static String BUNDLE = "BUNDLE_SETTINGS_CONFIG"; //NOT OK
public final static String BUNDLE = "BUNDLE_TEST"; //OK
public final static String BUNDLE = "BUNDLE_ANY_OTHER_WORD"; //OK
Комментарии:
1. Значение строки ключа не должно иметь значения (в разумных пределах). Может быть, у вас есть какие-то устаревшие информационные ключи в SharedPreferences? Вы случайно не пытались удалить и переустановить APK, чтобы получить новый набор SharedPreferences? Просто мысль…