2013-08-07 12 views
15

Like:Ist es eine gute Idee, nach dem Start einer neuen Aktivität in Android finish() zu nennen?

startActivity(intent); 
finish(); 

Ohne finish() explicitly, onDestroy() Aufruf ist nicht für die frühere Tätigkeit genannt, und ich laufe aus dem Speicher (OutOfMemory Exception).

So ist es eine gute Idee, finish() explicitly to prevent OutOfMemory Exception?

+0

Was ist, wenn der Benutzer zur vorherigen Aktivität zurückkehren möchte, indem er auf die Schaltfläche Zurück klickt? – Raghunandan

+2

Nein. Ihr Problem ist woanders. – fdreger

+0

Verwenden Sie "Bitmap" (oder eine Sammlung von) überall? Wenn Sie das [mat Memory Analyzer Tool] (http://www.eclipse.org/mat/) noch nicht benutzt haben, ist jetzt eine gute Zeit. – haventchecked

Antwort

1

Dadurch ist zu nennen gut, wenn Sie keine Instanz dieser Activity benötigen. Also, wenn Sie auf die nächste Activity drücken, wissen Sie, dass Sie nicht zu diesem zurückkommen werden, aber was auch immer auf dem Stapel darunter ist, wo Activity war oder der Home-Bildschirm, wenn es nicht mehr gibt.

Allerdings bin ich mir nicht sicher, deshalb erhalten Sie eine OOM Ausnahme und Sie sollten wahrscheinlich herausfinden, woher das kommt. Wenn Sie Bitmap s verwenden, könnte dies die Ausnahme verursachen.

+0

Ja, ich benutze Bitmaps. Ohne explizite Aufruf von finish(), ruft GC nicht onDestroy() der Aktivität auf, und die geladenen Bitmap-Ressourcen der Activity belegen viel Arbeitsspeicher, weshalb ich outOfMemoryException beende. Wenn onDestroy() nicht von GC aufgerufen wird, bedeutet das ein Speicherleck? Wenn kein Verweis auf die Aktivität vorhanden ist, sollte GC nicht ondestroy() aufrufen, wenn mehr Speicher benötigt wird? –

0

Es ist nicht, ruft finish() nach startActivity folgt nicht den Android-Richtlinien. Ihre OutOfMemoryExecption wird durch etwas anderes verursacht

+13

Wo heißt es in den Richtlinien, dass man nach dem Aufruf von 'startActivity' nicht' finish() 'aufrufen soll? –

+2

Es scheint, dass ich die Richtlinie nach dem Lesen Ihres Kommentars falsch interpretiert habe. Mein Fehler. –

25

Wenn Sie eine neue Aktivität starten, wird die aktuelle Aktivität auf den Backstack der aktuellen Aufgabe geschoben. (Sie können dieses Verhalten über Flags und/oder das Manifest ändern, aber dies ist das Standardverhalten.) Wenn der Benutzer die Zurück-Funktion drückt, ist die oberste Aktivität beendet und der Stapel wird geöffnet. Das Ergebnis ist, dass der Benutzer die App zur vorherigen Aktivität zurückkehren sieht.

Es ist völlig in Ordnung, nach dem Start einer neuen Aktivität finish() aufzurufen. Das Ergebnis wird sein, dass die aktuelle Aktivität (die nicht mehr an der Spitze des Stapels liegt, da Sie gerade eine neue begonnen haben) vom Stapel entfernt wird. Wenn der Benutzer dann auf Zurück drückt, wird die vorherige Aktivität auf dem Backstack ausgeführt (oder die App beendet, wenn der Stack leer ist).

Wenn Sie zwischen Aktivitäten A und B hin- und herspringen, indem Sie immer eine neue starten und nie finish() aufrufen, kann dies zu einer OOM-Ausnahme führen, da der Stack mit Instanzen jeder Aktivität gefüllt wird.

Sie können mehr darüber in dem Leitthema Tasks and Back Stack lesen. Es beschreibt auch, wie man mit dem Radfahren zwischen Aktivitäten richtig umgehen kann.

+0

Große Antwort. Vielen Dank. – stevehs17

+0

Die Reihenfolge von 'startActivity (intent); finish(); 'Diese beiden Aussagen sind überhaupt wichtig? –

+1

@WeishiZeng - Ich habe es in beide Richtungen getan und es scheint keinen Unterschied zu machen. Ich denke nicht, dass es wichtig ist. –