Как восстановить фрагмент обратной копии с помощью активности (после того, как приложение было убито в фоновом режиме)
В приложении для Android -
Скажите am в activiy-MyActivity, который содержит по одному фрагменту за раз.
Сначала я загрузил фрагмент A в него (без тегов я добавил его обратно в стек диспетчера фрагментов)
Затем в какой-то момент я загрузил Fragment B (без тегов я добавил его обратно в стек диспетчера фрагментов)
Затем в какой-то момент я загрузил Fragment C (без тегов я добавил его обратно в стек диспетчера фрагментов)
am, используя popbackstack, чтобы включить функцию обратной кнопки
Поэтому, когда я отжимаю Fragment C, поток похож на
Фрагмент C- > Фрагмент B- > Фрагмент A → Закрыть MyActivity..
Каждая вещь идеальная: -)
Но если am в Fragment C и приложение погибает в фоновом режиме (я не использовал флаг активности из настроек)
и вернуться в онлайн Фрагмент C загружается в MyActivity
но стоп-менеджер менеджеров фрагментов содержит только фрагмент C..
Кнопка "Назад" запускает его
Фрагмент C → Закрыть MyActivity..
Почему так?
Как правильно восстановить управление фрагментами с помощью стека в действии?
Ответы
Ответ 1
Попробуйте использовать alwaysRetainTaskState в своей корневой активности. Android автоматически очищает Backstack активности, потому что он предполагает, что с тех пор, как вы использовали приложение, прошло много времени, и пользователь хочет начать с самого начала.
<activity android:alwaysRetainTaskState="true"/>
Этот параметр предотвратит это поведение и может следовать, что поведение наследуется Менеджером фрагментов.
Ответ 2
При разработке приложения я рекомендую протестировать восстановленные/сохраненные состояния действий, фрагменты с АБР:
- Откройте приложение
- Перемещение между действиями
- Нажмите домой
- ADB → Убить (остановить) приложение
- Нажмите стек приложения (кнопку меню с устройства) и возобновите приложение
Таким образом вы можете отлаживать сохраненные/восстановленные состояния.
Если у вас нет сложного приложения, я предлагаю вам обработать состояние сохраненного/восстановленного в активности:
private Fragment1 mFragment;
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
// ...
if (savedState == null) {
mFragment = new Fragment1();
getFragmentManger().beginTransacation().add(mFragment, TAG).addToBackStack(TAG).commit();
}
else {
mFragment = getFragmentMananager().findFragmentByTag(TAG);
}
}
Если у вас есть несколько Fragments
или ViewPager
или вложенных фрагментов, тогда все может стать очень сложным. Я предлагаю вам перезагрузить все приложение:
@Override
protected void onCreate(Bundle savedState) {
super.onCreate(savedState);
if (savedState != null) {
Intent intent = new Intent(ActivityMain.this, ActivityMain.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
return;
}
}
Если вы хотите обрабатывать каждое состояние сохранения/восстановления, прочитайте это сообщение: http://www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html
Ответ 3
попробуйте этот метод
public void setRetainInstance (boolean retain)
Определите, сохраняется ли экземпляр фрагмента в процессе повторного создания активности (например, при изменении конфигурации). Это можно использовать только с фрагментами, не входящими в задний стек. Если установлено, жизненный цикл фрагмента будет немного отличаться при воссоздании активности:
с сайта разработчика
http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29
Ответ 4
Фрагмент C никогда не должен быть загружен после того, как ваше приложение умрет. У вас есть фрагмент Init в вашем приложении? В идеале, когда вы реализуете поп-фрагменты, должен быть экран Init. Если приложение умирает или убивается по соображениям памяти, приложение должно начинаться с фрагмента A (фрагмент Init). Не из фрагмента C.
Если ваша проблема требует этого решения, вам придется постоянно сохранять каждый фрагмент, когда новый фрагмент появляется сверху. Это в идеале означает, что вы сохраняете свою заднюю часть в предпочтении или базу данных для достижения этой цели.