onDestroy方法不总是被调用吗?

9
我已经在我的活动的onDestroy中放置了一些缓存清理代码,但大多数情况下,除非我通过finish()明确地结束活动,否则该代码不会被执行。
编辑:刚刚读到onDestroy仅在使用finish()或系统资源不足时才被调用。那么我应该把我的缓存清理代码放在哪里呢?如果我把它放在onPause()中并且用户返回到应用程序,则缓存将被清除。实际上,我正在缓存中存储重要的临时文件,这些文件不应该在onPause中删除。
3个回答

16

来自Android开发者文档:

protected void onDestroy ()

API Level 1中添加执行活动销毁前的任何最终清理。这可能是因为活动正在完成(有人对它调用了finish()),或者因为系统暂时销毁该活动实例以节省空间。您可以使用isFinishing()方法区分这两种情况。

注意:不要依赖于此方法作为保存数据的位置!例如,如果活动正在编辑内容提供程序中的数据,则应在onPause()或onSaveInstanceState(Bundle)中提交这些编辑,而不是在此处提交。通常会实现此方法以释放与活动相关的资源(例如线程),以便销毁的活动不会在其应用程序的其余部分仍在运行时留下这些东西。存在系统仅仅杀死活动的托管进程而不在其中调用此方法(或其他任何方法)的情况,因此不应将其用于希望在进程消失后继续存在的事情。

您可以将代码移动到onPause()onStop()


我将调整大小后的图像存储在缓存中。如果我在 onStop() / onPause() 中清除缓存,当应用程序恢复时,我的调整大小后的图像将丢失。我应该再次调整它们的大小吗?这会消耗相当多的资源。 - yeahman
非常简单,只需在 onStop() 中保存您的图像,然后在 onStart() 中加载它们。 - meda
我正在将调整大小后的图像存储在临时缓存文件夹中……用户可以单击按钮保存图像或使用返回按钮离开应用程序……问题是,我希望仅在用户离开我的应用程序时清除/擦除调整大小后的图像。 - yeahman
3
你的意思是我需要在onPause中删除所有调整大小后的图片,并在onResume中重新创建它们吗?如果有500张图片,每次调整大小都需要一些时间,这不太用户友好。 - yeahman
@yeahman,我的帖子是为了回答你关于onDestroy()没有被调用的问题,也许你应该在帖子中添加更多代码或者提出一个新的问题。没有代码很难猜测你的应用程序,我不想给你错误的建议,你知道我的意思。 - meda
显示剩余4条评论

3

尝试使用onstop

像这样

@Override
    protected void onStop() {
        super.onStop();
       //write your code here
    }

但问题是为什么onDestroy不总是被调用? - Jorgesys

1

ondestroy通常在系统完全从内存中移除活动时调用,或者当用户杀死活动时调用,您希望在onpause中保存数据,因为它将始终在销毁之前被调用。


1
在强制关闭的情况下,onDestroy()方法不会被调用。 - Simon
通常在最近使用的应用程序中通过滑动删除应用程序时,也不会调用此功能。至少大多数情况下是如此,有时候它会触发。我真的很好奇这个回调函数到底应该放什么。 - Zackline
你说得对,非常奇怪。“这里可能有任何清理资源的入口点,在一个活动被杀死之前 - 也许”。 - nmw01223

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