Chcę zamknąć moją aplikację, aby nie działała już w tle.
Jak to zrobić? Czy to dobra praktyka na platformie Android?
Jeśli korzystam z przycisku „Wstecz”, zamyka aplikację, ale pozostaje w tle. Istnieje nawet aplikacja o nazwie „TaskKiller”, która służy do zabijania tych aplikacji w tle.
Odpowiedzi:
Android ma mechanizm bezpiecznego zamykania aplikacji zgodnie z dokumentacją. W ostatnim działaniu, które zostało zakończone (zwykle jest to główne działanie, które pojawiło się po raz pierwszy podczas uruchamiania aplikacji), wystarczy umieścić kilka wierszy w metodzie onDestroy (). Wywołanie System.runFinalizersOnExit (true) zapewnia, że wszystkie obiekty zostaną sfinalizowane i usunięte zostaną elementy bezużyteczne po zamknięciu aplikacji. Możesz także szybko zabić aplikację za pomocą android.os.Process.killProcess (android.os.Process.myPid ()) Jeśli wolisz, . Najlepszym sposobem na to jest umieszczenie metody takiej jak poniższa w klasie pomocniczej, a następnie wywołanie jej, gdy aplikacja musi zostać zabita. Na przykład w metodzie niszczenia działania roota (zakładając, że aplikacja nigdy nie zabije tej aktywności):
Ponadto system Android nie powiadomi aplikacji o zdarzeniu klawisza HOME , więc nie można zamknąć aplikacji po naciśnięciu klawisza HOME . Android rezerwuje zdarzenie klucza HOME dla siebie, aby programista nie mógł uniemożliwić użytkownikom opuszczenia aplikacji. Można jednak stwierdzić, że naciśnięto klawisz HOME, ustawiając flagę na true w klasie pomocniczej, która zakłada, że klawisz HOME został naciśnięty, a następnie zmieniając flagę na false, gdy wystąpi zdarzenie, które pokazuje, że klawisz HOME nie został naciśnięty, a następnie sprawdzenie, czy klawisz HOME został naciśnięty w metodzie onStop () aktywności.
Nie zapomnij posługiwać się klawiszem HOME dla wszystkich menu i czynności uruchamianych przez menu. To samo dotyczy klawisza SEARCH . Poniżej znajduje się kilka przykładowych klas do zilustrowania:
Oto przykład działania roota, które zabija aplikację po jej zniszczeniu:
Oto abstrakcyjne działanie, które można rozszerzyć tak, aby obsługiwało klucz HOME dla wszystkich działań, które go rozszerzają:
Oto przykład ekranu menu, który obsługuje klawisz HOME :
Oto przykład klasy pomocniczej, która obsługuje klawisz HOME w aplikacji:
źródło
killApp()
, ponieważ Google wskazał, że doprowadzi to do nieprzewidywalnego zachowania.TAK! Z całą pewnością możesz zamknąć aplikację, aby nie działała już w tle. Tak jak inni skomentowali,
finish()
jest zalecany przez Google sposób, który tak naprawdę nie oznacza, że twój program jest zamknięty.To właśnie tam zamknie twoją aplikację, nie pozostawiając niczego działającego w tle, jednak używaj tego mądrze i nie zostawiaj otwartych plików, otwartych uchwytów bazy danych itp. Te rzeczy normalnie zostałyby wyczyszczone za pomocą
finish()
polecenia.Osobiście NIENAWIDZĘ, gdy wybieram opcję Zakończ w aplikacji i tak naprawdę nie wychodzi.
źródło
Tak to zrobiłem:
Po prostu włożyłem
wewnątrz metody, która otwiera działanie, a następnie wewnątrz metody SOMECLASSNAME, która ma na celu zamknięcie aplikacji, którą umieściłem:
W mojej klasie głównej umieściłem:
źródło
Wystarczy, że po tak długim czasie odpowiem na moje własne pytanie (ponieważ CommonsWare skomentował najpopularniejszą odpowiedź, mówiąc, że NIE powinniśmy tego robić):
Kiedy chcę zamknąć aplikację:
FLAG_ACTIVITY_CLEAR_TOP
inna czynność aktualnie znajdująca się na dole stosu aktywności) z (co spowoduje zakończenie wszystkich innych czynności rozpoczętych po niej, co oznacza - wszystkie). Po prostu spraw, aby ta aktywność była na stosie aktywności (nie kończ jej z jakiegoś powodu z góry).finish()
tę aktywnośćTo jest to, na mnie działa całkiem nieźle.
źródło
Po prostu napisz ten kod na swoim przycisku EXIT kliknij.
A w metodzie onCreate () Twojego MainActivity.class napisz poniższy kod jako pierwszą linię,
źródło
Nie jest to możliwe przy użyciu interfejsów API platformy. To system operacyjny (Android) decyduje, kiedy proces powinien zostać usunięty lub pozostawiony w pamięci. Dzieje się tak ze względu na wydajność: jeśli użytkownik zdecyduje się ponownie uruchomić aplikację, to już tam jest, bez konieczności ładowania jej do pamięci.
Więc nie,
nie tylko jest tozniechęcone, ale nie możnatego zrobić.źródło
Wychodzenie z aplikacji:
Sposób 1:
zadzwoń
finish();
i zastąponDestroy();
. Umieść następujący kod wonDestroy()
:lub
Sposób 2:
Sposób 3:
Sposób 4:
Sposób 5:
Czasami wywołanie
finish()
kończy tylko bieżącą czynność, a nie całą aplikację. Istnieje jednak obejście tego problemu. Za każdym razem, gdy zaczynaszactivity
, zacznij odstartActivityForResult()
. Jeśli chcesz zamknąć całą aplikację, możesz wykonać następujące czynności:Następnie zdefiniuj
onActivityResult(...)
wywołanie zwrotne każdego działania, więc gdyactivity
zwracaRESULT_CLOSE_ALL
wartość, wywołuje równieżfinish()
:źródło
W ten sposób system Windows Mobile działał ... cóż ... zawsze! Oto, co Microsoft ma do powiedzenia w tej sprawie:
http://blogs.msdn.com/windowsmobile/archive/2006/10/05/The-Emperor-Has-No-Close.aspx (czy to smutne, że przypomniałem sobie tytuł wpisu na blogu z 2006 roku? Znalazłem artykuł w Google, wyszukując „cesarz nie ma bliskiego” lol)
W skrócie:
Wiele komentarzy w tym pytaniu w O'Reilly sugeruje, że Android zachowuje się w podobny sposób, zamykając aplikacje, które nie były używane przez jakiś czas, tylko wtedy, gdy Android potrzebuje pamięci, której używa.
Ponieważ jest to funkcja standardowa, zmiana zachowania na wymuszone zamknięcie spowodowałaby zmianę doświadczenia użytkownika. Wielu użytkowników byłoby przyzwyczajonych do łagodnego odrzucania aplikacji na Androida, więc kiedy odrzucają jedną z nich z zamiarem powrotu do niej po wykonaniu innych zadań, mogą być raczej sfrustrowani, że stan aplikacji jest resetowany lub że trwa to dłużej otworzyć. Trzymałbym się standardowego zachowania, ponieważ tego się oczekuje.
źródło
Wywołanie
finish()
metody w działaniu ma pożądany wpływ na bieżące działanie.źródło
żadna z powyższych odpowiedzi nie działa dobrze w mojej aplikacji
oto mój działający kod
na przycisku wyjścia:
ten kod ma na celu zamknięcie wszelkich innych działań i przeniesienie MainActivity na wierzch teraz w Twojej MainActivity:
źródło
Umieść
finish();
oświadczenie jak poniżej:W każdej czynności.
źródło
źródło
Skopiuj poniższy kod i wklej plik AndroidManifest.xml w obszarze First Activity Tag.
Dodaj również poniższy kod we wszystkich w obszarze Activity Tag w pliku AndroidManifest.xml
źródło
Niemożliwe z 2.3. Dużo przeszukuję i wypróbowałem wiele aplikacji. Najlepszym rozwiązaniem jest zainstalowanie zarówno (go taskmanager), jak i (szybkiego ponownego uruchomienia). Używając ich razem, zadziała i uwolni pamięć. Inną opcją jest aktualizacja do Android Ice Cream Sandwich 4.0.4, która umożliwia kontrolę (zamknięcie) aplikacji.
źródło
Chciałem wrócić do ekranu głównego mojego urządzenia z Androidem, więc po prostu użyłem:
źródło
Użycie
finishAffinity()
może być dobrą opcją, jeśli chcesz zamknąć całą aktywność aplikacji. Zgodnie z dokumentami Androidaźródło
i wyraźnie:
Wtedy możesz zadzwonić
CloseAppActivity.closeApp(fromActivity)
i aplikacja zostanie zamknięta.źródło
Po prostu napisz następujący kod w onBackPressed:
źródło
wywołując finish (); w przycisku OnClick lub w menu
źródło
finish()
nie zabija aplikacji. Może wrócić do poprzedniego celu lub aplikacji w tle.Myślę, że spowoduje to zamknięcie Twojej działalności i wszystkich powiązanych z nią działań podrzędnych.
źródło
Najlepszy i najkrótszy sposób korzystania z tabeli System.exit.
Maszyna wirtualna zatrzymuje dalsze wykonywanie i program kończy pracę.
źródło
Użyj „
this.FinishAndRemoveTask();
” - poprawnie zamyka aplikacjęźródło