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

时间:2016-02-19 04:25:16

标签: android android-fragments fragmentmanager

在Android应用中 -

说我在std::cout << (j % 10) << ' '; - MyActivity ,一次只能容纳一个Activity

首先我加载片段A (没有标记我将其添加到Fragment的后台堆栈中)

然后在某些时候我加载片段B (再次没有标记我将其添加到FragmentManager的后台堆栈中)

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

我正在使用FragmentManager启用后退按钮行为,因此每当我从 Fragment C 按回来时,流程就像:

片段C - &gt; 片段B - &gt; 片段A - &gt; 关闭 MyActivity ..

一切都很完美: - )

但如果我在 Fragment C 并且应用程序在背景中被杀死(我使用&#34;请不要保留活动标记&#34;来自设置)< / p>

重新联机 片段C 已加载到 MyActivity

popBackStack()后筹码只包含片段C ..

后退按钮搞砸了

片段C - &gt; 关闭MyActivity ..

为什么会这样?

如何在FragmentManager内正确恢复FragmentManager的后筹码?

4 个答案:

答案 0 :(得分:11)

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

 <activity android:alwaysRetainTaskState="true"/>

此设置将阻止该行为,并且可能会跟随片段管理器继承该行为。

答案 1 :(得分:4)

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

  1. 打开应用
  2. 在活动之间导航
  3. 按主页
  4. ADB - &gt;杀死(停止)应用
  5. 按应用程序堆栈(设备中的菜单按钮)并恢复应用程序
  6. 这样您就可以调试保存/恢复状态。

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

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

    如果你有几个FragmentsViewPager或嵌套的片段,那么事情会变得非常复杂。我建议你重新启动整个应用程序:

    @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

答案 2 :(得分:1)

尝试这种方法

public void setRetainInstance (boolean retain)

控制是否在活动重新创建(例如从配置更改)中保留片段实例。这只能用于不在后栈中的片段。如果设置,则重新创建活动时片段生命周期将略有不同:

来自开发者网站 http://developer.android.com/reference/android/app/Fragment.html#setRetainInstance%28boolean%29

答案 3 :(得分:0)

应用程序终止后,永远不应加载片段C.你的应用程序中有Init片段吗?理想情况下,当您实现一个片段弹出时,应该有一个Init屏幕。如果应用程序因内存原因而死亡或被杀死,则应用程序应从Fragment A(Init Fragment)开始。不是来自片段C。

如果你的问题需要这个解决方案,那么当一个新的片段出现时,你必须持久保存每个片段。理想情况下,这意味着您可以在首选项或数据库中持久保存后台堆栈以实现此目的。