Пакетный объект saveInstanceState имеет значение null = null при завершении приложения в фоновом режиме.

Я пытаюсь восстановить свое приложение после того, как оно было убито в фоновом режиме. Он всегда падает при попытке доступа к переменной «config», потому что она равна нулю, даже после того, как она была сохранена в onSaveInstanceState (это всегда так, я тестировал ее в режиме отладки, и вне состояния имеет объект внутри своей карты).

Что меня действительно смущает, так это то, что это отлично работает в случае вращения. Так что я думаю, что нет ничего плохого в том, чтобы построить объект из посылки. Это просто не работает, когда я закрываю приложение в фоновом режиме.

Когда я регистрирую saveInstanceState в onCreate после того, как я убиваю приложение в фоновом режиме, Config.BUNDLE возвращает null = null (без ключа, без значения), но Account.BUNDLE, который является аналогичным объектом, не поврежден.

Кроме того, я попытался добавить еще один объект String в saveInstanceState, и он также сохраняется правильно.

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

person amanique    schedule 12.10.2016    source источник
comment
onSaveInstanceState и Bundle savedInstanceState предназначены для случаев ротации или других, очень временных сценариев уничтожения/воссоздания. Уничтожение приложения в фоновом режиме было бы эквивалентно извлечению батареи из вашего приложения, поэтому ни один из методов жизненного цикла в этом сценарии не полезен.   -  person DeeV    schedule 12.10.2016
comment
я думаю, вам нужно ввести параметры вашего пакета в Config   -  person Rahul Khurana    schedule 12.10.2016


Ответы (1)


Я только что узнал, что проблема заключается в строке ключа Bundle.

Config.BUNDLE — это строка со значением «BUNDLE_CONFIG», а Account.BUNDLE — «BUNDLE_ACCOUNT».

Если я изменю строку Config.BUNDLE на любое другое значение, не включая «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
person amanique    schedule 13.10.2016
comment
Значение ключевой строки не должно иметь значения (в пределах разумного). Может быть, у вас есть устаревшие информационные ключи в SharedPreferences? Вы пробовали удалить и переустановить APK, чтобы получить новый набор SharedPreferences? Просто мысль... - person Mike; 27.08.2017