Comment quitter l'application et afficher l'écran d'accueil?

196

J'ai une application où sur la page d'accueil j'ai des boutons pour naviguer dans l'application.

Sur cette page, j'ai un bouton "QUITTER" qui, lorsqu'il est cliqué, devrait amener l'utilisateur à l'écran d'accueil du téléphone où se trouve l'icône de l'application.

Comment puis je faire ça?

poojan9118
la source

Réponses:

327

La conception d'Android ne favorise pas la sortie d'une application par choix, mais la gère plutôt par le système d'exploitation. Vous pouvez afficher l'application Accueil par son intention correspondante:

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_HOME);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
ognian
la source
25
Vous pouvez même utiliser .. "moveTaskToBack (true);"
hemanth kumar
17
va-t-il affecter toutes les ressources? Parce que lorsque je quitte l'application de cette façon et après un certain temps, je clique à nouveau sur l'icône de l'application. Cela commence là où je l'ai laissé. Cela signifie que l'application fonctionnait toujours en arrière-plan.
Adil Malik
12
Activity.finish ();
hB0
11
Cela maintient votre application en arrière-plan, de sorte qu'elle ne quitte pas l'application.
Herman Schoenfeld
3
Cette réponse fera simplement apparaître l'écran d'accueil et ne quittera pas / ne fermera pas complètement l'application comme le souhaite l'OP.
Basher51
74

Peut-être que vous pouvez essayer quelque chose comme ça

Supposons que dans notre application, nous avons un certain nombre d'activités (disons dix) et que nous devons sortir directement de cette activité. Ce que nous pouvons faire est de créer une intention et d'aller à l'activité racine et de définir l'indicateur dans l'intention comme

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

aussi, ajoutez un peu comme booléen à l'intention

intent.putExtra("EXIT", true);

Ensuite, dans l'activité racine, vérifiez la valeur de booleanet en fonction de cet appel finish (), dans l' onCreate()activité racine

if (getIntent().getBooleanExtra("EXIT", false)) {
 finish();
}
Kartik Domadiya
la source
1
Ne faites rien dans onCreate pour invoquer finish.
imcaptor
2
Dans mon cas, j'ai également dû passer outre onNewIntent. Parce que intnet.getExtras () a continué d'être nul.
zznq
Et cette méthode redémarrera votre RootActivityau lieu de la reprendre à partir de la pile. Cliquez ici pour surmonter ce stackoverflow.com/a/26258455/609782
Darpan
29
System.exit(0);

C'est probablement ce que vous recherchez. Il fermera toute l'application et vous amènera à l'écran d'accueil.

Ndupza
la source
1
Cela devrait-il être une sortie en minuscules?
Carol
1
devrait être System.exit (0). Mais ce n'est pas très utile de toute façon.
superarts.org
7
System.exit (0) ne doit pas être utilisé comme conseillé par l'équipe principale d'Android.
Dinesh Venkata
2
Je pense que c'est la meilleure approche pour des circonstances exceptionnelles. Dites pour une application qui a besoin d'Internet et la connexion interrompt quelques activités dans l'application. Une boîte de dialogue d'alerte peut être affichée (sans boutons). Le bouton Précédent doit quitter l'application entière car la réentrée nécessite à nouveau la connexion / initialisation. System.exit est la seule chose qui fonctionne raisonnablement que j'ai trouvée. Je ne suis pas sûr du commentaire @ user1699548.
Herman Schoenfeld
1
Est-ce que cela tuera également tous les services liés à cette application?
bsara
25

Cela fonctionne bien pour moi.
Fermez toutes les activités précédentes comme suit:

    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    intent.putExtra("Exit me", true);
    startActivity(intent);
    finish();

Ensuite, dans la méthode MainActivity onCreate (), ajoutez ceci pour terminer le MainActivity

    setContentView(R.layout.main_layout);

    if( getIntent().getBooleanExtra("Exit me", false)){
        finish();
        return; // add this to prevent from doing unnecessary stuffs
    }
Ninja paresseux
la source
Cela ne fonctionne pas pour moi. Cela laisse mon application sans rien de visible, mais toujours en cours d'exécution. Je peux voir des fils traîner et attendre dans le débogueur qui ne feront jamais rien.
Stephen M -en grève-
23

finissez d'abord votre application en utilisant la méthode finish();

puis ajoutez les lignes ci-dessous dans onDestroy for Removing Force close

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

la source
3
n'utilisez jamais cela, car il n'a aucune chance de libérer des ressources
Jacky
1
-1 car onDestroy est exécuté chaque fois que vous quittez l'activité, pas seulement lorsque vous appuyez sur la touche Retour.
Hamzeh Soboh
5
@Jacky: et comment le fait de tuer le processus ne libère-t-il aucune ressource système?
Herman Schoenfeld
1
Pourquoi est-ce super.onDestroy()après killProcess()? cette ligne serait-elle même atteinte?
shoosh
cela ne tue-t-il pas également tous vos services?
Irshu
20

