Wie kann ich eine Android-App programmgesteuert beenden?

87

Ich bin sicher, dass diese Frage mehrmals gestellt wurde, weil ich einige gelesen habe. Mein Kunde möchte, dass ich eine Schaltfläche in seine App einfüge, über die Benutzer klicken und beenden können. Ich habe dies und fand Aufruf finish()wird es tun. Aber beenden beendet nur die aktuelle laufende Aktivität, oder? Ich habe viele Aktivitäten, daher muss ich in diesem Fall die Instanz jeder Aktivität übergeben und beenden oder jede Aktivität in ein Singleton-Muster umwandeln.

Ich habe auch erfahren, Activity.moveTaskToBack(true)dass Sie auf den Startbildschirm gelangen können. OK, dies wird nicht geschlossen, sondern als Hintergrund für den Prozess. Ist das also effektiv?

Mit welcher Methode kann ich die App vollständig schließen? Eine der oben beschriebenen oder eine andere Methode / andere Verwendung der oben genannten Methoden?

Zitronensaft
quelle
Warum nicht die Aktionsleiste verwenden? Klicken Sie auf das App-Symbol und navigieren Sie zum Startbildschirm. Klicken Sie auf den Zurück-Button, um zu beenden
Raghunandan
@ Raghunandan: Wie ich bereits erwähnte, Kundenanforderung :(
Zitronensaft
Überprüfen Sie, ob dies android.os.Process.killProcess (android.os.Process.myPid ()) hilft.
SANorton Stanley

Antworten:

71

Eigentlich sucht jeder nach dem Schließen der Anwendung bei einem Onclick-Ereignis, wo immer Aktivität sein mag ....

Also Jungs Freunde versuchen diesen Code. Fügen Sie diesen Code in das Ereignis onclick ein

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 
Fayaz
quelle
8
Dies "schließt die App nicht vollständig", wie PeakGen gefragt hat, da die App noch läuft, aber es ist eine schöne Alternative
La masse
2
Ich glaube nicht - wenn eine Aktivität mit FLAG ACTIVITY NEW TASK gestartet wurde
fozua
48

Sie können System.exit () aufrufen. aus allen Aktivitäten herauszukommen.

    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
quelle
5
Es bringt mich nur zur ersten Aktivität
Zitronensaft
8
@AnchitMittal System.exit (1) garantiert nicht das Zurücksetzen des Aktivitätsstapels oder der Aufgaben (siehe developer.android.com/guide/components/… ). Dieser Ansatz garantiert daher nicht das ordnungsgemäße Herunterfahren der App (Zerstörung aller Aktivitäten) zu gegebener Zeit.
Igor Ganapolsky
Nicht alle Aktivitäten müssen beendet werden.
Jitendra
42

Die in API 16 veröffentlichte Methode finishAffinity schließt alle laufenden Aktivitäten und die App:

this.finishAffinity();

Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben. Dies wird normalerweise verwendet, wenn eine Anwendung für eine andere Aufgabe gestartet werden kann (z. B. von einer ACTION_VIEW eines Inhaltstyps, den sie versteht) und der Benutzer die Aufwärtsnavigation verwendet hat, um von der aktuellen Aufgabe zu einer eigenen Aufgabe zu wechseln. Wenn der Benutzer in diesem Fall zu anderen Aktivitäten der zweiten Anwendung navigiert ist, sollten alle diese Aktivitäten im Rahmen des Aufgabenwechsels aus der ursprünglichen Aufgabe entfernt werden.

Beachten Sie, dass Sie mit diesem Finish keine Ergebnisse für die vorherige Aktivität liefern können. Wenn Sie dies versuchen, wird eine Ausnahme ausgelöst.


Seit API 21 können Sie Folgendes verwenden:

finishAndRemoveTask();

Beendet alle Aktivitäten in dieser Aufgabe und entfernt sie aus der Liste der letzten Aufgaben.

Alternativen:

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

Quelle: So beenden Sie die Android-Anwendung programmgesteuert


Ich hoffe es hilft! Viel Glück!

Shreshth Kharbanda
quelle
Verwenden Sie nicht System.exit (). Android versucht, die App nach dem Beenden neu zu starten. Sie könnten in einer Schleife enden.
AndroidDev
40

Wenn Sie Ihre Anwendung beenden möchten, verwenden Sie diesen Code in Ihrem Ereignis mit gedrückter Taste:

public void onBackPressed() {
  moveTaskToBack(true);
  android.os.Process.killProcess(android.os.Process.myPid());
  System.exit(1);
}
Pir Fahim Shah
quelle
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
quelle
4
Was ist anders zwischen System.exit (1); und System.exit (0);
Pyae Phyo
System.exit (1) bedeutet, dass die App mit einem Fehler beendet wurde, während System.exit (0) bedeutet, dass die App fehlerfrei beendet wurde. Auf diese Weise geben verschiedene Linux / Unix-Befehle beim Beenden (Fehler-) Bedingungen zurück.
iOS-Coder
17

Es ist viel zu einfach. VerwendenSystem.exit(0);

Amon Olimov
quelle
1
Hahahah. Nicht wirklich zu einfach
TheRealChx101
13

Tatsächlich gibt es zwei mögliche Situationen:

  1. Möglicherweise möchten Sie die Aktivität beenden
  2. Oder Sie möchten die Anwendung beenden

Sie können die Aktivität mit folgendem Code beenden:

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

Dadurch werden jedoch die zugrunde liegenden Aktivitäten in derselben Anwendung nicht beendet. Dies minimiert nur die Anwendung.

Wenn Sie die Anwendung beenden möchten, verwenden Sie den folgenden Code, um den Prozess zu beenden:

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

Für die Mono-Entwicklung einfach verwenden

process.KillProcess(Process.MyPid());
Kasun
quelle
Mypid () ist deine Methode oder was ...... also wie du Mypid geschrieben hast ... du musst mit Methode schreiben .....
Amitsharma
@amitsharma MyPid () ist eine Methode aus der Process-Klasse, die den Bezeichner dieses Prozesses zurückgibt, der mit killProcess (int) und sendSignal (int, int) verwendet werden kann
Kasun
Würde es auch den Hintergrunddienst und die Rundfunkempfänger stoppen oder würde es die App einfach sicher schließen?
Usman Rana
Also, was ist der Unterschied zwischen android.os.Process.killProcess(android.os.Process.myPid()); und process.KillProcess(Process.MyPid());?
DysaniazzZ
7

Wie wäre es mit this.finishAffinity()

Aus den Dokumenten,

Beenden Sie diese Aktivität sowie alle Aktivitäten direkt darunter in der aktuellen Aufgabe, die dieselbe Affinität haben. Dies wird normalerweise verwendet, wenn eine Anwendung für eine andere Aufgabe gestartet werden kann (z. B. von einer ACTION_VIEW eines Inhaltstyps, den sie versteht) und der Benutzer die Aufwärtsnavigation verwendet hat, um von der aktuellen Aufgabe zu einer eigenen Aufgabe zu wechseln. Wenn der Benutzer in diesem Fall zu anderen Aktivitäten der zweiten Anwendung navigiert ist, sollten alle diese Aktivitäten im Rahmen des Aufgabenwechsels aus der ursprünglichen Aufgabe entfernt werden. Beachten Sie, dass Sie mit diesem Finish keine Ergebnisse für die vorherige Aktivität liefern können. Wenn Sie dies versuchen, wird eine Ausnahme ausgelöst.

Akeshwar Jha
quelle
6
android.os.Process.killProcess(android.os.Process.myPid());
Kathir
quelle
Für meinen Fall hat dies mein Leben gerettet. Danke dir!
Lifka
4

Dadurch wird die Aufgabe (Stapel von Aktivitäten) gelöscht und eine neue Aufgabe gestartet

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
quelle
Erklären Sie, warum Sie diesen Code als Antwort gepostet haben und was er auch tut.
M. Adeel Khalid
1
Willkommen bei Stack Overflow! Während Sie möglicherweise das Problem dieses Benutzers gelöst haben, sind reine Code-Antworten für Benutzer, die in Zukunft auf diese Frage kommen, nicht sehr hilfreich. Bitte bearbeiten Sie Ihre Antwort, um zu erklären, warum Ihr Code das ursprüngliche Problem löst.
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
quelle
2

füge dieses in dein onClic ein:

moveTaskToBack(true);
    finish()
Stan Malcolm
quelle
Was ist los mit den Downvoted. Das ist die Antwort. Ich habe 2 Aktivitäten, 1. ist Loginaktivität und 2. ist Hauptaktivität .... Ich wollte die App innerhalb der Hauptaktivität beenden und nicht zur Loginaktivität zurückkehren ... Ich füge diese Antwort ein und jetzt kann ich die App innerhalb der Hauptaktivität schließen.
Azizi Musa
Wenn Sie dies tun, wird die Anwendung weiterhin den Hintergrund
ausführen
Funktioniert gut. Mein Fall ist: splashActivity Führen Sie MainActivity aus. Wenn der Benutzer erneut auf MainActivity drückt, wird die Anwendung wie erwartet beendet. Alle anderen Fälle bringen mich zurück zur Splash-Aktivität!
Jviaches
Nun, Sie sollten die Anmeldeaktivität beendet haben, sobald die Anmeldung abgeschlossen ist :) Und die Antwort ist natürlich nicht ganz richtig , movewTaskToBackbeendet nichts, sondern versteckt nur die App und beendet, finishwie von anderen erwähnt, nur die aktuelle activity. Es beendet also die aktuelle Aktivität und verbirgt den Rest, falls vorhanden. Auf jeden Fall sollte es nicht nur dafür eine Abwertung geben ...
Meow Cat 2012
2

