【问题标题】:Android Activity onDestroy() is not always called and if called only part of the code is executedAndroid Activity onDestroy() 并不总是被调用,如果被调用,只会执行部分代码
【发布时间】:2013-08-21 15:34:23
【问题描述】:

onDestroy() 并不总是被调用。如果调用,则只执行部分代码。在LogCat 中,大多数时候我只看到消息“gps state on destroy called first”。这是为什么呢?

protected void onDestroy() {
    super.onDestroy();
    Log.d("on destroy called", "gps state on destroy called first");

    editor.putBoolean("gpsOn", false);
    Log.d("on destroy called", "gps state on destroy called second");
    editor.commit();

    Log.d("on destroy called", "gps state on destroy called third");
    stopRouteTracking();
    Log.d("on destroy called", "gps state on destroy called  fourth");
}

【问题讨论】:

  • 您是否尝试过将此代码放在onStop 而不是onDestroy 上? onStoponDestroy 之前被调用。而且,onDestroy 不应该运行可能需要很长时间的代码。
  • developer.android.com/training/basics/activity-lifecycle/…查看官方文档中的Activity生命周期
  • @HugoHidekiYamashita,我还没有尝试将它放在 onStop 上。我会尝试并删除 stopRouteTracking() 以查看它是如何工作的。
  • @Pavlos,来自官方文档,有:注意:不要指望这个方法被称为保存数据的地方!所以我认为 onDestroy() 并不是每次都被调用。
  • 这里大家都这么说!

标签: android ondestroy


【解决方案1】:

看看这个:

Activity OnDestroy never called?

还有这个:

http://developer.android.com/reference/android/app/Activity.html#onDestroy%28%29

基本上,永远无法保证会调用onDestroy(),在某些情况下,您的应用程序等进程将被直接杀死,无论如何都会绕过方法调用。

【讨论】:

  • 但是,为什么在调用 onDestroy 时,只执行了前几行。
  • 我只能推测第一个 LogCat 之外的行可能会抛出异常,但我不知道日志的其余部分是什么样的。
  • onStop() 也不能保证被调用:developer.android.com/reference/android/app/…
  • @ban-geoengineering 但是,出于实际目的(绝大多数情况下),可以安全地假设 onStop() 将按预期调用,对吗?
  • @Ksu editor.commit() 是访问存储的阻塞调用。因此,系统在 onDestroy 中途停止等待并终止您的应用程序可能足够长。我想stopRouteTracking() 是失踪的电话?
【解决方案2】:

在android开发者文档here中,你可以看到——

对于那些被标记为可杀死的方法,在该方法之后 返回承载活动的进程可能被系统杀死 在任何时候没有另一行代码被执行。因为 其中,您应该使用 onPause() 方法来编写任何持久的 数据(如用户编辑)存储。

并且 onStop() 和 onDestroy() 都被标记为可杀死。

这可能是只调用了 onDestroy() 中编写的部分代码的原因,因为进程在执行 onStop() 后随时可能被销毁。

【讨论】:

    【解决方案3】:

    @Chris 的回答是正确的,但是在调用您的代码之前调用super.onDestroy() 可能会导致您的代码被调用的问题。 super.onDestroy() 应该在最后被调用,因为这样你的代码会在它被销毁之前被调用。

    【讨论】:

    • 我想知道这是否也是问题所在。但它是否充分解释了为什么在super.onDestroy() 之后只执行了一行代码?
    • 是的,当然。为了帮助说明,可能值得用您对 OP 代码 sn-p 的修订来更新您的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 2015-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多