Android 屏幕关闭并再次打开时失去状态

Android losing state when screen is OFF and ON again

我正在努力解决关于 Activity > ViewPager > Fragments 的问题,这些问题正在被完全破坏并重新创建,我正在处理这种情况,比如当屏幕 orientation 改变时我只是 restore 我的 data 来自保存的 instance,但是当我的设备闲置一段时间并且屏幕再次进入 offON 时,保存的 data 里面instancedestroyed 并且它是空的。
代码示例:

Base Fragment

@Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
}

 @Override public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    Icepick.restoreInstanceState(this, savedInstanceState);
    setRetainInstance(true);
}

Activity

    mAdapter = new BrochureContentAdapter(getSupportFragmentManager(), models);
    pager.setAdapter(mAdapter);
    pager.setCurrentItem(position, true);
    pager.setOffscreenPageLimit(models.size());

当屏幕旋转(重新创建)时,BaseFragment 通过 IcePick 处理保存和恢复 instance 一切顺利,我唯一的问题是在 fragment 中扩展 BaseFragment 如果屏幕进入 idle 一段时间然后返回 ON,则保存的实例将被完全销毁。

有人遇到过类似的问题并找到解决方法了吗?

您的 activity 可能正在破坏 FragmentManager 的实例,这意味着您的 Fragment(连同它在 savedInstanceState 中的数据)可能会被破坏。 在此处查看此答案:

您是否尝试过在 onStart()onResume() 中从您的 Activity 恢复片段,看看是否可行?

也许您的片段没有被完全销毁,只有它的视图被销毁了。检查片段是否调用了 onDestroyView,如果是,则在 OnActivityCreated.

中恢复您的视图状态

真正为我解决问题的只是移动东西,例如

Icepick.restoreInstanceState(this, savedInstanceState);

onActivityCreated 里面,每次我从屏幕 OFF 出来时都会调用它 OFF 我的 bundle 数据正在被清除并解决这个问题我的 saving/restoring 顺序变成如下:

@Override public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    Icepick.saveInstanceState(this, outState);
}

@Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    if (savedInstanceState != null && !savedInstanceState.isEmpty()) {
        Icepick.restoreInstanceState(this, savedInstanceState);
    }
}

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

Icepick.restoreInstanceState(this, savedInstanceState);onActivityCreated 移动到 onViewCreated 并将 setRetainInstanceonActivityCreated 移动到 onCreate 解决了这个问题。
我希望它能帮助将来的人。