【问题标题】:Is calling methods on Activity in Fragment's onDestroy method safe?在 Fragment 的 onDestroy 方法中调用 Activity 的方法是否安全?
【发布时间】:2016-05-21 18:57:52
【问题描述】:

我有一个 Activity MyActivity 和一个 Fragment MyFragmentActivityonDestroy() 方法以super.onDestroy() 开头。

从日志语句和Android 源代码来看,看起来Activity 的超级onDestroy() 方法调用了FragmentonDestroy() 方法。然后当FragmentonDestroy() 方法完成时,将执行ActivityonDestroy() 方法的其余部分。所以我相信,直到FragmentonDestroy() 方法完成之后,Activity 才会被销毁。

这让我觉得从MyFragmentonDestroy() 方法我可以安全地调用MyActivity 的快速方法并依赖MyActivity 的属性。我永远不会这样做,但假设我在 MyFragment 的 onDestroy 方法中时可以依赖 `MyActivity 中的属性和方法吗?

文档对ActivityonDestroy() 方法的描述,“您在活动被销毁之前收到的最终调用”,我的意思是在此方法返回后Activity 将被销毁。

FragmentonDestroy() 方法文档并没有真正说明Activity 是否已启动销毁过程。

【问题讨论】:

  • onDestroy() 上使用Activity 是完全安全的。在onDestroy() 之后,另一个名为onDetach() 的生命周期方法被调用,并且仅从它们对它的Activity 不保存使用。在那之后getActivity() 或者应该返回null,直到再次调用onAttach()onAttach()Fragment 生命周期中的第一个调用之一,发生在 onCreate() 之前。

标签: android android-fragments android-activity android-lifecycle


【解决方案1】:

FragmentonDestroy() 方法中使用托管Activity 是完全安全的。
Fragment 生命周期的简化版本如下所示:

  • onAttach(Context):Fragment 附加到主机(通常是Activity
  • onCreate(Bundle)
  • onCreateView(LayoutInflater, ViewGroup, Bundle)
  • onStart()
  • onResume()
    ...
  • onPause()
  • onStop()
  • onDestroyView()
  • onDestroy()
  • onDetach()Fragment 与其主机分离。

因此对于从onCreate(Bundle)onDestroy() 的整个生命周期,您可以毫无问题地使用和参考托管Activity

【讨论】:

  • 好的,尽管我认为有问题的评论似乎对 OP 的要求更有帮助:)))
  • @Onik,抱歉我不知道 OP 是什么意思?
  • @flobacca What does OP mean?
  • 我打算用两个cmets来回答,所以请看两个cmets。我不认为在片段的 onDestroy 调用中使用活动是完全安全的。原因是Activity的performDestroy()方法在调用mFragments.dispatchDestroy()之前调用了mWindow.destroy()。因此,当碎片被破坏时,活动并不是完全完整的。还有谁知道在Activity的mFragments.dispatchDestroy()方法之前会调用什么方法。所以以后Activity可能会在调用fragment的onDestroy方法之前被更多的销毁。
  • 但是,在 MyActivity 的 onDestroy 方法中使用来自 MyActivity 的属性和方法可能是安全的,因为 onDestroy 的超级方法不会更改属于 MyActivity 的属性。此外,Activity 在调用 onDestroy() 之前调用了 mFragments.dispatchDestroy(),因此看起来 Activity 正在采取措施在销毁自身之前销毁其 Fragment。可以为 AppCompatActivity 提出类似的论点,因为它的 super.onDestroy 方法被注释为“销毁所有片段和加载器”。继续下一条评论。
【解决方案2】:

依赖 onDestroy() 是不安全的,检查table

活动可以在 onPause() 之后被杀死。

作为一个 Fragment 镜像宿主 Activity 的生命周期,它也会被杀死。

但假设性

嗯,onDestroy() 应该在宿主 Activity 之前调用。

您也可以查看complete Android Fragment & Activity Lifecycle

考虑 api 23 中的新权限处理程序。用户可能会在运行时撤销权限,并且您的进程将以与“内存不足的情况”相同的方式终止。

【讨论】:

  • 感谢您的回复。您是否指的是“通常活动生命周期中的运动如下所示:”图表?那是指 Activity 的 onDestroy() 方法。我同意 Activity 可以在暂停后被杀死,但我的问题是 Fragment 的 onDestroy 方法,所以我要问的情况是何时调用 Activity 的 onDestroy 方法。
  • 作为一个 Fragment 镜像宿主 Activity 的生命周期,它也会被杀死。
  • 您误解了图表。所有组件,无论是Activity 还是Fragment,都将始终经历其完整的生命周期。如果不调用onStop()onDestroy() 和所有其他生命周期方法,就不可能在onPause() 之后杀死Activity
  • Fragment 也将经历其 while 生命周期。 onDestroy()Fragment 的生命周期中位于onDetach() 之前,因此在onDestroy() 上使用Activity 是完全安全的。
  • @Xaver Kapeller 声明 “所有组件,无论是 Activity 还是 Fragment,都将始终经历其完整的生命周期。没有办法在 onPause() 之后杀死一个 Activity调用 onStop()、onDestroy() 和所有其他生命周期方法" 是不正确的。当系统内存不足时,可能不会调用onStop(),尤其是onDestroy()。因此,onSaveInstanceState() 在调用onPause()onStop() 之间的某个地方被调用。
猜你喜欢
  • 2012-08-17
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多