Jak działa Activity.finish () w systemie Android?

108

Czy ktoś mógłby opisać, co się dzieje, gdy Activitywywołuje swoją finish()metodę?

Czy kończy się natychmiast, czy kończy funkcję, z której został wywołany?

rantravee
źródło

Odpowiedzi:

123

Czy kończy się natychmiast, czy kończy funkcję, z której został wywołany?

Wywołana metoda finish()zostanie zakończona. finish()Operacja nie będzie nawet zacząć, aż wrócisz do kontroli Androida.

CommonsWare
źródło
3
Jak więc zakończyć działanie wywoływane przez StartAvtivityforResults () bez zakończenia?
Ayush Pateria
@CommonsWare Jak możemy zapewnić, że onStop jest zawsze wywoływany? W mojej aplikacji OnStop i onDestroy nie są wywoływane w niektórych przypadkach iw takich przypadkach działanie podrzędne zajmuje zbyt dużo czasu na zakończenie i wygląda na to, że aplikacja zawiesiła się ... Podczas gdy gdy nazywa się onStop, wszystko działa normalnie. Jestem na Galaxy y z Androidem 2.3.6 ... zobacz moje pytanie na stackoverflow.com/questions/13928591/ ... plz help !!!
Amit
@CommonsWare Przetestowałem, panie, bardzo prawdziwe. + 1 dla ciebie Ale chcę zadać jedno pytanie, które napisałem finish () jako pierwszą instrukcję w mojej funkcji, a następnie wykonuje całą funkcję, a następnie finish () nazywa się Jak to zarządzono.
Nikhil Agrawal
@NikhilAgrawal, możesz mieć funkcję powrotu zaraz po wywołaniu metody finish ().
antonio081014
Czy finish () również wywołuje onPause () i onStop () przed wywołaniem onDestroy ()?
sr09
20

Każde zdarzenie cykl życia jak onCreate, onResume, onPause....onDestroy z działalności jest zawsze nazywany na jednym wątku - „głównym wątku”.

Krótko mówiąc, ten wątek jest wspierany przez kolejkę, do której wysyłane są wszystkie zdarzenia dotyczące aktywności. Ten wątek może wykonywać wszystkie te zdarzenia w kolejności wstawiania.

Jeśli wywołujesz finish()jedną z wywołań zwrotnych cyklu życia, takich jak onCreate()... wiadomość "koniec" zostanie dodana do tej kolejki, ale wątek nie może wybrać i wykonać akcji "zakończ", dopóki aktualnie wykonywana metoda nie zwróci, tj. Wątek zostanie zwolniony aktualne zadanie.

user3688593
źródło
13

ondestroy() to ostatnie wezwanie, które otrzymujesz, zanim Twoja działalność zostanie zniszczona.

Może się tak zdarzyć, gdy czynność się kończy (ktoś ją wezwał finish() , lub ponieważ system tymczasowo niszczy tę instancję czynności, aby zaoszczędzić miejsce). Możesz rozróżnić te dwa scenariusze za pomocą isFinishing() metody.

user284295
źródło
1

Jeśli są dwa działania A i B. A twój przepływ przebiega od A> B; i B = A wzywa finish().

Następnie,

Metoda, z której wywołałeś, finish()zostanie wykonana, jak wspomniał Mark. A przepływ wywołań zwrotnych będzie następujący -

  1. onPause() z activity A
  2. onRestart()> onStart()> onResume()Aktywności B
  3. Potem pojawia się prawdziwa różnica. Jeśli nie dzwoniłeś finish()z activity A; tylko onStop()z Activity Azostanie wezwanych tutaj. Chociaż w tym przypadku, gdzie nazwaliśmy finish()z Activity A; Tak więc onStop()i onDestroy()obie będą wezwane activity A.
Darpan
źródło