Comment quitter une application Android par programmation?


93

Je suis sûr que cette question a été posée plusieurs fois parce que j'en ai lu quelques-unes. Mon client veut que je mette un bouton dans son application où les utilisateurs peuvent cliquer et quitter. J'ai lu ceci et j'ai trouvé que l'appel finish()le ferait. Mais, terminer ne fait que fermer l'activité courante, n'est-ce pas? J'ai beaucoup d'activités, donc dans ce cas, je dois passer chaque instance d'activité et les terminer ou faire de chaque activité un modèle Singleton.

J'ai également appris à savoir Activity.moveTaskToBack(true)que vous pouviez accéder à l'écran d'accueil. OK, ce n'est pas la fermeture mais l'arrière-plan du processus. Alors, est-ce efficace?

Quelle méthode dois-je utiliser pour fermer complètement l'application? L'une des méthodes décrites ci-dessus ou toute autre méthode / autre utilisation des méthodes ci-dessus?


pourquoi ne pas utiliser la barre d'action. cliquez sur l'icône de l'application pour accéder à l'écran d'accueil. cliquez sur le bouton retour pour quitter
Raghunandan

@Raghunandan: Comme je l'ai mentionné, l'exigence du client :(
Lemon Juice

Vérifiez si cela aide android.os.Process.killProcess (android.os.Process.myPid ());
SANorton Stanley


Réponses:


71

En fait, tout le monde cherche à fermer l'application sur un événement onclick, quelle que soit l'activité ...

Alors les amis les gars essaient ce code. Mettez ce code sur l'événement onclick

Intent homeIntent = new Intent(Intent.ACTION_MAIN);
    homeIntent.addCategory( Intent.CATEGORY_HOME );
    homeIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);  
    startActivity(homeIntent); 

8
En fait, cela ne "ferme pas complètement l'application" comme PeakGen l'a demandé puisque l'application est toujours en cours d'exécution, mais c'est une bonne alternative
La masse

2
Je ne pense pas , si une activité a commencé avec FLAG ACTIVITY NEW TASK , de cette façon ne peut pas la quitter
fozua

51

Vous pouvez appeler System.exit (); pour sortir de toutes les activités.

    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
Cela m'amène à la première activité
Jus de citron

8
@AnchitMittal System.exit (1) ne garantira pas la réinitialisation de la pile d'activités ou des tâches (voir developer.android.com/guide/components/… ). Cette approche ne garantit donc pas un arrêt correct de l'application (détruisant toutes les activités) en temps voulu.
IgorGanapolsky

Pas toutes les activités pour sortir.
Jitendra

49

La méthode finishAffinity, publiée dans l'API 16, ferme toutes les activités en cours et ferme l'application:

this.finishAffinity();

Terminez cette activité ainsi que toutes les activités immédiatement inférieures dans la tâche actuelle qui ont la même affinité. Ceci est généralement utilisé lorsqu'une application peut être lancée sur une autre tâche (par exemple à partir d'un ACTION_VIEW d'un type de contenu qu'il comprend) et que l'utilisateur a utilisé la navigation vers le haut pour quitter la tâche actuelle et accéder à sa propre tâche. Dans ce cas, si l'utilisateur a navigué vers le bas dans toutes les autres activités de la deuxième application, toutes doivent être supprimées de la tâche d'origine dans le cadre du changement de tâche.

Notez que cette finition ne vous permet pas de fournir des résultats à l'activité précédente, et une exception sera levée si vous essayez de le faire.


Depuis l'API 21, vous pouvez utiliser:

finishAndRemoveTask();

Termine toutes les activités de cette tâche et la supprime de la liste des tâches récentes.

Alternatives:

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

Source: Comment quitter l'application Android par programme


J'espère que cela aide! Bonne chance!


2
N'utilisez pas System.exit (). Android tentera de redémarrer l'application après sa fermeture. Vous pourriez vous retrouver dans une boucle.
AndroidDev