Versuchen Sie dies bei einem Anruf. Ich benutze es manchmal in einem Klick auf eine Schaltfläche.

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

Anstatt Ihre App zu schließen, wird das Dashboard geöffnet, sodass es so aussieht, als wäre Ihre App geschlossen.

Lesen Sie diese Frage für mehr Klarheit Android - Anwendungscode beenden

Rishiraj Purohit
quelle
2

Verwenden Sie this.finishAffinity (); auf dieser Schaltfläche anstelle von finish (); Wenn es nicht funktioniert, können Sie es auch versuchen, indem Sie android: noHistory = "true" in Ihr Manifest einfügen und Ihre Aktivität dann mit uisng finish () beenden. oder finishAffinity ();

Ich hoffe es hilft....:)

Yesha Shah
quelle
2

Erreichen in Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
quelle
Ist dies ein Verweis auf System.Environment.Exit oder Android.OS.Environment.Exit?
Moffen
2

Rufen Sie einfach diese beiden Funktionen auf

 finish();
 moveTaskToBack(true);
younes
quelle
Ihre Antwort kam in Posts von geringerer Qualität. Bitte geben Sie eine Erklärung an, obwohl Ihr Code selbsterklärend ist.
Harsha Biyani
1

Geisteraktivität, die mit Singletop und finish () auf onCreate aufgerufen wird, sollte den Trick machen

