Android中的Activity onDestroy()方法并不总是被调用,而且如果被调用,只有部分代码会执行。

40

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");
}

1
你尝试过将这段代码放在onStop而不是onDestroy吗? onStop会在onDestroy之前被调用。此外,onDestroy不应运行可能需要很长时间的代码。 - Hugo Hideki Yamashita
请查看官方文档中的Activity生命周期,链接为:http://developer.android.com/training/basics/activity-lifecycle/index.html - Pavlos
@Pavlos,从官方文档中可以看到:注意:不要指望这种方法被调用来保存数据!因此我认为onDestroy()并不是每次都会被调用。 - ksu
这就是每个人在这里所说的! - Pavlos
1
super.onDestroy() 移动到方法的最后一行。 - Pierre
显示剩余3条评论
3个回答

28

然而,为什么当调用onDestroy时,只有前几行被执行。 - ksu
2
我只能猜测第一个LogCat之后的代码行可能会抛出异常,但我不知道日志的其余部分是什么样子。 - Chris
onStop() 不保证被调用,参考链接:http://developer.android.com/reference/android/app/Activity.html#onStop%28%29 - ban-geoengineering
@ban-geoengineering 对于实际目的(绝大多数情况下),假设onStop()将按预期调用是安全的,对吗? - Kartik Chugh
@Kartik Chugh,你能否发布更多关于这个活动生命周期图的信息 - https://developer.android.com/images/activity_lifecycle.png - 显示应用程序进程可以在 onPause() 之后直接被杀死,即在没有调用 onStop()(或因此也没有调用 onDestroy())的情况下。 - ban-geoengineering
1
@Ksu editor.commit() 是一个阻塞调用,它访问存储。因此,在 onDestroy 的一半,系统可能会停止等待并杀死您的应用程序。我猜 stopRouteTracking() 是缺失的调用? - JM Lord

17
在安卓开发者文档这里,你可以看到 -
对于那些被标记为可被杀死的方法,在该方法返回后,承载活动的进程可能会被系统在未执行其代码的情况下随时终止。由于这个原因,你应该使用 onPause() 方法将任何持久性数据(如用户编辑)写入存储。
并且 onStop() 和 onDestroy() 都被标记为可被杀死。
这可能是仅部分在 onDestroy() 中编写的代码被调用的原因,因为进程可以在执行 onStop() 后随时被销毁。

3

@Chris的回答是正确的,但你遇到的问题只有部分代码被调用可能是因为在调用你的代码之前先调用了super.onDestroy()。应该在最后调用super.onDestroy(),因为这样你的代码会在销毁之前被调用。


我在想这是否可能是问题所在。但是这是否足以解释为什么只有在 super.onDestroy() 后面的一行代码被执行? - ban-geoengineering
当然可以。你可以考虑在回答中更新OP的代码片段以帮助说明问题。 - ban-geoengineering
1
大多数情况下也不会被调用,我尝试在代码末尾调用它,但没有任何新的变化。 - Fahad Alkamli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接