Si vous souhaitez mettre fin à une activité, vous pouvez simplement appeler finish(). C'est cependant une mauvaise pratique d'avoir un bouton de sortie sur l'écran.

Christian
la source
2
Je l'utilise pour "Vous devez mettre à jour cette application vers la dernière version", et je ne veux pas qu'ils continuent à l'utiliser. Encore une mauvaise pratique ...?
beetree
@beetree Oui. Comme toute mauvaise pratique, il y a des cas où c'est votre seule option, et vous l'utilisez parce qu'essayer de faire autre chose serait absurde. Le fait que ce soit une mauvaise pratique , par opposition à une syntaxe illégale , est qu'il est disponible pour ces quelques cas, mais vous devriez faire de votre mieux pour trouver une meilleure façon de le faire. Dans votre cas, il n'y en a pas.
Fund Monica's Lawsuit
17

En fait, certaines activités que vous ne souhaitez pas rouvrir lorsque vous appuyez sur le bouton Précédent, telles que l'activité de l'écran de démarrage, l'activité de l'écran de bienvenue, les fenêtres de confirmation. En fait, vous n'en avez pas besoin dans la pile d'activités. vous pouvez le faire en utilisant => ouvrir le fichier manifest.xml et ajouter un attribut

android: noHistory = "true"

à ces activités.

<activity
    android:name="com.example.shoppingapp.AddNewItems"
    android:label="" 
    android:noHistory="true">
</activity>

OU

Parfois, vous souhaitez fermer l'application entière en appuyant sur certains boutons Retour. Ici, la meilleure pratique consiste à ouvrir la fenêtre d'accueil au lieu de quitter l'application. Pour cela, vous devez remplacer la méthode onBackPressed (). généralement, cette méthode ouvre l'activité supérieure de la pile.

@Override
public void onBackPressed(){
Intent a = new Intent(Intent.ACTION_MAIN);
a.addCategory(Intent.CATEGORY_HOME);
a.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(a);

}

OU

Dans le bouton précédent, vous voulez quitter cette activité et vous ne voulez pas non plus l'ajouter dans la pile d'activités. appelez la méthode finish () dans la méthode onBackPressed (). cela ne fera pas fermer la totalité de l'application. il ira pour l'activité précédente dans la pile.

@Override
public void onBackPressed() {
  finish();
}
Buru
la source
16

Il n'est pas recommandé de quitter votre application Android. Voir cette question pour plus de détails.

L'utilisateur peut toujours quitter votre application via le bouton d'accueil ou dans la première activité via le bouton de retour.

Janusz
la source
3
@janusz: appuyer sur le bouton d'accueil ne quitte jamais l'application Android, au lieu de cela, il passe en arrière-plan ...
Jayesh
5

(J'ai essayé les réponses précédentes mais elles manquent sur certains points. Par exemple, si vous ne faites pas return;après avoir terminé l'activité, le code d'activité restant s'exécute. Vous devez également modifier onCreate avec return. Si vous n'exécutez pas super.onCreate () vous obtiendrez une erreur d'exécution)

Dites que vous avez MainActivityet ChildActivity.

Dans ChildActivity, ajoutez ceci:

Intent intent = new Intent(ChildActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtra("EXIT", true);
startActivity(intent);
return true;

Dans onCreate de MainActivity, ajoutez ceci:

@Override
public void onCreate(Bundle savedInstanceState) {

    mContext = getApplicationContext();

    super.onCreate(savedInstanceState);

    if (getIntent().getBooleanExtra("EXIT", false)) {
        finish();
        return;
    }
    // your current codes
    // your current codes
}
trante
la source
3

Lorsque vous appelez finish onDestroy () de cette activité sera appelée et elle reviendra à l'activité précédente dans la pile d'activités ... Donc .. pour quitter n'appelez pas finish ();

Isham
la source
3

Voici ce que j'ai fait:

SomeActivity.java

 @Override
    public void onBackPressed() {
            Intent newIntent = new Intent(this,QuitAppActivity.class);
            newIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(newIntent);
            finish();
    }

QuitAppActivity.java

@Override
protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      finish();
}

Fondamentalement, ce que vous avez fait est de supprimer toutes les activités de la pile et de lancer QuitAppActivity, ce qui terminera la tâche.

Irshu
la source
Bonne approche. Pas besoin de transmettre des valeurs via Intent.
user3144836
0

Ajouter les lignes suivantes après finish();dans onDestroy():

android.os.Process.killProcess(android.os.Process.myPid());
super.onDestroy();
Ramanathan
la source
0

J'ai essayé de quitter l'application en utilisant l'extrait de code suivant, cela a fonctionné pour moi. J'espère que cela vous aidera. j'ai fait une petite démo avec 2 activités

première activité

public class MainActivity extends Activity implements OnClickListener{
    private Button secondActivityBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        secondActivityBtn=(Button) findViewById(R.id.SecondActivityBtn);
        secondActivityBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();

