Comment effacer la pile Android d'activités?

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

A) Android ne vous permet pas de mettre fin à la demande et
B) même si je renvoie l'utilisateur à la LoginActivity , ils peuvent toujours appuyer de nouveau et revenir à l'activité précédente dans laquelle ils se trouvaient.

  • Android: Comment puis-je forcer la mise à jour de tous les widgets d'un type particulier?
  • Android Robotium NoClassDefFoundError
  • Quelle est la configuration de projet appropriée pour l'aperçu du développeur N?
  • Appcompat v7 n'est pas lancé dans le projet
  • Comment ne pas afficher l'écran du téléphone tout le temps lors d'un appel?
  • Vue d'ensemble de la liste d'affichage Android
  • 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 également essayé avec chacun d'eux par eux-mêmes.

    J'ai également essayé d'appeler finish() après startActivity(intent) lorsque j'ai lu dans une autre question StackOverflow.

  • Extensions OpenGL disponibles sur différents appareils Android
  • Masquer la vue en-tête dans ListView
  • Est-il possible de créer une image par programmation sur Java, Android?
  • "GoogleApiClient n'est pas encore connecté" dans l'application Cast
  • Android - java.lang.IndexOutOfBoundsException: Position de l'élément 0 (0) invalide. Nombre d'éléments: 0
  • Quelle est la meilleure façon de mettre en œuvre des relations multiples à plusieurs en utilisant ORMLite?
  • 10 Solutions collect form web for “Comment effacer la pile Android d'activités?”

    Dans votre activité de connexion, annulez le bouton de retour, de sorte qu'il cache votre application au lieu de terminer l'activité:

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

    Assurez-vous également de définir Android: alwaysRetainTaskState = "true" sur l'activité racine, donc Android ne supprime pas votre pile (y compris l'activité de connexion) après 30 minutes d'inactivité de l'utilisateur.

    Ensuite, il suffit d'appeler finish () lorsqu'il existe une connexion réussie.

    Cela devrait être bit à ordre OR'd ou vous finirez par écraser 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); 

    Selon Wakka dans Supprimer une activité de la pile d'historique …


    Ajoutez android:noHistory="true" attribut android:noHistory="true" à votre <activity> dans AndroidManifest.xml comme ceci:

     <activity android:name=".MyActivity" android:noHistory="true"> </activity> 

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

     intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 

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

    Même après avoir suivi toute la réponse ci-dessus, lorsque j'ai appuyé sur le bouton Précédent, il a montré la dernière activité pendant une seconde avant de fermer 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 sort sur la presse arrière 🙂 sans tracas.

    Setting Intent.FLAG_ACTIVITY_CLEAR_TOP a fonctionné pour moi dans un cas très similaire, où je n'ai pas défini l'indicateur Intent.FLAG_ACTIVITY_NEW_TASK . Avez-vous essayé sans?

    Cela fonctionne 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 des activités A -> B -> C -> D lorsque j'appelle l'activité de début E sur la pile J'ai maintenant A -> E

    Je ne sais pas si c'est bon 🙂 mais fonctionne.

     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 premier comme Lanceur et

    Si vous écrivez des modes de lanceur, les drapeaux sont remplacés par leur but, alors supprimez le mode de launchermode et essayez de le récupérer

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

    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é devrait être dans la pile d'activités, sinon ce drapeau n'aura aucun effet.

    Si nous utilisons finish () dans l'activité de connexion (A), après l'activité de lancement (B) (pour éviter de revenir à A de B), l'activité A (Connexion) ne sera pas dans la pile. Il en va de même exactement lorsque l'activité de connexion a "noHistory" comme attribut.

    Donc, la solution pour moi était une combinaison d'autres réponses:

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

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

    Et ce code entre 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); } 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.