【问题标题】:Why is onDestroy() called after onResume() when using back-button为什么在使用后退按钮时在 onResume() 之后调用 onDestroy()
【发布时间】:2013-05-25 11:08:21
【问题描述】:

当我启动我的 android-activity 时,首先调用 onCreate(),然后调用 onResume()

当我按下返回按钮返回主屏幕并再次点击应用程序图标时,首先调用onCreate(),然后调用onResume(),然后调用onDestroy()

那时我的应用程序仍然处于活动状态,但由于onDestroy() 将一些成员设置为空,因此执行某些操作会导致错误。

这是为什么呢?

更新:当我按下后等待 30 秒时,一切正常。除了将一些变量设置为 null 和 .interrupt()ing 后台线程之外,我在 onDestroy 中没有做任何繁重的工作。

【问题讨论】:

  • 当您按下返回按钮时,活动将从返回堆栈中弹出并销毁。所以在这种情况下会调用 onDestroy()。当您再次打开应用程序时,它应该是 onCreate() 和 onResume()。如果您想保存或提交某些内容到数据库,请在 onPasue() 中执行
  • 我不使用数据库。查看我发布的更新。

标签: android


【解决方案1】:

这是我自己想出来的。我对Activity 的理解是有缺陷的。当然,Android 会在 old Activity 实例上调用 onDestroy(),这可能发生在 new 实例构建后几秒钟。

【讨论】:

  • 当它确定关键点并保持已提供的最佳答案时,您可以接受自己的答案。
【解决方案2】:

onDestroy 会被调用,因为默认情况下,按下返回键会导致您的活动调用finish(),这会启动销毁调用 onDestroy() 的活动。

为了防止在活动被破坏的情况下执行某些操作,请执行以下操作:

if(!isFinishing()) {
   // do your action here
}

isFinishing是Activity的一个方法。

【讨论】:

  • 请参阅我在 Sagar Waghmare 的回答中发表的评论。
【解决方案3】:

您是否在 onDestroy() 中进行了一些繁重的操作。我认为你的活动视图被破坏了,但不是活动对象。甚至在之前的 Activity 对象被实际销毁之前,您就可以点击 App 图标。

【讨论】:

  • 我没有做任何繁重的事情,只是将一些变量设置为空。即使我在按下后等待,onDestroy 日志消息也不会输出。我注意到,当我按下返回后查看应用程序列表时,它仍然存在。
【解决方案4】:

我认为除了您所描述的内容之外还有其他内容。 Android 不仅可以防止 Activity 被破坏,还必须在主线程上发生一些事情。

这些症状听起来就像您有任何一种症状:

  • 执行较长的 HTTP 或数据库操作的服务。你确定没有 suxg 的东西吗?
  • 另一个线程(可能由 AsyncTask 管理?)调用同步方法

【讨论】:

  • 我也发生了同样的事情。如果我等待几秒钟,然后调用 onDestroy(),或者当我转到其他屏幕时它会立即被调用。我也很惊讶,这是第一次发生。我也没有做任何繁重的任务或任何 HTTP 调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多