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

Posted

技术标签:

【中文标题】Activity 被杀死并重新创建后,碎片仍然存在【英文标题】:Fragments remain after Activity get's killed and recreated 【发布时间】:2013-05-11 12:18:28 【问题描述】:

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

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

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

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

【问题讨论】:

你找到解决办法了吗? 【参考方案1】:

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

将片段的状态保存在onSaveInstanceState 恢复状态 - savedState 包以多种方法提供给片段(onCreate、onCreateView 等)

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

【讨论】:

【参考方案2】:

这实际上可能是正常的。 android 可能会保留它们,而不是实例化和销毁大量 Fragment。这尤其发生在 ViewPagers 上。

您是否使用了很多 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() 上保留一个布尔标志。

【讨论】:

那么接下来呢?确定 getaActivity() 返回 null 后,如何重新创建 Activity 或如何关闭应用?【参考方案3】:

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

support FragmentPagerAdapter holds reference to old fragments

这里

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

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

【讨论】:

请注意,不鼓励link-only answers,因此答案应该是搜索解决方案的终点(与另一个参考文献的中途停留相比,随着时间的推移往往会变得陈旧)。请考虑在此处添加独立的概要,并保留链接作为参考。 这些链接确实解释了很多细节。很好的答案。【参考方案4】:

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

所以,请尝试使用 childFragmentManager 而不是 supportFragmentManager,看看它是否能解决您的问题。

【讨论】:

如果你的 Activity 被杀死,onDestroy 会被调用。而且我很确定,当您的活动被杀死时,碎片也会随之而来。是什么让您认为您的 Activity 确实被杀死了?您确定没有任何东西可以保留对您的片段的引用吗? 问题是 onDestroy 并没有被确定地调用。但是当 onCreate 被调用时,我知道它已经被销毁了。我所有的引用都在被破坏的活动中,所以没有。 你绝对不能依赖 onDestroy() 被调用,并且有可能的副作用,比如设法阻止 onDestroy() 完成。这可能是一团糟

以上是关于Activity 被杀死并重新创建后,碎片仍然存在的主要内容,如果未能解决你的问题,请参考以下文章

如果 Activity 被操作系统杀死,我们如何检索保存的状态?

我杀死应用程序并快速重新运行后,徽章不计入

删除后碎片仍然存在吗?

Activity详解(二)——异常情况下的生命周期分析

如果脚本被杀死,node.js 生成的进程仍然存在

保存数据返回后可以继续编辑