Ich entwickle Android-Anwendungen für eine Weile und verfolge viele Beiträge über den Aktivitätslebenszyklus und den Lebenszyklus der Anwendung.
Ich weiß, dass Activity.finish()
Methodenaufrufe irgendwo im Weg Activity.onDestroy()
sind und auch die Aktivität vom Stapel entfernen, und ich denke, dass dies irgendwie auf das Betriebssystem und den Garbage Collector hinweist, dass er "seinen Trick machen" und den Speicher freigeben kann, wenn es eine gute Zeit ist so....
Ich bin zu diesem Beitrag gekommen - Wird das Beenden einer Bewerbung verpönt? und lesen Sie Mark Murphys Antwort.
Es hat mich ein bisschen verwirrt darüber, was genau die finish()
Methode tatsächlich tut.
Gibt es eine Chance, dass ich anrufe finish()
und onDestroy()
nicht angerufen werde?
Antworten:
Beim Aufrufen
finish()
einer Aktivität wird die MethodeonDestroy()
ausgeführt. Diese Methode kann Dinge tun wie:Ebenfalls,
onDestroy()
ist kein Destruktor. Es zerstört das Objekt nicht wirklich. Es ist nur eine Methode, die basierend auf einem bestimmten Zustand aufgerufen wird. Ihre Instanz ist also noch am Leben und sehr gut *, nachdem die Oberklasse ausgeführtonDestroy()
und zurückgegeben wurde. Android behält die Prozesse bei, falls der Benutzer die App neu starten möchte. Dies beschleunigt die Startphase. Der Prozess wird nichts tun und wenn Speicher zurückgefordert werden muss, wird der Prozess abgebrochenquelle
Meine 2 Cent auf @K_Anas antworten. Ich habe einen einfachen Test mit der Methode finish () durchgeführt. Auflistung wichtiger Rückrufmethoden im Aktivitätslebenszyklus
Was ich damit sagen will ist, dass Gegenstücke der Methoden zusammen mit allen dazwischen liegenden Methoden aufgerufen werden, wenn finish () ausgeführt wird.
z.B:
quelle
Beachten Sie auch, dass Sie, wenn Sie nach einer Absicht finish () aufrufen, nicht mit der Schaltfläche "Zurück" zur vorherigen Aktivität zurückkehren können
quelle
onDestroy()
ist für die endgültige Bereinigung gedacht - um Ressourcen freizugeben, die Sie selbst nutzen können, um offene Verbindungen, Leser, Autoren usw. zu schließen. Wenn Sie es nicht überschreiben, tut das System, was es muss.Auf der anderen Seite wird
finish()
das System nur darüber informiert, dass der Programmierer möchte, dass der StromActivity
beendet wird. Und daher ruft es aufonDestroy()
danach auf.Etwas zu beachten:
Es ist nicht erforderlich, dass nur ein Anruf einen Anruf
finish()
auslöstonDestroy()
. Nein. Wie wir wissen, kann das Android-System Aktivitäten beenden, wenn es den Eindruck hat, dass der Strom RessourcenActivity
benötigt, die freigegeben werden müssen.quelle
finish()
weist das System an, das zu beendenActivity
. Der "x" -Teil in Ihrer do-Anweisung lautet "das beenden (zerstören)Activity
". Der zweite Teil ist falsch. Eigentlich habe ich dort ein Wort verpasst. Ich habe die Antwort bearbeitet.onDestroy()
wird nicht nur ausgelöst durchfinish()
, das System kann es auch selbst aufrufen.Die Methode Finish () zerstört die aktuelle Aktivität. Sie können diese Methode in Fällen verwenden, in denen diese Aktivität nicht immer wieder geladen werden soll, wenn der Benutzer die Zurück-Taste drückt. Grundsätzlich wird die Aktivität aus dem aktuellen Stapel gelöscht.
quelle
Zusätzlich zu der obigen Antwort von @rommex habe ich auch festgestellt, dass
finish()
die Zerstörung der Aktivität in die Warteschlange gestellt wird und dass dies von der Priorität der Aktivität abhängt.Wenn ich rufe
finish()
nachonPause()
, sehe ichonStop()
, undonDestroy()
sofort aufgerufen.Wenn ich rufe
finish()
nachonStop()
, sehe ich nicht ,onDestroy()
erst 5 Minuten später.Nach meiner Beobachtung sieht es so aus, als ob das Ziel in der Warteschlange steht und als ich mir das anschaute, auf das
adb shell dumpsys activity activities
es eingestellt warfinishing=true
, aber da es nicht mehr im Vordergrund steht, wurde es nicht für die Zerstörung priorisiert.Zusammenfassend lässt
onDestroy()
sich sagen, dass ein Anruf niemals garantiert wird, aber selbst wenn er aufgerufen wird, kann er sich verzögern.quelle
Verschiedene Antworten und Notizen behaupten, dass finish () onPause () und onStop () überspringen und onDestroy () direkt ausführen kann. Um fair zu sein, wird in der Android-Dokumentation dazu ( http://developer.android.com/reference/android/app/Activity.html ) darauf hingewiesen, dass die Aktivität beendet oder vom System zerstört wird. Dies ist ziemlich zweideutig, könnte aber darauf hindeuten finish () kann zu onDestroy () springen.
Das JavaDoc on finish () ist ähnlich enttäuschend ( http://developer.android.com/reference/android/app/Activity.html#finish () ) und merkt nicht an, welche Methoden als Reaktion auf das Finish aufgerufen werden ().
Also habe ich diese Mini-App geschrieben, die jeden Status bei der Eingabe protokolliert. Es enthält eine Schaltfläche, die finish () aufruft, sodass Sie die Protokolle sehen können, welche Methoden ausgelöst werden. Dieses Experiment würde darauf hinweisen , dass finish () tatsächlich auch onPause () und onStop () aufruft. Hier ist die Ausgabe, die ich bekomme:
quelle
@ user3282164 Entsprechend dem Aktivitätslebenszyklus sollte er beim Aufruf
onPause()
->onStop()
-> durchlaufen .onDestroy()
finish()
Das Diagramm zeigt keinen geraden Pfad von [Aktivität ausgeführt] zu [
onDestroy()
], der vom System verursacht wird.onStop () doc sagt: " Beachten Sie, dass diese Methode in Situationen mit wenig Arbeitsspeicher, in denen das System nicht über genügend Arbeitsspeicher verfügt, um den Prozess Ihrer Aktivität nach dem Aufruf der Methode onPause () am Laufen zu halten , möglicherweise nie aufgerufen wird. "
quelle
Meine Studie zeigt, dass die
finish()
Methode tatsächlich einige Zerstörungsoperationen in die Warteschlange stellt, die Aktivität jedoch nicht sofort zerstört wird. Die Zerstörung ist jedoch geplant.Zum Beispiel, wenn Sie Platz
finish()
inonActivityResult()
Rückruf, währendonResume()
noch laufen müssen dann erstonResume()
wird ausgeführt, und danach nur werdenonStop()
undonDestroy()
aufgerufen werden .HINWEIS:
onDestroy()
darf überhaupt nicht aufgerufen werden, wie in der Dokumentation angegeben .quelle
Wenn Sie finish in onCreate () aufrufen, wird onDestroy () nicht direkt aufgerufen, wie @prakash sagte. Der
finish()
Vorgang beginnt erst, wenn Sie die Kontrolle an Android zurückgeben.Aufruf von finish () in onCreate () : onCreate () -> onStart () -> onResume () . Wenn der Benutzer beendet wird, ruft die App -> onPause () -> onStop () -> onDestroy () auf.
Aufruf von finish () in onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()
Aufruf von finish () in onResume () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()
Weitere Referenzüberprüfungen finden Sie in dieser Datei, die nach Abschluss und nach Abschluss () fortlaufend erstellt wird.
quelle
Es scheint, dass die einzig richtige Antwort hier bisher von romnex gegeben wurde: "onDestroy () darf überhaupt nicht aufgerufen werden". Obwohl es in der Praxis in fast allen Fällen keine Garantie gibt: Die Dokumentation zu finish () verspricht nur, dass das Ergebnis der Aktivität an den Aufrufer zurückgesendet wird, nicht mehr. Darüber hinaus wird in der Lebenszyklusdokumentation klargestellt, dass die Aktivität vom Betriebssystem beendet werden kann, sobald onStop () beendet ist (oder sogar früher auf älteren Geräten). Dies ist zwar unwahrscheinlich und daher in einem einfachen Test selten zu beobachten, kann jedoch bedeuten, dass die Aktivität ausgeführt wird kann getötet werden, während oder sogar bevor onDestroy () ausgeführt wird.
Wenn Sie also sicherstellen möchten, dass beim Aufrufen von finish () einige Arbeiten ausgeführt werden, können Sie diese nicht in onDestroy () einfügen, sondern müssen sie an derselben Stelle ausführen, an der Sie finish () aufrufen, bevor Sie sie tatsächlich aufrufen.
quelle
finish () sendet einfach zurück zur vorherigen Aktivität in Android, oder Sie können sagen, dass es in der Anwendung einen Schritt zurück geht
quelle