Od jakiegoś czasu tworzę aplikacje na Androida i śledziłem wiele postów na temat cyklu życia aktywności i cyklu życia aplikacji.
Wiem, że Activity.finish()
metoda wywołuje gdzieś na drodze Activity.onDestroy()
, a także usuwa aktywność ze stosu i wydaje mi się, że to w jakiś sposób wskazuje na system operacyjny i garbage collectora, że może "zrobić swoją sztuczkę" i uwolnić pamięć, gdy uzna to za dobry czas więc....
Doszedłem do tego postu - Czy rezygnacja z aplikacji nie jest mile widziana? i przeczytaj odpowiedź Marka Murphy'ego.
Trochę mnie to zdezorientowało, co finish()
właściwie robi ta metoda.
Czy jest szansa, że zadzwonię finish()
i onDestroy()
nie zadzwonię?
Odpowiedzi:
Podczas wywoływania
finish()
działania metodaonDestroy()
jest wykonywana. Ta metoda może wykonywać następujące czynności:Nie
onDestroy()
jest też niszczycielem. W rzeczywistości nie niszczy obiektu. To tylko metoda, która jest wywoływana w oparciu o określony stan. Twoja instancja nadalonDestroy()
działa i działa bardzo dobrze * po uruchomieniu i powrocie nadklasy.Android utrzymuje procesy na wypadek, gdyby użytkownik chciał ponownie uruchomić aplikację, co przyspiesza fazę uruchamiania. Proces nie będzie nic robić i jeśli trzeba będzie odzyskać pamięć, proces zostanie zabityźródło
Moje 2 centy za odpowiedź @K_Anas. Wykonałem prosty test na metodzie finish (). Wymieniono ważne metody wywołania zwrotnego w cyklu życia działania
Chcę przez to powiedzieć, że odpowiedniki metod wraz z metodami pośrednimi są wywoływane po wykonaniu metody finish ().
na przykład:
źródło
Zauważ również, że jeśli wywołasz finish () po zamianie, nie możesz wrócić do poprzedniej czynności za pomocą przycisku „Wstecz”
źródło
onDestroy()
jest przeznaczony do ostatecznego czyszczenia - uwolnienia zasobów, które możesz samodzielnie, zamykania otwartych połączeń, czytelników, pisarzy itp. Jeśli tego nie zmienisz, system zrobi to, co powinien.z drugiej strony,
finish()
po prostu informuje system, że programista chce, aby prądActivity
został zakończony. I dlatego jest wywoływanyonDestroy()
później.Coś do zapamiętania:
nie jest konieczne, aby tylko wywołanie
finish()
wyzwalało wywołanieonDestroy()
. Nie. Jak wiemy, system android może zabijać działania, jeśli czuje, że prąd potrzebuje zasobów,Activity
które trzeba uwolnić.źródło
finish()
mówi systemowi, aby zakończyłActivity
. częścią "x" w twojej instrukcji do jest "zakończenie (zniszczenie)Activity
". Druga część jest błędna. Właściwie to przegapiłem tam słowo. Poprawiłem odpowiedź.onDestroy()
jest nie tylko wyzwalany przezfinish()
system, ale także może go wywołać samodzielnie.Metoda Finish () zniszczy bieżącą aktywność. Możesz użyć tej metody w przypadkach, gdy nie chcesz, aby to działanie było ładowane wielokrotnie, gdy użytkownik naciśnie przycisk Wstecz. Zasadniczo usuwa aktywność z bieżącego stosu.
źródło
Oprócz powyższej odpowiedzi @rommex zauważyłem również, że
finish()
powoduje to kolejkowanie zniszczenia działania i zależy to od priorytetu działania.Jeśli zadzwonię
finish()
późniejonPause()
, widzęonStop()
ionDestroy()
natychmiast dzwonię .Jeśli zadzwonię
finish()
późniejonStop()
, widzęonDestroy()
dopiero 5 minut później.Z mojej obserwacji wygląda na to, że wykończenie jest
adb shell dumpsys activity activities
ustawione w kolejce, a kiedy spojrzałem na to, było ustawione nafinishing=true
, ale ponieważ nie jest już na pierwszym planie, nie było priorytetem do zniszczenia.Podsumowując,
onDestroy()
nigdy nie ma gwarancji, że zostaniesz wezwany, ale nawet w przypadku wywołania może to zostać opóźnione.źródło
Różne odpowiedzi i notatki twierdzą, że finish () może pomijać onPause () i onStop () i bezpośrednio wykonywać onDestroy (). Aby być uczciwym, dokumentacja Androida w tym ( http://developer.android.com/reference/android/app/Activity.html ) zawiera uwagi „Aktywność kończy się lub jest niszczona przez system”, co jest dość niejednoznaczne, ale może sugerować, że finish () może przejść do onDestroy ().
JavaDoc on finish () jest podobnie rozczarowujący ( http://developer.android.com/reference/android/app/Activity.html#finish () ) i tak naprawdę nie zauważa, jakie metody są wywoływane w odpowiedzi na finish ().
Więc napisałem tę mini-aplikację poniżej, która rejestruje każdy stan po wejściu. Zawiera przycisk, który wywołuje finish () - dzięki czemu można zobaczyć dzienniki uruchomionych metod. Ten eksperyment sugerowałby, że finish () rzeczywiście wywołuje również onPause () i onStop (). Oto wynik, który otrzymuję:
źródło
@ user3282164 Zgodnie z cyklem życia działania powinno przejść
onPause()
->onStop()
->onDestroy()
po wywołaniufinish()
.Diagram nie pokazuje żadnej prostej ścieżki od [Activity Running] do [
onDestroy()
] spowodowanej przez system.Dokument onStop () mówi: „ Zauważ, że ta metoda może nigdy nie zostać wywołana, w sytuacjach z małą ilością pamięci, gdy system nie ma wystarczającej ilości pamięci, aby utrzymać działanie procesu aktywności po wywołaniu metody onPause () ”.
źródło
Moje badanie pokazuje, że
finish()
metoda faktycznie umieszcza w kolejce pewne operacje niszczenia, ale działanie nie jest niszczone natychmiast. Planowane jest jednak zniszczenie.Na przykład, jeśli umieścisz
finish()
wonActivityResult()
zwrotnego, natomiastonResume()
musi jeszcze działać, to najpierwonResume()
zostanie wykonany, a dopiero późniejonStop()
ionDestroy()
są nazywane.UWAGA:
onDestroy()
nie można w ogóle dzwonić, jak podano w dokumentacji .źródło
wywołanie finish w onCreate () nie wywoła bezpośrednio onDestroy (), jak powiedział @prakash.
finish()
Operacja nie będzie nawet zacząć, aż wrócisz do kontroli Androida.Wywołanie finish () w onCreate () : onCreate () -> onStart () -> onResume () . Jeśli użytkownik wyjdzie, aplikacja zadzwoni -> onPause () -> onStop () -> onDestroy ()
Wywołanie finish () w onStart () : onCreate () -> onStart () -> onStop () -> onDestroy ()
Wywołanie finish () w onResume () : onCreate () -> onStart () -> onResume () -> onPause () -> onStop () -> onDestroy ()
Aby uzyskać dalsze informacje, spójrz na to oncreate continuous after finish & about finish ()
źródło
Wygląda na to, że jedyną poprawną odpowiedzią jak dotąd udzielił tu romnex: "onDestroy () nie może w ogóle zostać wywołany". Mimo że w praktyce prawie we wszystkich przypadkach tak się stanie, nie ma żadnej gwarancji: dokumentacja na finish () tylko obiecuje, że wynik działania jest propagowany z powrotem do wywołującego, ale nic więcej. Ponadto dokumentacja cyklu życia wyjaśnia, że działanie jest możliwe do zabicia przez system operacyjny, gdy tylko onStop () zakończy się (lub nawet wcześniej na starszych urządzeniach), co, chociaż mało prawdopodobne, a zatem rzadkie do zaobserwowania w prostym teście, może oznaczać, że działanie może zostać zabity podczas lub nawet przed wykonaniem onDestroy ().
Więc jeśli chcesz mieć pewność, że jakaś praca zostanie wykonana podczas wywoływania finish (), nie możesz jej umieścić w onDestroy (), ale będziesz musiał to zrobić w tym samym miejscu, w którym wywołujesz finish (), tuż przed wywołaniem go.
źródło
finish () po prostu odsyła z powrotem do poprzedniej aktywności w Androidzie lub możesz powiedzieć, że cofa się o jeden krok w aplikacji
źródło