为什么Java Android中的super.onDestroy()会在析构函数中排在顶部?

60

super.onDestroy();在析构函数中为什么要放在最上面?例如:

protected void onDestroy() {        
    super.onDestroy();
    releaseMediaPlayer();
}

而不是:

protected void onDestroy() {        
    releaseMediaPlayer();
    super.onDestroy();
}

是否像C++、Objective-C、Pascal等语言中那样?

4个回答

71

这实际上取决于你在 onDestroy 中想要做什么。以下是super.onDestroy的执行顺序:

  • 关闭活动正在管理的任何对话框。
  • 关闭活动正在管理的任何游标。
  • 关闭任何打开的搜索对话框。

如果你在 onDestroy 中放置的逻辑与 Android 执行的这三件事有关,则可能需要考虑顺序。否则,在大多数情况下,它并不重要。


1
你在哪里找到这些信息的?我对服务等方面很感兴趣。 - Jon Willis
2
Android是开源的...只需查看源代码 :P - Cristian

13
报告工作状态培训中的ThreadSample.zip文件中,在onDestroy()方法中有一条注释。
public void onDestroy() {
    ...
    // Must always call the super method at the end.
    super.onDestroy();
}

也许在使用广播接收器时,super必须放在最后。


6
没问题。如果你想做什么事情,肯定不想在一个半毁(清理过的)物体上完成它是有道理的。 - vbence

11

由于我们是从基础的Android类进行扩展,因此在创建过程中让父类先创建和初始化自己,然后在关闭/停止组件时先让子类取消初始化并释放资源,这是一个好的方法。这是建议遵循的方法,但完全取决于用例和场景。

public void onCreate(Bundle bundle){
   super.onCreate(bundle);
   //perform child class initializations.
}

public void onDestroy(){
   //perform uninitialization and free resource
    super.onDestroy();
}

5
什么是你的问题?你可以两种方式完成它,这取决于你是否想在调用自己的onDestroy()之前调用超类的onDestroy()。通常我认为在Android中这并不重要。
另外,onDestroy()不是一个析构函数。它实际上并不销毁对象。它只是根据特定状态调用的方法。因此,在超类的onDestroy()运行并返回后,你的实例仍然活着且非常健康*。
*很可能,Android随时可以杀死该Activity,但你可以假设它仍然存在。

4
比如在C++中,你可以在清理完私有对象之后销毁父类。如果你先销毁父类,我认为这不是一个好的做法,我甚至认为应用程序将崩溃,因为实例会被销毁! - Vassilis
正如他所说,这并不是一个析构函数,只是让组件清理任何它想要的状态。在onDestroy()调用之后,对象仍然存在。通常顺序无关紧要,也不会导致崩溃。 - hackbod

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