如何在活动中恢复片段后台堆栈(在后台应用程序被杀死后)

Aru*_*n C 14 android android-fragments fragmentmanager

在Android应用程序中 -

说我在Activity- MyActivity,一次Fragment举行一个.

首先我将片段A加载到它(没有标签我将它添加到后面的堆栈中FragmentManager)

然后在某些时候我加载片段B(再次没有标签我把它添加到后面的堆栈FragmentManager)

然后在某些时候我加载了片段C(再次没有标签我把它添加到后面的堆栈FragmentManager)

popBackStack()用来启用后退按钮行为,所以每当我从Fragment C按回来时,流程就像:

片段C - > 片段B - > 片段A - > 关闭MyActivity ..

一切都很完美:-)

但如果我在片段C中并且应用程序在后台杀死(我 "设置"中使用了"不要保留活动标志")

在线返回 Fragment C加载到MyActivity中

但是FragmentManager后面的堆栈只包含Fragment C ..

后退按钮搞砸了

片段C - > 关闭MyActivity ..

为什么会这样?

如何正确恢复FragmentManager一个Activity

shr*_*der 9

尝试在root活动上使用alwaysRetainTaskState.Android会自动清除Activity backstack,因为它假设您使用该应用程序已经很长时间了,并且用户想要从一开始就重新开始.

 <activity android:alwaysRetainTaskState="true"/>
Run Code Online (Sandbox Code Playgroud)

此设置将阻止该行为,并且可能遵循片段管理器继承行为.


Zba*_*ian 6

在开发您的应用程序时,我建议您使用 ADB 测试活动、片段的恢复/保存状态:

  1. 打开应用
  2. 在活动之间导航
  3. 按回家
  4. ADB -> 杀死(停止)应用程序
  5. 按下应用程序堆栈(设备上的菜单按钮)并恢复应用程序

这样您就可以调试保存/恢复状态。

如果您没有复杂的应用程序,我建议您在活动中处理保存/恢复状态:

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

如果您有多个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;
   }
}
Run Code Online (Sandbox Code Playgroud)

如果你想处理每个保存/恢复状态,请阅读这篇文章:http : //www.androiddesignpatterns.com/2013/08/fragment-transaction-commit-state-loss.html