Activity被杀死并重新创建后仍保留碎片

问题描述 投票:24回答:4

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

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

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

如何在onCreate()中重置我的FragmentManager或只是确保碎片也被销毁?

android android-fragments android-fragmentactivity kill-process ondestroy
4个回答
4
投票

片段的lifecycle与活动的生命周期相似,因此可以将其杀死并由系统重新创建,以节省其他应用程序的内存。这意味着存在一种用于保存和还原片段状态的机制。您应该使用它。

  • 将片段的状态保存在onSaveInstanceState
  • 恢复状态-通过多种方法(onSaveInstanceStateonCreate等)将saveState包提供给该片段

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


2
投票

这实际上可能是正常的。 Android可能没有实例化和销毁很多Fragment,而是将它们保留了下来。对于ViewPagers尤其如此。

您是否正在使用很多getActivity()调用或获取上下文的调用?如果是这样,请通过执行简单的操作

null检查getActivity()调用。
onCreateView

另一个提示是当心AsyncTasks。如果其中任何一个在后台运行,则需要跟踪该活动是否存在。我认为更高版本的Android中进行了生命周期检查,但您也可以在onAttach()和onDetach()上保留一个布尔标志。


2
投票

我知道确实很晚,但是我有同样的问题,我在这里找到了答案

Activity activity = getActivity(); if ( activity == null ) { Log.w("activity null!", "This will cause a crash if you access this variable!"); }

和这里

support FragmentPagerAdapter holds reference to old fragments

我想问题是,当您创建活动时,您将片段创建并保存在某个列表中,而不是片段管理器中。再次创建活动时,它还会创建一个片段,但是片段管理器将使用之前创建的片段。这就是为什么您的片段为getActivity()返回null的原因,因为该片段是在将应用程序置于后台之前创建的片段。]


0
投票

[不确定是否是相同的问题,但是前一段时间我在viewpager中遇到了片段问题,该片段从未调用过片段生命周期方法,而问题出在片段管理器上。

© www.soinside.com 2019 - 2024. All rights reserved.