        if(pref.getInt("exitApp", 0) == 1){
            editer.putInt("exitApp", 0);
            editer.commit();
            finish();
        }
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.SecondActivityBtn:
            Intent intent= new Intent(MainActivity.this, YourAnyActivity.class);
            startActivity(intent);
            break;
        default:
            break;
        }
    }
}

votre toute autre activité

public class YourAnyActivity extends Activity implements OnClickListener {
    private Button exitAppBtn;
    private SharedPreferences pref;
    private SharedPreferences.Editor editer;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_any);

        exitAppBtn = (Button) findViewById(R.id.exitAppBtn);
        exitAppBtn.setOnClickListener(this);

        pref = this.getSharedPreferences("MyPrefsFile", MODE_PRIVATE);
        editer = pref.edit();
    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.exitAppBtn:
            Intent main_intent = new Intent(YourAnyActivity.this,
                    MainActivity.class);
            main_intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            startActivity(main_intent);
            editer.putInt("exitApp",1);
            editer.commit();
            break;
        default:
            break;
        }
    }
}
Amol Sawant 96 Kuli
la source
0

Je l'ai fait en mode observateur.

Interface d'observateur

public interface Observer {
public void update(Subject subject);
}

Sujet de base

public class Subject {
private List<Observer> observers = new ArrayList<Observer>();

public void attach(Observer observer){
    observers.add(observer);
}

public void detach(Observer observer){
    observers.remove(observer);
}

protected void notifyObservers(){
    for(Observer observer : observers){
        observer.update(this);
    }
}
}

Le sujet enfant implémente la méthode de sortie

public class ApplicationSubject extends Subject {
public void exit(){
    notifyObservers();
}
}

MyApplication que votre application doit étendre

public class MyApplication extends Application {

private static ApplicationSubject applicationSubject;

public ApplicationSubject getApplicationSubject() {
            if(applicationSubject == null) applicationSubject = new ApplicationSubject();
    return applicationSubject;
}

}

Activité de base

public abstract class BaseActivity extends Activity implements Observer {

public MyApplication app;

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    app = (MyApplication) this.getApplication();
    app.getApplicationSubject().attach(this);
}

@Override
public void finish() {
    // TODO Auto-generated method stub
            app.getApplicationSubject().detach(this);
    super.finish();
}

/**
 * exit the app
 */
public void close() {
    app.getApplicationSubject().exit();
};

@Override
public void update(Subject subject) {
    // TODO Auto-generated method stub
    this.finish();
}

}

testons-le

public class ATestActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    close(); //invoke 'close'
}
}
chasseur
la source
0

si vous voulez quitter l'application mettez ce code sous votre fonction

public void yourFunction()
{
finishAffinity();   
moveTaskToBack(true);

}



//For an instance, if you want to exit an application on double click of a 
//button,then the following code can be used.
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 2) {
        // do something on back.
        From Android 16+ you can use the following:

        finishAffinity();
        moveTaskToBack(true);
    }

    return super.onKeyDown(keyCode, event);
}
Dila Gurung
la source
0

100% fonctionne très bien. c'est le code pour Quitter votre application onClick (Méthode)

    Button exit = (Button)findViewById(R.id.exitbutton);

    exit.setOnClickListener(new View.OnClickListener() {

        @Override

        public void onClick(View view) {

            finish();
            android.os.Process.killProcess(android.os.Process.myPid());
            System.exit(1);
            Toast.makeText(getApplicationContext(), "Closed Completely and Safely", Toast.LENGTH_LONG).show();

        }
    });
Vivek Akkaldevi
la source
0

Vous pouvez simplement ajouter moveTaskToBack(true)vos boutons de sortie onClickedListenerpour minimiser l'application.

J'espère que ça aide.

patel dhruval
la source
0

Peut-être que mon code peut hepls (Main_Activity.java):

    @Override
    protected void onDestroy() {
        super.onDestroy();
        this.finish();
        exit(0);
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event)  {
        switch(keyCode)    {
            case KeyEvent.KEYCODE_BACK:
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle("My application").setMessage("Keep playing?").setIcon(R.drawable.icon);
                // Go to backgroung
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { moveTaskToBack(true); }
                });
                // Exit from app calling protected void onDestroy()
                builder.setNegativeButton("CLOSE APPLICATION", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { onDestroy(); }
                });
                // Close this dialog
                builder.setNeutralButton("CANCEL", new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int which) { dialog.cancel(); }
                });
                AlertDialog dialog = builder.create();
                dialog.show();
                return true;
        }
        return false;
    }
Bokili Production
la source
-2

Si vous souhaitez quitter votre application. Ensuite, utilisez ce code dans votre événement de bouton pressé. comme:

public void onBackPressed()
{
    moveTaskToBack(true);
    android.os.Process.killProcess(android.os.Process.myPid());
    System.exit(1);
}
Pir Fahim Shah
la source