2012-10-12 7 views
6

Soll ich Befehle vor oder nach super.onDestroy() beim Überschreiben einer Ondestroy-Aktivität platzieren?Android Anfänger: onDestroy

protected void onDestroy() { 

    //option 1: callback before or ... 

    super.onDestroy(); 

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

(Jetzt fürchte ich: Wenn super.onDestroy zu schnell ist, wird es nie 2. in Option ankommen)

+0

Ich sehe nicht, was Sie daran hindern könnte zu erreichen 2 – njzk2

+0

Diese Frage ist eine dup von http://stackoverflow.com/q/18821481/53974, und das hat tatsächlich eine gut recherchierte Antwort. http://StackOverflow.com/A/18874519/53974 – Blaisorblade

Antwort

3

Dies geschieht beim Aufruf von 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(); 
     } 
    } 
} 

Im Wesentlichen bedeutet dies, dass es nicht, wenn Sie es vor oder nach Ihrem Code aufrufen egal.

+0

bedeutet es auch, dass ich nicht "entlassen"() für die onDestroy der Aktivität aufrufen muss? Ich denke, ich erinnere mich daran, dass es Protokolle gab, die sie leckten, nein? In welchen Fällen treten die Lecks auf? –

+1

Dismiss ist nur für Dialoge und unabhängig von dieser Frage, da ein Dialog einen anderen Lebenszyklus hat als eine Aktivität. Wenn Sie Probleme mit dem Dialog haben, sollten Sie eine neue Frage starten, damit Ihre Probleme besser gelöst werden können. –

+0

, aber es hängt damit zusammen, da es fragt, wo man Befehle einfügt, und Sie haben seinen Code angezeigt. Der Code scheint Dialoge Mechanismus zu haben –

7

Alles, was die Aktivität Ressourcen zur Verwendung in Zusammenhang stehen könnte vor dem Aufruf von super.onDestroy() sein sollte . Der nachfolgende Code wird erreicht, kann jedoch Probleme verursachen, wenn diese Ressourcen benötigt werden.

+0

Warum empfiehlt das Android-Entwicklerhandbuch das nicht überall :-(Ich suchte die Dokumentation für Stunden ... – ledy

0

Kommt drauf an. Wenn Sie möchten, dass Ihre Aktionen nach der super Funktion angewendet werden, sollten Sie Ihre Funktion nach dem Super platzieren. Ich denke, Sie müssen zuerst die Verwendung von super verstehen. Nehmen wir zum Beispiel einen Blick auf this question

3

Platz Ihren Code nach dem super.onDestroy(); zB:

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

    // Put code here. 

} 

Ihr Code wird die Ausführung beenden, wenn die Methode überschrieben.

+1

Ich werde testActivity.Instance.InfoThatIAmComingBackToTheMainActivityNow aufrufen() – ledy

0

Es wird in Option 2 ankommen. OnDestroy() zerstört das Objekt nicht wirklich. Ihre Instanz ist noch am Leben, nachdem onDestroy() der Superklasse ausgeführt wurde und zurückkehrt.

Edit: das ist, was onDestroy tut, um:

  • alle Dialoge Entlassen die Aktivität wurde die Verwaltung.
  • Schließen Sie alle Cursor, die von der Aktivität verwaltet wurden. Schließen
  • jeden offenen Suchdialogs
+0

dh wenn das Gerät schnell genug war, könnte eine Referenz oder ein Cursor schon verschwinden, bevor es mit der Option 2 ankommt? – ledy

1

super.onDestroy Aufruf wird Aufruf Thread oder so etwas wie diese nicht unterbrechen. Ihr Code wird ausgeführt, egal wo Sie ihn platzieren, vor oder nach super.onDestroy.

super.onDestroy werden nur freie Ressourcen, die für diese Aktivität durch Rahmen verwiesen werden könnten (wie zB Systemdialoge und verwaltet Cursor)

Ich schlage vor, Sie auf diesen Link, um weitere Informationen zu überprüfen

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

Verwandte Themen