Activity OnDestroy从未被调用?

38

我正在我的ListActivity中使用以下代码

// a separate class in project
public class MyActivity extends ListActivity {
    // some common functions here..
}

public class SelectLocation extends MyListActivity {

    public void onCreate(Bundle savedInstance) {
        // here.....
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        if (adap != null) adap = null;
        if (list != null) list = null;
        System.gc();
    }
}

有人能指导我为什么我的代码中 onDestroy 方法没有被调用吗?


7
if语句是多余的 - adap = list = null; - Mr_and_Mrs_D
3个回答

64

onDestroy()方法只有在系统资源(内存、CPU时间等)不足时,系统才会决定杀死你的活动/应用程序或者当某人在你的活动上调用finish()方法时才会被调用。

因此,为了测试您的代码,您可以创建一个测试按钮,该按钮将在您的活动上调用finish()方法。

adap不是关键资源的情况下,我认为您不需要在onDestroy()方法中调用所有这些内容。即使在那种情况下,安卓系统也有机制来正确处理它们的清除。

阅读更多 此处


4
onDestroy方法不仅在系统资源不足时被调用,当一个“Activity”无法访问时也会被调用。 - Buddy
2
每当设备旋转时,它也被称为其特性已更改(即方向),这可能会影响使用的资源,因此它会销毁并创建Activity。在onDestroy()之后,将调用onCreate()。 - dodgy_coder
1
那么如何知道用户何时关闭了应用程序? - Gerrard
6
为什么这个答案完全错误关于onDestroy何时被调用,但有60个赞和被认为是正确答案? - Trevor

31

无法保证您的 onDestroy 方法会被调用。

您在 onDestroy 方法中使用的代码根本不需要。如果 destroy 被调用,您的 activity 将从堆栈中删除,并且所有仅由该 activity 引用的资源也将随之自由进行垃圾回收。另外,System.gc() 被认为是不好的编程风格。在 Android 上,系统几乎总是知道何时进行垃圾回收。大多数情况下,当 activity 结束时,垃圾回收会自动触发。只需删除整个 onDestroy 方法即可。如果您的应用程序存在整体内存问题,则问题出在其他地方。


7
这里的图片有点滑稽,因为它似乎在暗示onDestroy方法总是会被调用。如果你仔细阅读文本,也可以发现其所说的: “一个Activity的整个生命周期发生在调用onCreate()和调用onDestroy()之间。” http://developer.android.com/guide/topics/fundamentals/activities.html#Lifecycle - Ted
1
在文档的开头和图片中,没有清楚地显示onDestroy可能不会被调用。只有在解释图像下面的表格中的可杀死部分时才提到。如果您只是快速浏览图片,可能会被误导。 - Janusz
实际上,您可以阅读相当多的文本,并清楚地了解到onDestroy总是被调用。看看“表1”:[onDestroy]在活动被销毁之前调用。这是活动将接收到的最后一个调用。 - Ted
1
如果您在表格的“isKillable after”部分之后不查看isKillable,则这是正确的。如果您认为这是文档文件中的错误,请在b.android.com下报告一个bug,大多数情况下,这样一个小的文档问题会在一天内得到分配并在下次更新文档时进行更正。 - Janusz
1
我看到 onDestroy 方法不能保证被调用。那么 onDestroy 方法中应该放什么代码呢? - Adam Johns
1
@AdamJohns “这个方法通常用于释放与某个活动相关的线程等资源。或者用于删除对该活动的引用,以防止内存泄漏。当应用程序被终止且 onDestory() 没有被调用时,你不需要担心因为它已经不存在了。” - Alexandre G

6
大多数手机在按下返回按钮时会调用onStop()和onDestroy()方法,但如果不是您的情况,可以创建一个按钮来调用finish()方法。

2
不,此功能通常在开发者选项中打开 - “不保留活动”复选框。 - Evgenii Vorobei

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