如果Java提供Garbage Collection,那么Activity Lifecycle中的onDestroy()需要什么?
8 回答
onDestroy: The final call you receive before your activity is destroyed. This can happen either because the activity is finishing (someone called finish() on it), or because the system is temporarily destroying this instance of the activity to save space.
Here is an example......
public void onDestroy() {
super.onDestroy();
}
操作系统决定事情何时“消失”。onDestroy 是为了让您的应用程序有最后的机会在 Activity 被销毁之前进行清理,但这并不意味着该 Activity 实际上会被 GCed。这是一篇与创建退出按钮相关的好文章,我建议人们阅读。虽然这并不完全是您所问的,但这些概念将帮助您了解正在发生的事情。
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 Lifecycle 的onDestroy
文档中:
onDestroy()
在活动被销毁之前被调用。系统调用此回调是因为:
- 活动正在完成(由于用户完全关闭活动或由于在活动上
finish()
被调用),或者- 由于配置更改(例如设备轮换或多窗口模式),系统正在临时销毁活动
Activity#onDestroy()
API 文档也很好地回答了这个问题:
此方法通常用于释放资源,如与活动相关联的线程,以便在其应用程序的其余部分仍在运行时,被破坏的活动不会留下这些东西。资源
正如文档中的引述所说,它用于防止被破坏的活动留下一些东西(例如,通过引用,线程泄漏内存),但只有当应用程序的其余部分仍然运行时。如果应用程序进程结束,您是否忘记清理线程或其他资源也没关系,因为操作系统会为您完成。您不需要覆盖onDestroy
.
没有必要做sam786正在做的事情(覆盖并调用 super 方法),因为那绝对没用。所有其他答案似乎都遵循“清理”的路线,但没有解释什么样的清理或何时清理。你不应该在 中保存任何数据onDestroy()
,因为你不能保证它会被调用,所以有时你会丢失数据。例如,当您按下主页按钮时,它不会被调用(您希望保存数据的情况)。
onDestroy 可以让您的应用程序有最后的机会在 Activity 被销毁之前进行清理
Android中的文章退出按钮
它让你的程序有机会做一些事情,比如清理资源(比如线程),这样它们就不会污染相关的应用程序。如果您对它没有任何用处,请不要覆盖它。
onDestroy 可能会在活动被销毁时被调用,但你不能指望它。在某些情况下,系统会简单地终止 Activity 的宿主进程,而不会在其中调用此方法(或任何其他方法),因此不应使用它来执行打算在进程消失后保留的事情。
请参阅:http: //developer.android.com/reference/android/app/Activity.html#onDestroy()