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?

Jus de citron
la source
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); 
Fayaz
la source
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);

                }
            });
Anchit Mittal
la source
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!

Shreshth Kharbanda
la source
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);
}
Pir Fahim Shah
la source
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
la source
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
17

C'est bien trop facile. UtilisationSystem.exit(0);

Amon Olimov
la source
2
Hahahah. Pas vraiment trop facile
TheRealChx101
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());
Kasun
la source
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.

Akeshwar Jha
la source
6
android.os.Process.killProcess(android.os.Process.myPid());
Kathir
la source
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);
Mahmood Ali
la source
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);
    }
azéem khan
la source
2

mettez celui-ci dans votre onClic:

moveTaskToBack(true);
    finish()
Stan Malcolm
la source
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

Rishiraj Purohit
la source
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....:)

Yesha Shah
la source
2

Réalisation dans Xamarin.Android:

    public override void OnBackPressed()
    {
        MoveTaskToBack(true);
        Process.KillProcess(Process.MyPid());
        Environment.Exit(1);
    }
GONeale
la source
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);
jeunes
la source
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.

Abdul Kadir
la source
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

Jésus
la source
1

Cela fonctionne en utilisant uniquement moveTaskToBack(true);

user3856297
la source
1

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

Kaze Tdr
la source
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!

Konrad
la source
1

dans le fragment

getActivity (). finishAndRemoveTask ();

dans l'activité

finishAndRemoveTask ();

Rodrigo Givisiez
la source
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);
Sayooj
la source
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.

Grzegorz Adam Hankiewicz
la source
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);
Hassnain Jamil
la source
0
finish();
 finishAffinity();
 System.exit(0);

travaillé pour moi

prabhu
la source
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();
Muhammad Naveed
la source
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();
        }
    }
Sihat Afnan
la source
-1

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

terminer();

System.exit (0);

Abdullah alkış
la source