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是否有可能收集其中一些但不是全部或全部?这真的让我很烦恼。 )

4

2 回答 2

35

操作系统决定事情何时“消失”。这样onDestroy做是为了让您的应用程序有最后的机会在 Activity 被销毁之前进行清理,但这并不意味着该 Activity 实际上会被 GCed。这是一篇与创建退出按钮相关的好文章,我建议人们阅读。虽然这不完全是您所问的,但这些概念将帮助您了解正在发生的事情。

于 2011-02-13T01:50:39.013 回答
9

You don't just have the Activity though. You also have the application, and its process running in a Dalvik VM. Android will usually leave the application running in the background until it needs to reclaim the memory it is using for some other application. Your static member should remain in memory as long as the process is running. If you try running some memory-intensive application or forcefully closing the running application with some task manager, you may see the static value reset.

于 2011-02-13T01:52:30.137 回答