Я обнаружил, что причина, по которой мое приложение перезагружается, заключается в том, что устройству не хватает памяти при запуске приложения камеры, а ОС перезапустила мою основную активность. Это не было бы проблемой, за исключением того, что у меня был макет на основе фрагментов, и некоторая инициализация фрагмента выполнялась в onCreate()
, независимо от saveInstanceState. Это привело к тому, что автоматическое восстановление фрагмента было отменено, и приложение выглядело так, как будто оно перезапускалось с самого начала, хотя на самом деле оно просто пыталось восстановить.
Ex:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// add main menu -- WRONG!
MainMenuFragment mainMenu = new MainMenuFragment();
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
ft.add(R.id.contents, mainMenu);
ft.commit();
if (savedInstanceState != null) {
// <restore state>
}
else {
// <initialize stuff>
}
}
Чтобы исправить это, я пропустил инициализацию фрагмента, когда saveInstanceState не был нулевым, и убедился, что состояние сохранялось правильно в onSaveInstanceState()
и восстановлено в onCreate()
, и реализовал обычную обработку для onActivityResult()
.
Ex:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (savedInstanceState != null) {
// <restore state>
}
else {
// <initialize stuff>
// add main menu -- CORRECT!
MainMenuFragment mainMenu = new MainMenuFragment();
FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction();
ft.add(R.id.contents, mainMenu);
ft.commit();
}
}