web-dev-qa-db-fra.com

Comment effacer la pile d'activités Android?

J'ai une application avec plusieurs activités sur Android et je veux que l'utilisateur puisse se déconnecter en appuyant sur un bouton du menu. Le problème que j'ai est que

A) Android ne vous permet pas de terminer l'application et
B) même lorsque je renvoie l’utilisateur à la LoginActivity, il peut toujours appuyer sur back et revenir à l’activité précédente dans laquelle il était.

J'ai déjà essayé de lancer l'activité avec les deux drapeaux suivants: 

Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

J'ai aussi essayé avec chacun d'eux par eux-mêmes.

J'ai aussi essayé d'appeler finish() après startActivity(intent) pendant que je lisais une autre question StackOverflow

53
Totic

Dans votre activité de connexion, remplacez le bouton Précédent pour masquer votre application au lieu de la terminer:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK) {
        moveTaskToBack(true);
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

Veillez également à définir Android: alwaysRetainTaskState = "true" sur l'activité racine, afin qu'Android n'efface pas votre pile (y compris l'activité de connexion) après 30 minutes d'inactivité de l'utilisateur.

Ensuite, appelez simplement finish () une fois la connexion établie.

35
Tenfour04

Cela devrait être binaire OU, sinon vous écraserez le drapeau précédent.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Ainsi:

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
42
deweylewie

Selon Wakka in Suppression d'une activité de la pile d'historique ...


Ajoutez l'attribut Android:noHistory="true" à votre <activity> dans le AndroidManifest.xml comme ceci:

<activity Android:name=".MyActivity"
    Android:noHistory="true">
</activity>
31
Richard Le Mesurier

Si vous utilisez Android API 11 ou supérieur, vous pouvez utiliser le code suivant pour effacer la pile. 

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
6
matangs

Cela ne va pas effacer votre pile de retour d'activité.

Même après avoir suivi toutes les réponses ci-dessus, quand j'ai appuyé sur le bouton Retour, la dernière activité a été affichée pendant une seconde avant la fermeture de l'application.

C'est ce que j'ai fait:

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

Maintenant, mon application se ferme au dos de la presse :) sans aucun problème.

5
amalBit

La définition de Intent.FLAG_ACTIVITY_CLEAR_TOP a fonctionné pour moi dans un cas très similaire, où je n’ai pas défini le drapeau Intent.FLAG_ACTIVITY_NEW_TASK. Avez-vous essayé sans?

3
Brandon

Ce travail pour moi :)

Intent main = new Intent(this, A_Activity.class);
main.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP
    | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(main);

Intent tool = new Intent(this, B_Activity.class);
startActivity(tool);
finish();

Où A est mon activité racine par exemple 

J'ai les activités A -> B -> C -> D lorsque j'appelle l'activité de démarrage E sur la pile que j'ai maintenant A -> E

Je ne sais pas si c'est bon :) mais ça marche.

2
Dawid Drozd
Intent intent  = new Intent(this, LoginActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);        
startActivity(intent);

écrivez ceci et notez: LoginActivity doit être lancé en tant que Launcher et 

si vous écrivez des modes de lancement, les drapeaux sont écrasés, alors supprimez le launchermode et essayez, vous l'aurez sûrement

1
Anand Kumar

Essaye ça

Intent intent = new Intent(this, MainActivity.class);
intent.addFlags(
    Intent.FLAG_ACTIVITY_CLEAR_TOP | 
    Intent.FLAG_ACTIVITY_CLEAR_TASK | 
    Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
1
Raghavendra

Si nous utilisons ce code pour lancer l'activité de connexion (A):

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

L'activité doit figurer dans la pile d'activités, sinon ces drapeaux n'auront aucun effet. 

Si nous utilisons finish () dans l'activité Login (A), après le lancement de l'activité (B) (pour éviter de revenir à A depuis B), l'activité A (Login) ne sera pas dans la pile. La même chose se produit lorsque l'activité de connexion a l'attribut "noHistory".

Donc, la solution pour moi était un mélange d’autres réponses:

Ce code va dans l'activité B, pour éviter de revenir à l'activité de connexion:

@Override
public void onBackPressed() {
    moveTaskToBack(true);
    super.onBackPressed();
}

Et ce code va dans l'activité qui appelle la fonction de déconnexion:

public static void logout() {
    Intent intent = new Intent(activity, LoginMain.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}
0
Mario Velasco