Jak programowo zamknąć aplikację na Androida?

93

Jestem pewien, że to pytanie zostało zadane wiele razy, ponieważ przeczytałem kilka. Mój klient chce, żebym umieścił przycisk w jego aplikacji, w którym użytkownicy mogą kliknąć i wyjść. Przeczytałem to i stwierdziłem, że zadzwonienie finish()wystarczy. Ale zakończenie to tylko zamknięcie bieżącej aktywności, prawda? Mam wiele działań, więc w tym przypadku muszę przejść każdą instancję działania i zakończyć je lub uczynić każdą aktywność we wzorcu Singleton.

Dowiedziałem się również, że Activity.moveTaskToBack(true)może przenieść Cię na ekran główny. OK, to nie jest zamknięcie, ale kontynuacja procesu. Czy to jest skuteczne?

Której metody należy użyć, aby całkowicie zamknąć aplikację? Któryś z wyżej opisanych lub inny sposób / inne zastosowanie powyższych metod?

Sok cytrynowy
źródło
dlaczego nie skorzystać z paska akcji. kliknij ikonę aplikacji, aby przejść do ekranu głównego. kliknij przycisk Wstecz, aby wyjść
Raghunandan
@Raghunandan: Jak wspomniałem, wymagania klienta :(
Lemon Juice
Sprawdź, czy to pomaga android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley,

Odpowiedzi:

71

Właściwie każdy szuka zamknięcia aplikacji na zdarzeniu onclick, gdziekolwiek może być aktywność ....

Więc przyjaciele faceci próbują tego kodu. Umieść ten kod w zdarzeniu onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
Fayaz
źródło
8
To faktycznie nie zamyka całkowicie aplikacji, jak pytał PeakGen, ponieważ aplikacja nadal działa, ale jest to fajna alternatywa
La masse
2
Nie sądzę , jeśli aktywność rozpoczęła się od FLAG ACTIVITY NEW TASK , w ten sposób nie można jej zakończyć
fozua
51

Możesz wywołać System.exit (); wyjść ze wszystkich zajęć.

    submit=(Button)findViewById(R.id.submit);

            submit.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View arg0) {
android.os.Process.killProcess(android.os.Process.myPid());
                    System.exit(1);

                }
            });
Anchit Mittal
źródło
5
To właśnie prowadzi mnie do pierwszej aktywności
Lemon Juice,
8
@AnchitMittal System.exit (1) nie gwarantuje zresetowania stosu działań ani zadań (patrz developer.android.com/guide/components/ ... ). Dlatego takie podejście nie gwarantuje prawidłowego zamknięcia aplikacji (zniszczenia wszystkich działań) w odpowiednim czasie.
Igor Ganapolsky
Nie wszystkie działania do wyjścia.
Jitendra
49

Metoda finishAffinity, wydana w API 16, zamyka wszystkie trwające działania i zamyka aplikację:

this.finishAffinity();

Zakończ tę czynność, a także wszystkie czynności bezpośrednio pod nią w bieżącym zadaniu, które mają to samo podobieństwo. Jest to zwykle używane, gdy aplikacja może zostać uruchomiona w innym zadaniu (na przykład z ACTION_VIEW typu treści, który rozumie), a użytkownik wykorzystał nawigację w górę, aby przełączyć się z bieżącego zadania do własnego zadania. W takim przypadku, jeśli użytkownik przeszedł w dół do innych działań drugiej aplikacji, wszystkie z nich należy usunąć z pierwotnego zadania w ramach przełączania zadań.

Zwróć uwagę, że to zakończenie nie pozwala na dostarczenie wyników do poprzedniego działania, a jeśli spróbujesz to zrobić, zostanie zgłoszony wyjątek.


Od API 21 możesz używać:

finishAndRemoveTask();

Kończy wszystkie czynności w tym zadaniu i usuwa je z listy ostatnich zadań.

Alternatywy:

getActivity().finish();
System.exit(0);


int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);


Process.sendSignal(Process.myPid(), Process.SIGNAL_KILL);


Intent i = new Intent(context, LoginActivity.class);
i.putExtra(EXTRA_EXIT, true);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
context.startActivity(i);

Źródło: Jak programowo zamknąć aplikację na Androida


Mam nadzieję, że to pomoże! Powodzenia!

Shreshth Kharbanda
źródło
2
Nie używaj System.exit (). Android spróbuje ponownie uruchomić aplikację po jej zamknięciu. Możesz skończyć w pętli.
AndroidDev
42

Jeśli chcesz wyjść z aplikacji, użyj tego kodu wewnątrz zdarzenia naciśnięcia przycisku:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
Pir Fahim Shah
źródło
24
 @Override
    public void onBackPressed() {
        AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(this);
        alertDialogBuilder.setTitle("Exit Application?");
        alertDialogBuilder
                .setMessage("Click yes to exit!")
                .setCancelable(false)
                .setPositiveButton("Yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                moveTaskToBack(true);
                                android.os.Process.killProcess(android.os.Process.myPid());
                                System.exit(1);
                            }
                        })

                .setNegativeButton("No", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        dialog.cancel();
                    }
                });

        AlertDialog alertDialog = alertDialogBuilder.create();
        alertDialog.show();
    }
