【发布时间】:2012-12-18 06:08:16
【问题描述】:
如果Java提供Garbage Collection,那么Activity Lifecycle中的onDestroy()需要什么?
【问题讨论】:
-
检查一下:[onDestroy() 究竟是做什么破坏的?][1] [1]:stackoverflow.com/a/4981927/556975 希望对您有所帮助。谢谢。
如果Java提供Garbage Collection,那么Activity Lifecycle中的onDestroy()需要什么?
【问题讨论】:
onDestroy:在销毁活动之前收到的最后一个调用。这可能是因为 Activity 正在完成(有人在其上调用了 finish()),或者因为系统正在临时销毁该 Activity 实例以节省空间。
这是一个例子......
public void onDestroy() {
super.onDestroy();
}
【讨论】:
操作系统决定事情何时“消失”。 onDestroy 是为了让您的应用程序有最后的机会在 Activity 被销毁之前进行清理,但这并不意味着该 Activity 实际上会被 GCed。这是一个很好的article,我建议人们阅读与创建退出按钮相关的内容。虽然这与您所问的不完全一样,但这些概念将帮助您了解正在发生的事情。
【讨论】:
onDestroy() 是您的活动关闭时由框架调用的方法。调用它是为了允许您的活动执行它可能希望执行的任何关闭操作。该方法实际上与垃圾收集没有任何关系(尽管您的关闭操作(如果有的话)可能涉及释放可以被 gc'ed 的其他资源)。特别是,它与 C++ 析构函数无关(尽管它的名字)。
如果您没有要执行的关闭操作,则无需覆盖它。基类基本上什么都不做。
【讨论】:
您可以使用 onDestroy() 来完成程序。我在下面的代码中使用它来告诉服务器客户端正在关闭其与服务器的套接字,以便我可以通知服务器端的用户客户端已断开连接。
客户:
...
protected void onDestroy(){
super.onDestroy();
if(connected) {
clientMessage.println("exit");
clientMessage.close();
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
finish();
}
...
服务器:
...
while (connected) {
input = clientMessage.readLine();
if ("exit".equals(input)){
break;
}
...
}
...
【讨论】:
在 Android Activity 生命周期的 onDestroy 文档中:
onDestroy()在活动被销毁之前被调用。系统 调用此回调是因为:
- 活动正在完成(由于用户完全关闭活动或由于在活动上调用了
finish()),或者- 由于配置更改(例如设备旋转或多窗口模式),系统正在暂时销毁活动
Activity#onDestroy() API docs 也回答得很好:
此方法通常用于释放资源,例如与活动关联的线程,以便被销毁的活动不会在其应用程序的其余部分仍在运行时留下这些东西。 source
正如文档中的引述所说,它用于防止被破坏的活动留下一些东西(例如,通过引用、线程导致的内存泄漏),但只有在应用程序的其余部分仍在运行时。如果应用程序进程结束,您是否忘记清理线程或其他资源也没关系,因为操作系统会为您完成。你不需要覆盖onDestroy。
没有必要做 sam786 is doing 的事情(重写并调用 super 方法),因为那是绝对没用的。所有其他答案似乎都遵循“清理”的路线,但没有解释什么样的清理或何时清理。你不应该在onDestroy() 中保存任何数据,因为你不能保证它会被调用,所以有时你会丢失数据。例如,当您按下主页按钮时,它不会被调用(您希望保存数据的情况)。
【讨论】:
onDestroy 可以让您的应用在 Activity 被销毁之前有最后一次清理工作的机会
【讨论】:
它使您的程序有机会执行诸如清理资源(例如线程)之类的事情,这样它们就不会污染相关的应用程序。如果您对它没有任何用处,请不要覆盖它。
【讨论】:
onDestroy 可能会在活动被销毁时被调用,但你不能指望它。在某些情况下,系统会简单地终止 Activity 的托管进程而不在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。
见:http://developer.android.com/reference/android/app/Activity.html#onDestroy()
【讨论】: