Android onDestroy() 方法未按预期工作

问题描述

我使用了 onDestroy() 方法,我的代码没有完成:

    @Override
    public void onDestroy() {
        super.onDestroy();
        for (int i = 0 ; i < 10; i++) {
            Toast.makeText(this,"Destroy " + i,Toast.LENGTH_SHORT).show();
        }
    }

for 循环在索引 2 处停止。为什么循环没有结束?

解决方法

首先 documentation 表示 onDestroy() 方法:

不应该被用来做那些在过程消失后仍然存在的事情。

和:

此方法通常用于释放与活动关联的线程等资源

同样在 docs on the Activity 的开头有一个注释,方法 onDestroy()onStop()killable

标记为可终止的方法,在该方法返回托管活动的进程后,系统可能随时终止其另一行代码,而无需执行其他代码。

并且建议使用 onPause() 方法而不是那些可杀死的方法。

因此,显然 onDestroy() 函数有一些 android 内部超时,如果它没有发生太长时间,它可能会控制它,如果它发生了,那么它可能会终止执行。这是我的猜测。

根据文档中的内容,我将避免使用此方法来执行您在此处执行的操作,而我将尝试使用 onPause() 方法。

如果代码旨在在应用程序完成时执行,则使用 isFinishing() 方法检查它。 docs 推荐这种方法:

检查此活动是否正在完成,因为您对其调用了 finish() 或其他人要求它完成。这通常用于 onPause() 来确定活动是简单地暂停还是完全结束。

,

@sweak 的回答几乎解释了为什么你不应该这样做。但如果你热衷于这样做。你可以像下面那样完成 for 循环并给出所有 10 个 toast 的输出。

@Override
    public void onDestroy() {
        for (int i = 0 ; i < 10; i++) {
            Toast.makeText(this,"Destroy " + i,Toast.LENGTH_SHORT).show();
        }
        super.onDestroy();
    }