【问题标题】:Android onDestroy and Onstop not guarantied to be calledAndroid onDestroy 和 Onstop 不保证被调用
【发布时间】:2020-12-21 20:24:59
【问题描述】:

在我的 android 应用程序(用 kotlin 编写)中,我想在我的活动被破坏时保存一些数据。但我有一个问题。我做了研究,发现 onDestroy() 和 onStop() 方法不能保证被调用。所以实际上我的活动可以在不调用 onDestroy() 方法的情况下被破坏,这对我来说是一场灾难。 请问,有没有人对这个问题有一些温和的解决方案?

【问题讨论】:

  • 你在哪里读到 onStop() 不能保证被调用?
  • 哦该死的。我刚刚发现,对于运行 4.0 和更低版本的设备,onStop() 没有保证,而对于高于 4.0 的设备,则可以。好的很酷,这些几乎都是设备:)
  • 但是@BömachtBlau 如果永远不会保证调用 onDestroy 方法,那么它的用途是什么。我看不到任何我会使用它的场景......它看起来很不安全,我不喜欢编程中的不安全......
  • onDestroy() 被称为例如当 Activity 因配置更改而被销毁时
  • 多年来,事情时不时地发生变化 - 我只是重新阅读this guide 以了解今天的情况

标签: android kotlin


【解决方案1】:

onDestroy()你是对的

不要指望这个方法被称为保存数据的地方!

对于保存状态,您应该使用onPause()onSaveInstanceState()onStop() - 一旦您的 Activity 不再对用户可见,就会被调用。

【讨论】:

    【解决方案2】:

    一些附加信息:

    覆盖onDestroy 的目的是如果您需要清理可泄漏资源,例如使用本机内存的资源或持有对象引用的衍生线程。它永远不会像您在 cmets 中建议的那样“变得安全”,因为将它用作保存状态的钩子并不是它的目的。不能保证被调用的原因是,如果操作系统完全关闭你的应用程序,你的应用程序的整个内存堆都会被释放,在这种情况下调用它是多余的。

    大多数应用永远不需要覆盖它,因为大多数应用不直接分配内存,而且处理异步工作的技术比直接生成线程更好。

    【讨论】:

    • 我理解你,你想说最好使用它来取消注册接收器、监听器等以避免内存泄漏。那完全没问题。但是在 android 中,经常有一些情况下你必须在 Activity 被销毁时执行一些操作,而这些情况让我感到困惑。您确定不能调用 onDestroy() 的唯一原因是操作系统杀死了我的整个应用程序吗?
    • 这是文档中描述的唯一情况,但它的措辞不一定能保证。通常,销毁 Activity 时您必须做的事情是拆除您在 onCreate() 中设置的内容,例如取消注册侦听器,在这种情况下,可以在 onDestroy() 中执行此操作。例如,如果您在onCreate() 中设置了 SharedPreferencesOnChangedListener,则在镜像方法onDestroy() 中取消注册它是有意义的。
    • 但在现代 Android 推荐实践中,大多数类似的东西都在 ViewModel 中。这就是我说不需要覆盖onDestroy() 的部分原因。我不确定当 Activity 被销毁时,您还想做什么其他类型的事情。
    • 例如在我公司的应用程序中,我们有 PlayGameActivity,我们在其中开始玩游戏。我们重写了 OnDestroy() 方法,因此当我们玩完游戏并返回另一个活动时,我们可以调用 client.refresh() 来刷新我们的平衡。所以这不是“监听者注销”的情况,但我们仍然需要 OnDestroy 来做到这一点。我也想问你。如果我们有fragment,是否真的可以在这种情况下使用onDetach()(是否保证被调用?)并在这里完成所有工作。
    • 哦,所以当我的应用程序处于后台并且 Android 操作系统将其关闭时,不会调用 OnDestroy()?现在我完全明白了你想说的话,这就清楚了。好的,谢谢您的解释,您帮助我理解了这件事!
    猜你喜欢
    • 2014-06-24
    • 2011-11-06
    • 2016-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    相关资源
    最近更新 更多