Android 在onDestroy进行所有清理安全吗?

Android 在onDestroy进行所有清理安全吗?,android,android-asynctask,android-activity,activity-lifecycle,ondestroy,Android,Android Asynctask,Android Activity,Activity Lifecycle,Ondestroy,更具体地说:在onDestroy中取消任务是否安全?另外,使用onDestroy注销接收者和释放资源是否安全 我的目标是确保在销毁活动时取消/销毁我的任务,而不是在此之前 onDestroy(): 当活动被销毁并且必须删除资源时调用 释放 当活动被匆忙销毁时(当 系统资源不足等) 第一种情况很清楚:我在onDestroy中进行所有清洁,不会出现任何问题。不过,第二种情况有点问题。当活动被销毁且onDestroy被跳过(因此我不会取消我的任务)时,任务是否会继续执行,然后完成并尝试更新已死亡的活动

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

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

onDestroy():

  • 当活动被销毁并且必须删除资源时调用 释放
  • 当活动被匆忙销毁时(当 系统资源不足等)
  • 第一种情况很清楚:我在onDestroy中进行所有清洁,不会出现任何问题。不过,第二种情况有点问题。当活动被销毁且onDestroy被跳过(因此我不会取消我的任务)时,任务是否会继续执行,然后完成并尝试更新已死亡的活动,从而导致应用程序崩溃


    我们来到了真正的问题:

  • 当活动被终止且onDestroy被跳过时,与该活动相关的所有内容是否都会自动销毁?(只有在所有内容都将被彻底清除的情况下,onDestroy才会被跳过吗?任务、注册接收者等)
  • 如果跳过onDestroy,这是否意味着整个应用程序将被删除

  • 让我们关注onDestroy(),因为解决方案不在onPause()或onStop()中。论据:

    • 当活动被销毁时,可以跳过onStop(),就像onDestroy一样
    • onPause调用得太早且太频繁,因此不适合该用例。示例:
    屏幕锁定:当设备屏幕被锁定时,可以调用onPause。这种情况经常像屏幕保护程序一样发生,用户会立即解锁,因为他站在那里看屏幕。在这种情况下,取消任务和停止我的应用程序所做的一切只会降低用户体验。我不希望我的应用程序因为一个偶然的“屏幕保护程序”而窒息和行为不端

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

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

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

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


    另外,如果答案是在onDestroy中进行清理不安全,这意味着Android框架要求我们停止在onPause中所做的一切。然后我就看不出有任何理由使用onDestroy…

    就我使用android而言

    1当你的应用程序崩溃时,与之相关的所有资源都会被销毁

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

    3当后台运行的应用程序和Android由于内存不足而将其杀死时

    除此之外,其他回调方法称为

    1当另一个活动出现时,或您的设备锁定..等


    在所有情况下,根据您的要求,您可以在onDestroy中释放所有资源,取消线程和Asyntask,停止所有服务等。如果您希望在调用destroy时任务保持暂停和活动状态,则可以保存配置,并在再次调用onCreate时保留它,方法是检查是否为null。

    我想让你看看这个婴儿:

    基本上,它为您提供了系统认为有助于取消任务和清理内存的所有位置:

    请仔细查看以下两个案例:

    TRIM_MEMORY_UI_HIDDEN-该进程一直显示用户界面,现在不再显示

    TRIM_MEMORY_COMPLETE(修剪内存)-该过程接近后台LRU列表的末尾

    你问的大多数问题都是这样的

    使用相同的方法,您还可以捕获TRIM_MEMORY_RUNNING_CRITICAL,这将在系统没有内存的情况下向您发出警告,必须立即采取特殊措施


    在类似的情况下,这种方法让我的开发生活变得更好。

    如果您只需要进行一些清理,无论活动如何关闭,您都应该能够使用和的组合。无论发生什么情况,都应该调用其中一个。在您的活动中可能有一个
    布尔清理完成
    ,这将在两个清理中的一个完成时设置

    关于用户数据的保存,请查看:

    谷歌建议

    “就地编辑”用户模型

    即:用户创建新数据后立即保存,最迟在
    onPause()
    中保存。这并不意味着你需要