42

Si vous souhaitez quitter votre application, utilisez ce code dans votre événement bouton appuyé:

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
Quelle est la différence entre n System.exit (1); et System.exit (0);
Pyae Phyo du

System.exit (1) signifie que l'application s'est terminée avec une erreur, tandis que System.exit (0) signifie que l'application s'est terminée sans aucune erreur. C'est ainsi que diverses commandes linux / unix renvoient des conditions (d'erreur) à la sortie.
iOS-Coder


13

Il y a actuellement deux situations possibles:

  1. Vous voudrez peut-être quitter l'activité
  2. Ou vous souhaitez quitter l'application

Vous pouvez quitter l'activité en utilisant le code suivant:

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

Mais cela ne tuera pas les activités sous-jacentes dans la même application. Cela minimisera simplement l'application.

Si vous souhaitez quitter l'application, utilisez le code suivant pour terminer son processus:

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

pour le développement mono, utilisez simplement

process.KillProcess(Process.MyPid());

Mypid () est votre méthode ou quoi ...... alors comment vous avez écrit Mypid ... vous devez écrire avec la méthode .....
Amitsharma

@amitsharma MyPid () est une méthode de la classe Process, qui renvoie l'identifiant de ce processus, qui peut être utilisé avec killProcess (int) et sendSignal (int, int)
Kasun

Arrêterait-il également le service d'arrière-plan et les récepteurs de diffusion ou fermera-t-il simplement l'application en toute sécurité?
Usman Rana

alors, quelle est la différence entre android.os.Process.killProcess(android.os.Process.myPid()); et process.KillProcess(Process.MyPid());?
DysaniazzZ

7

Que diriez-vous this.finishAffinity()

À partir des documents,

Terminez cette activité ainsi que toutes les activités immédiatement inférieures dans la tâche actuelle qui ont la même affinité. Ceci est généralement utilisé lorsqu'une application peut être lancée sur une autre tâche (par exemple à partir d'un ACTION_VIEW d'un type de contenu qu'il comprend) et que l'utilisateur a utilisé la navigation vers le haut pour quitter la tâche actuelle et accéder à sa propre tâche. Dans ce cas, si l'utilisateur a navigué vers le bas dans toutes les autres activités de la deuxième application, toutes doivent être supprimées de la tâche d'origine dans le cadre du changement de tâche. Notez que cette finition ne vous permet pas de fournir des résultats à l'activité précédente, et une exception sera levée si vous essayez de le faire.


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

Pour mon cas, cela m'a sauvé la vie. Merci!
Lifka

4

