Как восстановить фрагмент обратной копии с помощью активности (после того, как приложение было убито в фоновом режиме)

В приложении для 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.

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