Android 屏幕关闭并再次打开时失去状态
Android losing state when screen is OFF and ON again
我正在努力解决关于 Activity > ViewPager > Fragments
的问题,这些问题正在被完全破坏并重新创建,我正在处理这种情况,比如当屏幕 orientation
改变时我只是 restore
我的 data
来自保存的 instance
,但是当我的设备闲置一段时间并且屏幕再次进入 off
和 ON
时,保存的 data
里面instance
是 destroyed
并且它是空的。
代码示例:
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
并将 setRetainInstance
从 onActivityCreated
移动到 onCreate
解决了这个问题。
我希望它能帮助将来的人。
我正在努力解决关于 Activity > ViewPager > Fragments
的问题,这些问题正在被完全破坏并重新创建,我正在处理这种情况,比如当屏幕 orientation
改变时我只是 restore
我的 data
来自保存的 instance
,但是当我的设备闲置一段时间并且屏幕再次进入 off
和 ON
时,保存的 data
里面instance
是 destroyed
并且它是空的。
代码示例:
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
并将 setRetainInstance
从 onActivityCreated
移动到 onCreate
解决了这个问题。
我希望它能帮助将来的人。