在onDestroy中进行所有清理是否安全?

时间:2013-01-29 12:29:54

标签: android android-asynctask android-activity activity-lifecycle ondestroy

更具体地说:在onDestroy中取消任务是否安全?另外,使用onDestroy来取消注册接收器和释放资源是否安全?

我的目标是确保在销毁活动时取消/销毁我的任务,但不是之前。

的onDestroy():

    当活动被破坏且资源必须被激活时,会调用
  1. 释放。
  2. 当活动被匆忙销毁时(当时),
  3. 不被调用 系统资源不足等。)
  4. 第一个案例很清楚:我在onDestroy上做了所有的清理工作,没有出现任何问题。第二种情况虽然有点问题。当Activity被销毁并且onDestroy被跳过时(所以我不取消我的任务),是否可能发生任务继续执行,然后完成并尝试更新死活动,以便应用程序崩溃?


    我们来到真正的问题:

    1. 当一个Activity被杀死并且onDestroy被跳过时,附加到该Activity的所有内容是否会被自动销毁?(是onDestroy跳过以防万一所有内容都将被完全删除?任务,注册接收器等)
    2. 如果跳过onDestroy,这是否意味着整个应用被杀?

    3. 让我们关注onDestroy(),因为解决方案不在onPause()或onStop()中。参数:

        可以在销毁活动时跳过
      • onStop(),就像onDestroy
      • 一样
      • onPause调用过早且过于频繁,因此不适合用例。示例:

      屏幕锁定:设备屏幕锁定时可以调用onPause 。这通常就像屏幕保护程序一样,用户立即解锁,因为他站在那里看着屏幕。取消任务并停止我的应用在这种情况下所做的一切只会降低用户体验。我不希望我的应用因为偶然的“屏幕保护程序”而窒息而行为不端。

      在一个示例应用程序中,我有两个活动屏幕。用户可以在它们之间快速切换。在这个应用程序中,用户倾向于经常快速地切换屏幕。

      导航:其中一个屏幕有一个地图,可从系统接收位置更新。它记录了位置(路径)变化的精确图形日志,因此需要不断运行,直到活动关闭。通常我会在onResume和onPause中注册和注销任何接收器。但是,这会使应用程序非常不可用,因为每次用户导航时地图上的更新都会停止。因此,我想取消注册onDestroy中的接收器。

      加载列表:第二个屏幕有一个列表,显示来自Web服务的数据。下载数据需要4秒钟。我使用AsyncTask,我知道我应该在必要时取消。它不应该在onPause中取消,因为它应该在用户在屏幕之间切换时继续加载。因此,我想在onDestroy中取消它。

      可以有更多的例子。其中一些可能并不完全适合每个人(您甚至可能建议使用服务而不是AsyncTask)。但这个想法很重要,所有人都有相同的想法:继续做一些特定于Activity的工作,而Activity则暂停,但是ENSURE要停止做当活动被销毁时。 (无论我使用的是AsyncTask还是Service,都无关紧要。在任何一种情况下,都应该在销毁Activity时停止工作。)

      P.S。如果答案是在onDestroy 中进行清理是不安全的,这意味着Android框架要求我们停止在onPause中执行的所有操作。然后我看不出使用onDestroy的任何理由......

3 个答案:

答案 0 :(得分:1)

我想推荐你这个孩子:http://developer.android.com/reference/android/content/ComponentCallbacks2.html#onTrimMemory(int)

基本上,它为您提供系统发现取消任务和清理内存有用的所有位置:

请仔细查看以下两种情况:

TRIM_MEMORY_UI_HIDDEN - 该进程一直显示用户界面,并且不再这样做。

TRIM_MEMORY_COMPLETE - 该过程接近后台LRU列表的末尾。

您提出的大部分内容都属于这种情况。

在同一方法中,您还可以捕获TRIM_MEMORY_RUNNING_CRITICAL,它会提醒您系统没有内存并且必须立即采取特殊操作。

这种方法在类似的情况下使我的发展生活更加美好。

答案 1 :(得分:1)

如果您只是需要进行一些清理,无论活动如何关闭,您都应该能够使用onSaveInstanceState()onDestroy()的组合。其中一个应该被称为无论如何。也许你的活动中有一个boolean cleanupDone,只要两个中的一个完成就会设置。

关于保存用户数据,请查看Saving Persistent State

谷歌建议

  

“就地编辑”用户模型

即:用户创建新数据后立即保存,最迟在onPause()。这并不意味着您需要在onResume()中重新创建数据,只是它应该已保存。

顺便说一下:onStop() can be skipped only on pre-Honeycomb devices,即as of June 2015,不到所有设备的6%。如果省略onSaveInstanceState()onDestroy(),则应调用onStop()

答案 2 :(得分:0)

据我去了android,

1 当您的应用崩溃时,与其相关的所有资源都会被销毁。

2 当设备更改配置时,会导致销毁并重新创建活动。

3 当在后台和Android中运行的应用由于在低内存上运行而导致其终止时

除了这些之外,其他回调方法被称为i /

1当另一个Activity进入前面,或者你的设备锁定..etc

在所有情况下,根据您的要求,您可以在onDestroy中释放所有资源并取消Thread和Asyntask并停止所有服务等。如果您希望任务保持暂停并且在销毁时保持活动,则可以保存配置

时,如果再次调用onCreate,则保留它