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?


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); 

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);

                }
            });

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!


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);
}

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();
    }

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


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());

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.


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

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);

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);
    }

2

umieść to w swoim onClic:

moveTaskToBack(true);
    finish()

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


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....:)


2

Osiąganie w Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }

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);

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.


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ę




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!



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);

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.


0

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

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);

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

pracował dla mnie


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();

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();
        }
    }

-1

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

koniec();

System.exit (0);

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.