Sai Aditya
źródło
4
Czym różni się n System.exit (1); i System.exit (0);
Pyae Phyo
System.exit (1) oznacza, że ​​aplikacja zakończyła się z pewnym błędem, podczas gdy System.exit (0) oznacza, że ​​aplikacja zakończyła się bez żadnego błędu. W ten sposób różne polecenia linux / unix zwracają warunki (błąd) po zakończeniu.
iOS-Coder
17

To zbyt łatwe. Posługiwać sięSystem.exit(0);

Amon Olimov
źródło
2
Hahahah. Niezbyt łatwe
TheRealChx101
13

Oczywiście istnieją dwie możliwe sytuacje:

  1. Możesz wyjść z zajęć
  2. Lub chcesz wyjść z aplikacji

Możesz wyjść z aktywności za pomocą następującego kodu:

var intent = new Intent(Intent.ActionMain);
intent.AddCategory(Intent.CategoryHome);
intent.SetFlags(ActivityFlags.NewTask);
startActivity(intent);
finish();

Ale to nie zabije podstawowych działań w tej samej aplikacji. To po prostu zminimalizuje aplikację.

Jeśli chcesz wyjść z aplikacji, użyj następującego kodu, aby zakończyć jej proces:

android.os.Process.killProcess(android.os.Process.myPid()); 

do rozwoju mono po prostu użyj

process.KillProcess(Process.MyPid());
Kasun
źródło
Mypid () jest twoją metodą lub co ...... więc jak masz napisać Mypid ... musisz pisać metodą .....
Amitsharma
@amitsharma MyPid () to metoda z klasy Process, która zwraca identyfikator tego procesu, którego można używać z killProcess (int) i sendSignal (int, int)
Kasun
Czy zatrzymałoby to również usługę w tle i odbiorniki nadawcze, czy po prostu bezpiecznie zamknie aplikację?
Usman Rana
więc jaka jest różnica między android.os.Process.killProcess(android.os.Process.myPid()); i process.KillProcess(Process.MyPid());?
DysaniazzZ
7

Co powiesz na this.finishAffinity()

Z dokumentów,

Zakończ tę czynność, a także wszystkie czynności bezpośrednio pod nią w bieżącym zadaniu, które mają to samo podobieństwo. Jest to zwykle używane, gdy aplikacja może zostać uruchomiona w innym zadaniu (na przykład z ACTION_VIEW typu treści, który rozumie), a użytkownik wykorzystał nawigację w górę, aby przełączyć się z bieżącego zadania do własnego zadania. W takim przypadku, jeśli użytkownik przeszedł w dół do innych działań drugiej aplikacji, wszystkie z nich należy usunąć z pierwotnego zadania w ramach przełączania zadań. Zwróć uwagę, że to zakończenie nie pozwala na dostarczenie wyników do poprzedniego działania, a jeśli spróbujesz to zrobić, zostanie zgłoszony wyjątek.

Akeshwar Jha
źródło
6
android.os.Process.killProcess(android.os.Process.myPid());
kathir
źródło
W moim przypadku to uratowało mi życie. Dziękuję Ci!
Lifka
4

spowoduje to wyczyszczenie zadania (stos działań) i rozpoczęcie nowego zadania

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
System.exit(1);
Mahmood Ali
źródło
Wyjaśnij, dlaczego opublikowałeś ten kod jako odpowiedź i co on robi.
M. Adeel Khalid,
1
Witamy w Stack Overflow! Chociaż być może rozwiązałeś problem tego użytkownika, odpowiedzi zawierające tylko kod nie są zbyt pomocne dla użytkowników, którzy przyjdą na to pytanie w przyszłości. Zmień swoją odpowiedź, aby wyjaśnić, dlaczego kod rozwiązuje pierwotny problem.
Joe C
3
 @Override
    public void onBackPressed() {
        Intent homeIntent = new Intent(Intent.ACTION_MAIN);
        homeIntent.addCategory( Intent.CATEGORY_HOME );
        homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(homeIntent);
    }
azeem khan
źródło
2

umieść to w swoim onClic:

moveTaskToBack(true);
    finish()
