Bundle savedInstanceState parcelable объект равен null = null при завершении работы приложения в фоновом режиме

#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? Просто мысль…