JesusS
quelle
1

Es funktioniert nur mit moveTaskToBack(true);

user3856297
quelle
1

Anstelle von System.exit (1) Verwenden Sie einfach System.exit (0).

Kaze Tdr
quelle
1

Wenn jemand noch fragt, für Xamarin.Android (in meinem Fall auch monogame darauf läuft) das Kommando FinishAndRemoveTask()auf Activitymacht den Job sehr gut!

Konrad
quelle
1

im Fragment

getActivity (). finishAndRemoveTask ();

in der Aktivität

finishAndRemoveTask ();

Rodrigo Givisiez
quelle
0

Verwenden Sie einfach den Code in Ihrem Backpress

                    Intent startMain = new Intent(Intent.ACTION_MAIN);
                    startMain.addCategory(Intent.CATEGORY_HOME);
                    startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    startActivity(startMain);
Sayooj
quelle
0

Wenn Sie EventBus (oder wirklich jede andere Pub- / Unterbibliothek) in Ihrer Anwendung verwenden, um zwischen Aktivitäten zu kommunizieren, können Sie ihnen ein explizites Ereignis senden:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

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

Der einzige Nachteil dabei ist, dass Sie alle Aktivitäten benötigen, um dieses Ereignis anzuhören und sich selbst zu nennen finish(). Zu diesem Zweck können Sie auf einfache Weise Shim- Aktivitätsklassen durch Vererbung erstellen, die nur dieses Ereignis abhören und Unterklassen alles andere implementieren lassen. Stellen Sie dann sicher, dass alle Ihre Aktivitäten von dieser zusätzlichen Ebene erben. Die Kill-Listener könnten durch Überschreibungen sogar zusätzliche Funktionen hinzufügen, z. B. das Vermeiden des Todes in bestimmten Situationen.

Grzegorz Adam Hankiewicz
quelle
0

Führen Sie einfach die folgenden zwei Zeilen aus, wenn Sie die Anwendung beenden möchten

android.os.Process.killProcess(android.os.Process.myPid());
System.exit(1);
Hassnain Jamil
quelle
0
finish();
 finishAffinity();
 System.exit(0);

arbeitete für mich

Prabhu
quelle
1
Bitte fügen Sie Ihrem Code eine Erklärung hinzu. Darüber hinaus sieht es so aus, als ob andere Antworten bereits darauf eingegangen sind - also sollten Sie auch erklären, was Ihre Lösung besser macht als die anderen
Nico Haase
0

Nennen Sie dies einfach:

finishAffinity();
Muhammad Naveed
quelle
Während dieser Code die Frage möglicherweise beantwortet, verbessert die Bereitstellung eines zusätzlichen Kontexts darüber, warum und / oder wie dieser Code die Frage beantwortet, ihren langfristigen Wert.
Igor F.
0

Verknüpfen Sie diese Methode mit Ihrer Schaltfläche zum Beenden / Beenden

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }
Sihat Afnan
quelle
0
Intent homeIntent = new Intent(Intent.ACTION_MAIN);
homeIntent.addCategory( Intent.CATEGORY_HOME );
homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(homeIntent);
System.exit(1);

Verwenden Sie diesen Code, er ist sehr nützlich und Sie können alle Aktivitäten beenden.

Abdul Kadir
quelle
-1

Wenn Sie sowohl Beenden als auch Beenden verwenden, wird Ihre App vollständig geschlossen

Fertig();

System.exit (0);

Abdullah alkış
quelle