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

Sta*_*tan 13 android activity-lifecycle ondestroy android-asynctask android-activity

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

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

的onDestroy():

  1. 在活动被销毁并且必须释放资源时调用.
  2. 当活动被匆忙销毁时(系统资源不足等),不会调用它.

第一个案例很清楚:我在onDestroy上做了所有的清理,没有出现任何问题.第二种情况虽然有点问题.当Activity被销毁并且onStroy被跳过时(所以我不取消我的任务),是否可能发生任务继续执行,然后完成并尝试更新死活动,以便应用程序崩溃?


我们来到真正的问题:

  1. 当一个Activity被杀死并且跳过onDestroy时,附加到该Activity的所有东西都会被自动销毁吗?(仅在一切都将被彻底清除的情况下才会跳过onDestroy 吗?任务,注册接收器等)
  2. 如果跳过onDestroy这是否意味着整个应用程序被杀死?

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

  • 可以在销毁Activity时跳过onStop(),就像onDestroy一样
  • onPause被调用得太早且太频繁,所以它不适合用例.例子:

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

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

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

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

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

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

Vip*_*ahu 0

就我用安卓而言,

1当您的应用程序崩溃时,与其相关的所有资源都会被破坏。

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

3当应用程序在后台运行时,Android 由于内存不足而杀死它

除了这些之外,还调用其他回调方法,即

1 当另一个活动出现在前面,或者您的设备锁定..等

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