在OS杀死活动后,片段savedInstanceState不为null

时间:2017-02-06 14:10:34

标签: android android-fragments android-lifecycle

我有一个片段通过setRetainInstance(true)保存状态。这是我的片段非常简化的代码:

public class MyFragment extends Fragment {
  private SomeData mData;

  public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setRetainInstance(true);
  }

  @Override
  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
      if (savedInstanceState == null) {
        mData = new SomeData(getView());
      } else {
        mData.refresh(getView());
      }
      // More awesome code
    }
  }
}

有时,应用会因NullPointerException而崩溃 - 我的mData突然变为null。当我折叠应用程序并在一段时间后返回时会发生这种情况。

我有一些理论。一段时间后,操作系统会杀死ActivityFragment(尽管setRetainInstance (true))。这样就创建了我的片段的新对象,其中mDatanull初始化。但savedInstanseState不等于null。因此,新片段跳过初始化并尝试在空引用上调用refresh(View)

我的问题: 当操作系统终止活动时(当应用程序不在屏幕上时)并在返回后重新创建时,我的代码段中的savedInstanseState方法中包含onActivityCreated(savedInstanceState)变量的内容是什么?

1 个答案:

答案 0 :(得分:0)

完全不确定答案,但这是我可以猜到的

  

setRetainInstance(boolean retain)控制是否为片段实例   在活动重新创建过程中保留(例如从配置中保留)   更改)。 这只能用于不在后堆栈中的片段。

所以我认为当你折叠活动时,视图会被破坏,实例数据(setReetainInstance值)会保存在bundle中(在加载时使savedInstanceState!= null)。但是,当你加载活动时(因为之前的retainInstance设置为true)onCreate()没有被调用,因为savedInstanceState!= null和mData == null你得到错误。