Stan Malcolm
źródło
co jest nie tak z odrzuconymi. To jest odpowiedź. Mam 2 czynności, pierwsza to aktywność z logowaniem, a druga to aktywność główna .... chciałem wyjść z aplikacji w ramach aktywności głównej i nie chcę wracać do aktywności logowania ... wstawiam tę odpowiedź i teraz mogę zamknąć aplikację w ramach aktywności głównej.
Azizi Musa
jeśli to zrobisz, aplikacja będzie nadal działać w tle
Mohanad Haddadin
Pracować w porządku. Mój przypadek to: splashActivity uruchom MainActivity. Gdy użytkownik naciśnie ponownie przycisk MainActivity, aplikacja kończy działanie zgodnie z oczekiwaniami. Wszystkie inne sprawy prowadzą mnie z powrotem do działania splash!
Jviaches
Cóż, powinieneś skończyć czynność logowania zaraz po zakończeniu logowania :) A odpowiedź oczywiście nie jest do końca poprawna , movewTaskToBacknic nie kończy, po prostu ukrywa aplikację i finishjak wspominał ktoś inny kończy tylko bieżącą activity. Więc kończy bieżącą działalność i ukrywa resztę, jeśli w ogóle jakieś prezenty. Zresztą nie powinno to mieć negatywnego wyniku tylko za to ...
Meow Cat 2012
2

Spróbuj tego podczas rozmowy. Czasami używam go po kliknięciu przycisku.

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

Zamiast zamykać aplikację, otwiera pulpit nawigacyjny, więc wygląda na to, że aplikacja jest zamknięta.

przeczytaj to pytanie, aby uzyskać większą jasność Android - kod aplikacji zakończony

Rishiraj Purohit
źródło
2

Użyj this.finishAffinity (); na tym przycisku zamiast finish (); Jeśli to nie zadziała, możesz również spróbować, dodając android: noHistory = "true" w swoim manifeście, a następnie zakończyć działanie przez uisng finish (); lub finishAffinity ();

Mam nadzieję, że to pomoże....:)

Yesha Shah
źródło
2

Osiąganie w Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
źródło
Czy jest to odwołanie do System.Environment.Exit lub Android.OS.Environment.Exit?
Moffen
2

Po prostu wywołaj te dwie funkcje

 finish();
 moveTaskToBack(true);
younes
źródło
Twoja odpowiedź pojawiła się w postach niższej jakości. Proszę podać wyjaśnienie, mimo że kod jest zrozumiały.
Harsha Biyani
2
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Użyj tego kodu, który jest bardzo przydatny i możesz zakończyć wszystkie działania.

Abdul Kadir
źródło
Zrobiłem to, a potem wyrzuciłem telefon z 5 piętra, wszystkie zajęcia zakończone dzięki
Paschalis
1

aktywność ducha wywoływana za pomocą singletop i finish () na onCreate powinna załatwić sprawę

JesusS
źródło
1

Działa tylko przy użyciu moveTaskToBack(true);

user3856297
źródło
1

Zamiast System.exit (1) Po prostu użyj System.exit (0)

Kaze Tdr
źródło
1

Jeśli ktoś nadal się zastanawia, dla Xamarin.Android (w moim przypadku również uruchomionej na nim Monogame) polecenie FinishAndRemoveTask()on Activitywykonuje zadanie bardzo dobrze!

Konrad
źródło
1

we fragmencie

getActivity (), finishAndRemoveTask ();

w działaniu

finishAndRemoveTask ();

Rodrigo Givisiez
źródło
0

po prostu użyj kodu w swoim backpressie

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
Sayooj
źródło
0

Jeśli używasz EventBus (lub naprawdę dowolnej innej biblioteki pub / sub) w swojej aplikacji do komunikacji między działaniami, możesz wysłać im jawne zdarzenie:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

    public static void send()
    {
        EventBus.getDefault().post(new KillItWithFireEvent());
    }
}

Jedynym minusem jest to, że aby wysłuchać tego wydarzenia, potrzebujesz wszystkich działań, aby nazwać je własnymi finish(). W tym celu możesz łatwo utworzyć klasy aktywności shim poprzez dziedziczenie, które po prostu nasłuchują tego zdarzenia i pozwalają podklasom implementować wszystko inne, a następnie upewnij się, że wszystkie twoje działania dziedziczą z tej dodatkowej warstwy. Odbiorcy zabójstw mogą nawet dodać dodatkowe funkcje poprzez zastąpienia, takie jak unikanie śmierci w określonych sytuacjach.

Grzegorz Adam Hankiewicz
źródło
0

Po prostu uruchom poniższe dwie linie, gdy chcesz wyjść z aplikacji

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Hassnain Jamil
źródło
0
finish();
 finishAffinity();
 System.exit(0);

pracował dla mnie

prabhu
źródło
1
Dodaj wyjaśnienie do swojego kodu. Dodatkowo, wygląda innych odpowiedzi objętych już, że - tak należy również wyjaśnić, co sprawia, że rozwiązanie lepsze niż inni
Nico Haase
0

Po prostu nazwij to:

finishAffinity();
Muhammad Naveed
źródło
Chociaż ten kod może odpowiedzieć na pytanie, zapewnia dodatkowy kontekst dotyczący tego, dlaczego i / lub jak ten kod odpowiada, poprawia jego długoterminową wartość.
Igor F.
0

Połącz tę metodę z przyciskiem wyjścia / wyjścia

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
Sihat Afnan
źródło
-1

Jeśli użyjesz zarówno zakończenia, jak i wyjścia, aplikacja zostanie całkowicie zamknięta

koniec();

System.exit (0);

Abdullah alkış
źródło