onDestroy() 方法到底销毁了什么?

29

我一直被这个“特性”困扰着:当我使用返回按钮离开我的应用时,我可以看到onDestroy()方法被调用,但下一次运行我的应用程序时,Activity类的所有静态成员仍然保留它们的值。请参见下面的代码:

public class HelloAndroid extends Activity {

private static int mValue;   // a static member here

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    TextView tv = new TextView(this);
    tv.setText((mValue != 0) ? 
        ("Left-over value = " + mValue) : "This is a new instance");
    setContentView(tv);
}

public void onDestroy() {
    super.onDestroy();
    mValue++;
}

}

以上代码显示了mValue中剩余的值,并且当会话结束时它会递增,这样我就知道onDestroy()函数被调用了。

我在这个论坛上找到了一个有用的答案,我明白在上面的代码中mValue是一个类成员而不是实例成员。但是在这种情况下,我的确只有一个单独的HelloAndroid活动,所以当它死亡时,一切都会被清除,下一次我回来时,一切都会重新开始吧?(或者,在onDestroy()之后,系统中是否还有一些神秘的东西仍然占据它,使它无法消失?)

(以上只是一个变量,如果它是一堆对象引用呢?每个部分是一个可以单独进行垃圾回收的内存。 GC是否有可能收集其中一些但不是全部?这真的让我很困扰。)

2个回答

35
操作系统决定何时"消失"。 onDestroy 用于让你的应用程序在活动被销毁之前有最后一个机会清理一些东西,但这并不意味着活动确实会被垃圾回收。这是一篇好文章,我建议人们阅读它以了解如何创建退出按钮。虽然它不完全是你要求的内容,但其中的概念将帮助你理解正在发生的事情。

谢谢,我想知道是谁决定了对这个答案进行负评。希望他们能留下评论。 - Andrew White

9

不仅仅有Activity,还有应用程序和在Dalvik VM中运行的进程。Android通常会在后台保持应用程序运行,直到需要回收其内存以供其他应用程序使用。只要进程在运行,您的静态成员变量就应该一直存在于内存中。如果尝试运行一些内存密集型应用程序或使用某些任务管理器强制关闭正在运行的应用程序,则可能会看到静态值重置。


我明白了,谢谢。那么,如果其中一个静态成员没有被清理,我可以假设其他所有静态成员也没有被清理吗? - wwyt
嗯,我想答案是肯定的。只要我手里拿着它们,垃圾回收就应该是全有或全无的事情。 - wwyt

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