在Activity被杀死并重新创建后,片段仍然存在

时间:2013-05-16 14:31:53

标签: android android-fragments android-fragmentactivity kill-process ondestroy

我有一个FragmentActivity(支持片段),我按代码创建片段并将它们放入FrameLayouts。到目前为止一切正常。 现在,如果我离开应用程序返回一切正常,只要系统不会杀死我的活动(或者我使用DDMS中的停止按钮执行此操作)。如果发生这种情况,则不会调用任何内容,我的Activity也会被杀死。不调用onDestroy。

因此,当我重新打开我的应用程序时,所有碎片仍然存在,我得到NullPointerExeptions因为他们试图完成他们的工作。片段不应该存在于App的这种状态中,这对我来说是个问题。

我在backStack中不需要它们,所以我不把它们放在那里,不能调用popBackStack()来摆脱它们。

如何在onCreate()中重置FragmentManager,或者只是确保片段也被销毁?

4 个答案:

答案 0 :(得分:3)

片段的lifecycle类似于活动的生命周期,因此可以被系统杀死并重新创建,以便为其他应用程序节省内存。这意味着有一种机制可以保存和恢复片段的状态。你应该使用它。

如果无法保存片段的状态(由于其数据是动态且不可序列化的),请尝试为非初始化状态实现某些默认行为。

答案 1 :(得分:2)

这实际上可能是正常的。 Android可能会保留它们,而不是实例化和销毁大量的碎片。 ViewPagers尤其会出现这种情况。

您是否正在使用大量的getActivity()调用或调用上下文?如果是这样,null通过执行像

这样简单的操作来检查getActivity()调用
Activity activity = getActivity();
if ( activity == null )
{
   Log.w("activity null!", "This will cause a crash if you access this variable!");
}

另一个提示是注意AsyncTasks。如果您在后台运行任何这些,则需要跟踪活动是活还是死。我认为将生命周期检查放入更高版本的Android中,但您也可以在onAttach()和onDetach()上保留一个布尔标志。

答案 2 :(得分:2)

我知道它真的很晚但我有同样的问题,我在这里找到答案

support FragmentPagerAdapter holds reference to old fragments

在这里

ViewPager and fragments — what's the right way to store fragment's state?

我想问题是,当你创建活动时,你创建并保存片段在某些列表而不是片段menager。当再次创建活动时,它还会创建一个片段,但片段管理器使用之前创建的片段。这就是你的片段为getActivity()返回null的方式,因为这个片段是你将应用程序放在后台之前创建的片段。

答案 3 :(得分:0)

不确定它是否是同一个问题,但前段时间我在一个viewpager中遇到片段问题,其中片段生命周期方法从未被调用过,问题出在片段管理器上。

因此,尝试使用childFragmentManager而不是supportFragmentManager,看看它是否解决了您的问题。