Android onDestroy和Onstop不保证被调用

Android onDestroy和Onstop不保证被调用,android,kotlin,Android,Kotlin,在我用kotlin编写的android应用程序中,我想在我的活动被破坏时保存一些数据。但我有个问题。我做了研究,发现onDestroy和onStop方法不能保证被调用。所以实际上,我的活动可以在不调用onDestroy方法的情况下被销毁,这对我来说是一场灾难。 请问,有没有人能温和地解决这个问题?你说得对 不要指望调用此方法作为保存数据的位置 要保存状态,应使用onPause、onSaveInstanceState或 -一旦用户看不到您的活动,就会调用它。关于 不要指望调用此方法作为保存数据的位

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

你说得对

不要指望调用此方法作为保存数据的位置

要保存状态,应使用onPause、onSaveInstanceState或 -一旦用户看不到您的活动,就会调用它。

关于

不要指望调用此方法作为保存数据的位置

要保存状态,应使用onPause、onSaveInstanceState或
-一旦用户看不到您的活动,就会调用它。

一些其他信息:

重写OnDestry的目的是,如果您需要清理可泄漏的资源,例如使用本机内存的资源或保留对象引用的派生线程。它永远不会像您在评论中建议的那样安全,因为将它用作保存状态的钩子并不是它的目的。无法保证调用它的原因是,如果操作系统完全关闭应用程序,应用程序的整个内存堆都会被释放,在这种情况下,调用它是多余的


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

一些其他信息:

重写OnDestry的目的是,如果您需要清理可泄漏的资源,例如使用本机内存的资源或保留对象引用的派生线程。它永远不会像您在评论中建议的那样安全,因为将它用作保存状态的钩子并不是它的目的。无法保证调用它的原因是,如果操作系统完全关闭应用程序,应用程序的整个内存堆都会被释放,在这种情况下,调用它是多余的



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

你从哪里读到onStop不能保证被调用?哦,该死。我刚刚发现,对于运行4.0及更低版本的设备,桌面是不安全的,而对于高于4.0的设备,则是安全的。好吧,酷,这些几乎都是设备:但是@BömachtBlau如果从来没有保证调用onDestroy方法,那么使用onDestroy方法还有什么意义呢。我看不到任何场景我会使用它。。。它看起来很不安全,我不喜欢编程中的不安全…onDestroy被调用,例如,当活动因多年的配置变化而被破坏时,事情会时不时地发生变化-我只是重读一遍,以确定今天的情况。你在哪里读到onStop不能保证被调用?哦,该死。我刚刚发现,对于运行4.0及更低版本的设备,桌面是不安全的,而对于高于4.0的设备,则是安全的。好吧,酷,这些几乎都是设备:但是@BömachtBlau如果从来没有保证调用onDestroy方法,那么使用onDestroy方法还有什么意义呢。我看不到任何场景我会使用它。。。它看起来很不安全,我不喜欢编程中的不安全…onDestroy被称为onDestroy,例如,当活动因多年的配置变化而被破坏时,事情会时不时地发生变化-我只是重读一遍,以确定今天的情况我理解你,你想说最好使用它,例如注销接收器,侦听器等,以避免内存泄漏。那太好了。但在安卓系统中,经常会出现这样的情况:当活动被破坏时,你必须采取一些行动,这些情况让我感到困惑。您确定不能调用onDestroy的唯一原因是因为操作系统杀死了我的整个应用程序吗?这是文档中描述的唯一情况,但它的措辞不一定能保证这一点。通常,当一个活动被销毁时,您必须做的事情是拆除您在onCreate中设置的内容,例如取消注册侦听器,在这种情况下,在onDestroy中这样做是可以的。例如,如果您在onCreate中设置了SharedReferencesOnChangedListener,那么在Stroy的镜像方法中注销它是有意义的。但是在现代Android推荐的实践中,大多数类似的东西都会在ViewModel中。这就是我说覆盖onDestroy并不常见的部分原因。我不确定当一个活动被破坏时,你在想什么样的事情可能需要做。例如,在我公司的应用程序中,我们有PlayGameActivity,在其中我们开始玩游戏。我们用了超常的方法
所以我们可以调用client.refresh来刷新我们的平衡,当我们完成游戏并返回到另一个活动时。所以这不是监听器注销的情况,但我们仍然需要OnDestroy来完成。我也想问你。如果我们有fragment,我们真的可以在这种情况下使用onDetach吗?它是否保证被调用?所以当我的应用程序在后台并且Android操作系统关闭它时,OnDestroy就不会被调用了?现在我完全明白你想说什么了,这就清楚了。好的,谢谢你的解释,你帮我理解了这件事!我理解你,你想说最好用它来注销接收器、侦听器等,以避免内存泄漏。那太好了。但在安卓系统中,经常会出现这样的情况:当活动被破坏时,你必须采取一些行动,这些情况让我感到困惑。您确定不能调用onDestroy的唯一原因是因为操作系统杀死了我的整个应用程序吗?这是文档中描述的唯一情况,但它的措辞不一定能保证这一点。通常,当一个活动被销毁时,您必须做的事情是拆除您在onCreate中设置的内容,例如取消注册侦听器,在这种情况下,在onDestroy中这样做是可以的。例如,如果您在onCreate中设置了SharedReferencesOnChangedListener,那么在Stroy的镜像方法中注销它是有意义的。但是在现代Android推荐的实践中,大多数类似的东西都会在ViewModel中。这就是我说覆盖onDestroy并不常见的部分原因。我不确定当一个活动被破坏时,你在想什么样的事情可能需要做。例如,在我公司的应用程序中,我们有PlayGameActivity,在其中我们开始玩游戏。我们超越了OnDestroy方法,所以我们可以调用client.refresh来刷新我们的平衡,当我们完成游戏并返回到另一个活动时。所以这不是监听器注销的情况,但我们仍然需要OnDestroy来完成。我也想问你。如果我们有fragment,我们真的可以在这种情况下使用onDetach吗?它是否保证被调用?所以当我的应用程序在后台并且Android操作系统关闭它时,OnDestroy就不会被调用了?现在我完全明白你想说什么了,这就清楚了。好的,谢谢你的解释,你帮我理解了这件事!