2013-08-17 23 views
26

Mówię o programowaniu w systemie Android.Różnica między zakończeniem() i System.exit (0)

W pierwszych dniach Myślałam, że finish()zamyka bieżącą działalność i wrócić do poprzedniego w stosie aktywny i System.exit(0)zamyka całą aplikację.

Ale się myliłem. Zrobiłem mały eksperyment i zrozumiałem, że Obie zakończą tylko bieżącą Aktywność.


Jedyne różnice, które mogłyby Zauważyłem to, że w Androidzie 2.3.3

  • The ActivityResult są propagowane z powrotem do onActivityResult() użyciu finish(). Podczas gdy onActivityResult() nie wzywano do System.exit(0).

Ale w systemie Android 4.2.2, onActivityResult() jest wywoływana dla obu! i Intent miał wartość null dla exit(). (testowałem tylko w tych 2 urządzeń)

  • Jest opóźnienie przy korzystaniu exit() natomiast finish() jest szybciej. (Wydaje się, że więcej operacji tła są tam na wyjściu())

Więc

  1. jaka jest różnica między nimi?

  2. W jakich sytuacjach mogę użyć exit()?

Wierzę, że jest coś więcej, czego mi brakuje między dwiema metodami. Mam nadzieję, że ktoś może wyjaśnić więcej i poprawić mnie.

Dzięki

EDIT Na żądanie:

Złóż aplikację na Androida z 2 Działania. Wywołaj drugą aktywność z działania programu uruchamiającego za pomocą funkcji Intent. Teraz, w drugim działaniu, jednym kliknięciem przycisku, zadzwoń pod numer System.exit(0);. „VM i zatrzymuje dalsze wykonanie programu zostanie zamknięty.” ???? (według documentation)

widzę pierwszą aktywność nie. Czemu? (Zapraszamy do udowodnienia, że ​​się mylę/I miał rację)

+1

http://stackoverflow.com/questions/2033914/quitting-an-application-is-that-that-frowned-on. sprawdź odpowiedzi tutaj – Raghunandan

+0

@Raghunandan: To jest dobre. Wszyscy proszę spojrzeć. Ale ogromna ilość informacji. Czy ktoś może krótko opowiedzieć o moim temacie? – Nizam

+4

Nigdy nie używaj 'System.exit()' nie polecam go. Użyj 'finish()'. Do nawigacji możesz użyć szuflady nawigacji. – Raghunandan

Odpowiedz

9

W rzeczywistości nie ma różnicy, jeśli masz tylko jedną czynność. Jednakże, jeśli masz kilka działań na stosie, a następnie:

  • finish() - kończy aktywność gdzie jest ona wywoływana z a ty patrz poprzedni aktywność.
  • System.exit (0) - uruchamia ponownie aplikację z mniejszą liczbą aktywności na stosie. Tak więc, jeśli wywołasz ActivityB z ActivityA, a wywołaj System.exit(0) w ActivityB, aplikacja zostanie zabita i natychmiast uruchomiona z tylko jedną aktywnością ActivityA
13

Według Android Developer -

finish()

nazywają to gdy działalność jest wykonywana i powinny być zamknięte. Funkcja ActivityResult jest propagowana z powrotem do osoby, która wysłała cię przez onActivityResult().

System.exit(0)

VM zatrzymuje dalsze wykonania i program zakończy.

+7

System.exit() nie zabija aplikacji, jeśli na stosie znajduje się więcej niż jedna aktywność. Proszę sprawdź to. – Nizam

+6

@Nizam: "System.exit() nie zabija aplikacji, jeśli na stosie znajduje się więcej niż jedna aktywność" - możesz przesłać dowód, że proces się nie zakończył, przesyłając aplikację, która demonstruje to zachowanie, a także kroki podjęte w celu potwierdzenia, że ​​proces nie został zakończony. – CommonsWare

+6

@CommonsWare Nie powiedziałem, że proces nie został zakończony. I nie wiem, co się dzieje w środku. W abstrakcji, bez względu na to, czy używam metody finish(), czy exit() wewnątrz działania, wyświetlana jest poprzednia aktywność. to właśnie miałem na myśli, gdy aplikacja nie została zabita. – Nizam

9

Zgodnie z dokumentacją program zostanie zamknięty.
Ale wydaje się, że błąd w dokumentacji. W przypadku programu java jest to poprawne. Ale przychodząc na Androida, zobaczysz poprzednią aktywność ze stosu.

Ponieważ kodowanie w systemie Android odbywa się przy użyciu kodowania java, większość dokumentacji jest taka sama jak w przypadku języka Java.
Z dokumentacji

System.exit (0)
VM zatrzymuje dalsze wykonanie i program zakończy.
Dla aspektu Android, musimy zastąpić słowo "program" z czymś innym. Może być Aktywność lub Kontekst.

1

Odpowiedź Sa Qada jest poprawna po moich testach.

Finisz zamknie tę aktywność i wróci do sytuacji.

ale exit zamknie też bieżącej działalności i opróżnić całą aktywność w zamrażać i zacząć ponownie poprzednią działalność

Właściwie nie ma żadnej różnicy, jeśli masz tylko jedno działanie. Jednakże, jeśli masz kilka działań na stosie, to:

finish() - kończy działanie, z którego jest wywoływane, i widzisz poprzednią aktywność w postaci . System.exit (0) - ponownie uruchamia aplikację, wykonując jedną mniejszą aktywność na stosie.Tak więc, jeśli nazywa ActivityB z ActivityA i System.exit (0) nazywa się w ActivityB, aplikacja zostanie zabity i zaczął natychmiast z tylko jednym aktywności ActivityA