cela effacera la tâche (pile d'activités) et commencera une nouvelle tâche

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

Expliquez pourquoi vous avez publié ce code comme réponse et ce qu'il fait aussi.
M. Adeel Khalid

1
Bienvenue dans Stack Overflow! Bien que vous ayez peut-être résolu le problème de cet utilisateur, les réponses de code uniquement ne sont pas très utiles pour les utilisateurs qui viendront à cette question à l'avenir. Veuillez modifier votre réponse pour expliquer pourquoi votre code résout le problème d'origine.
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

mettez celui-ci dans votre onClic:

moveTaskToBack(true);
    finish()

ce qui ne va pas avec les votes négatifs. Voilà la réponse. J'ai 2 activités, la première est l'activité de connexion et la deuxième est l'activité principale .... je voulais quitter l'application dans mainactivity et je ne veux pas revenir à l'activité de connexion ... j'insère cette réponse, et maintenant je peux fermer l'application dans mainactivity.
Azizi Musa

si vous faites cela, l'application fonctionnera toujours en arrière
Mohanad Haddadin

Fonctionne très bien. Mon cas est: splashActivity lance MainActivity. Lorsque l'utilisateur appuie à nouveau sur l'application MainActivity, elle se ferme comme prévu. Tous les autres cas me ramènent à l'activité splash!
Jviaches

Eh bien, vous devriez avoir terminé l'activité de connexion dès que la connexion est terminée :) Et la réponse n'est bien sûr pas tout à fait correcte , movewTaskToBackne termine rien, elle cache simplement l'application et, finishcomme mentionné par quelqu'un d'autre, ne termine que le courant activity. Donc, il quitte l'activité actuelle et cache le reste, le cas échéant. Quoi qu'il en soit, il ne devrait pas obtenir un vote négatif juste pour cela ...
Meow Cat 2012

2

Essayez ceci lors d'un appel. Je l'utilise parfois en un clic sur un bouton.

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

Au lieu de fermer votre application, cela ouvre le tableau de bord pour donner l'impression que votre application est fermée.

lire cette question pour plus de clarté android - quitter le code de l'application


2

Utilisez this.finishAffinity (); sur ce bouton au lieu de finish (); Si cela ne fonctionne pas, vous pouvez également essayer en ajoutant android: noHistory = "true" dans votre manifeste, puis terminer votre activité en uisng finish (); ou finishAffinity ();

J'espère que cela aide....:)


2

Réalisation dans Xamarin.Android:

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

S'agit-il d'une référence à System.Environment.Exit ou Android.OS.Environment.Exit?
Moffen

2

Appelez simplement ces deux fonctions

 finish();
 moveTaskToBack(true);

Votre réponse est venue dans des messages de qualité inférieure. Veuillez fournir quelques explications même si votre code est explicite.
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);

Utilisez ce code, il est très utile et vous pouvez quitter toutes les activités.


Je l'ai fait, puis j'ai jeté le téléphone du 5ème étage, toutes les activités fermées merci
Paschalis

1

l'activité fantôme appelée avec singletop et finish () sur onCreate devrait faire l'affaire



1

Au lieu de System.exit (1) Utilisez simplement System.exit (0)


1

Si quelqu'un se demande encore, pour Xamarin.Android (dans mon cas également Monogame en cours d'exécution), la commande FinishAndRemoveTask()sur Activityfait très bien le travail!


1

dans le fragment

getActivity (). finishAndRemoveTask ();

dans l'activité

finishAndRemoveTask ();


0

utilisez simplement le code dans votre backpress

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

0

Si vous utilisez EventBus (ou vraiment toute autre bibliothèque pub / sous) dans votre application pour communiquer entre les activités, vous pouvez leur envoyer un événement explicite:

final public class KillItWithFireEvent
{
    public KillItWithFireEvent() {}

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

Le seul inconvénient est que vous avez besoin de toutes les activités pour écouter cet événement finish(). Pour cela, vous pouvez facilement créer des classes d'activité shim par héritage qui écoutent simplement cet événement et laisser les sous-classes implémenter tout le reste, puis assurez-vous que toutes vos activités héritent de cette couche supplémentaire. Les écouteurs kill pourraient même ajouter des fonctionnalités supplémentaires via des remplacements, comme éviter la mort dans certaines situations particulières.


0

Exécutez simplement les deux lignes ci-dessous lorsque vous souhaitez quitter l'application

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

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

travaillé pour moi


1
Veuillez ajouter quelques explications à votre code. De plus, il semble que d'autres réponses aient déjà couvert cela - vous devez donc également expliquer ce qui rend votre solution meilleure que les autres
Nico Haase

0

Appelez simplement ceci:

finishAffinity();

Bien que ce code puisse répondre à la question, fournir un contexte supplémentaire concernant la raison et / ou la manière dont ce code répond à la question améliore sa valeur à long terme.
Igor F.

0

Liez cette méthode à votre bouton Quitter / Quitter

public void quitGame(View view) {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAndRemoveTask();
        } else {
            finish();
        }
    }

-1

Si vous utilisez à la fois terminer et quitter votre application se fermera complètement

terminer();

System.exit (0);

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.