活动被销毁并重新创建后,片段仍然存在。

29
我有一个FragmentActivity(支持Fragments),通过代码创建Fragments并将它们放入FrameLayouts中,目前一切都很正常。如果我离开应用程序并返回,只要系统不杀掉我的Activity(或者我使用DDMS中的停止按钮杀掉Activity),一切都还好。但是,如果发生这种情况,什么也不会被调用,我的Activity就会被杀掉,onDestroy方法不会被调用。

因此,当我重新打开应用程序时,所有的Fragments仍然存在,我会得到NullPointerExceptions,因为它们尝试执行它们的工作。在这种应用程序状态下,Fragments不应该存在,这对我来说是个问题。

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

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


1
你找到这个问题的解决方案了吗? - Henry
4个回答

6

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

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


3

这其实是很正常的。Android可能会保留一些Fragment,而不是频繁地实例化和销毁它们。特别是在使用ViewPager时会经常出现这种情况。

你是否经常调用getActivity()或获取上下文的方法?如果是的话,建议进行 getActivity() 方法的空值检查,可以采取简单的措施:

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

另一个提示是要注意AsyncTasks。如果您在后台运行任何此类任务,您需要追踪Activity是否还存活。我认为在后续版本的Android中已经放入了生命周期检查,但您也可以在onAttach()和onDetach()中保留布尔标志。


那么接下来呢?在确定getActivity()返回null后,如何重新创建活动或关闭应用程序? - shankar_vl

2

我知道现在已经很晚了,但我遇到了同样的问题,并在这里找到了答案:

support FragmentPagerAdapter holds reference to old fragments

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

我猜问题出在当你创建 Activity 时,把 fragments 存储在某个列表中而不是 fragment 管理器中。当 Activity 再次创建时,它也会创建一个新的 fragment,但是 fragment 管理器使用之前创建的 fragment。这就是为什么你的 fragment 返回 null for getActivity(),因为这个 fragment 是在你将应用程序放到后台之前创建的那个。


2
请注意,仅链接的答案是不鼓励的,SO答案应该是寻找解决方案的终点(而不是另一个参考站点,往往会随着时间而过时)。请考虑在此处添加一个独立的摘要,将链接作为参考。 - kleopatra

0

不确定是否是同样的问题,但之前我遇到过一个与viewpager中的片段有关的问题,在那里片段的生命周期方法从未被调用,问题出在片段管理器上。

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


如果您的Activity被杀死,onDestroy方法将被调用。我非常确定当您的Activity被杀死时,其中的Fragment也会随之销毁。您怎么知道您的Activity已经被杀死了?您确定没有任何东西保留了对您的Fragment的引用吗? - Christine
问题在于 onDestroy 不一定会被调用。但是当 onCreate 被调用时,我知道它已经被销毁了。所有我的引用都在已销毁的活动中,所以不行。 - Towlie288
您绝对不能依赖于onDestroy()方法被调用,而且可能会出现像无法完成onDestroy()方法等副作用。这将会变得一团糟。 - Joe Plante

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接