Android初学者:onDestroy

时间:2012-10-12 12:36:11

标签: android android-lifecycle destroy

在覆盖活动的ondestroy时,我应该在super.onDestroy()之前或之后放置命令吗?

protected void onDestroy() {

    //option 1: callback before or ...

    super.onDestroy();

    //option 2: callback after super.onDestroy();
}

(现在我担心:如果super.onDestroy太快,它将永远不会到达选项2。)

6 个答案:

答案 0 :(得分:7)

任何可能与使用活动资源有关的事情都应该在调用super.onDestroy()之前。它将达到之后的代码,但如果它需要这些资源可能会导致问题。

答案 1 :(得分:3)

将代码放在super.onDestroy();之后,例如:

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

    // Put code here.

}

覆盖方法时,您的代码将完成执行。

答案 2 :(得分:3)

当你调用super.onDestroy();

时会发生这种情况

Android Source

protected void onDestroy() {
    mCalled = true;

    // dismiss any dialogs we are managing.
    if (mManagedDialogs != null) {

        final int numDialogs = mManagedDialogs.size();
        for (int i = 0; i < numDialogs; i++) {
            final Dialog dialog = mManagedDialogs.valueAt(i);
            if (dialog.isShowing()) {
                dialog.dismiss();
            }
        }
    }

    // also dismiss search dialog if showing
    // TODO more generic than just this manager
    SearchManager searchManager = 
        (SearchManager) getSystemService(Context.SEARCH_SERVICE);
    searchManager.stopSearch();

    // close any cursors we are managing.
    int numCursors = mManagedCursors.size();
    for (int i = 0; i < numCursors; i++) {
        ManagedCursor c = mManagedCursors.get(i);
        if (c != null) {
            c.mCursor.close();
        }
    }
}

基本上这意味着如果你在代码之前或之后调用它并不重要。

答案 3 :(得分:1)

调用super.onDestroy不会中断调用线程或类似的东西。无论您将它放在何处,在super.onDestroy之前或之后,您的代码都将被执行。

super.onDestroy只会释放框架可能为此活动引用的资源(例如系统对话框和托管游标)

我建议您查看此链接以获取更多详细信息

http://developer.android.com/reference/android/app/Activity.html#onDestroy()

答案 4 :(得分:0)

这取决于。如果您希望在super函数之后应用您的操作,则应将您的函数放在super之后。我想你必须先了解super的用法。例如,请查看this question

答案 5 :(得分:0)

它将在选项2中到达.onDestroy()实际上不会销毁该对象。在超类的onDestroy()运行并返回后,你的实例仍然存活。

编辑:这是onDestroy按顺序执行的操作:

  • 关闭活动管理的所有对话框。
  • 关闭活动管理的所有游标。
  • 关闭所有打开的搜索对话框