Comment effacer une activité spécifique de l'historique de la pile?

Supposons que j'ai une application contenant des activités appelées A, B, C, D. Maintenant, considérez A a été lancé comme activité racine et B a été lancé à partir de A et C a été lancé à partir de B et D a été lancé à partir de C. Maintenant, j'ai un bouton nommé "Supprimer" dans l'activité D. Si supposons, J'appuie sur le bouton "Supprimer" dans l'activité D, puis l'activité B et l'activité C doivent être supprimées de la pile d'historique. En appuyant sur la touche Retour de l'activité D, vous devez afficher ACTIViy A au lieu de C. Je ne sais pas comment l'implémenter. Quelqu'un peut-il m'aider pour résoudre ce problème?

  • Android / Google Plus - Impossible de partager l'image de mon fournisseur de contenu
  • Comment puis-je faire des liens à partir deHTML cliquable? (Android)
  • Le studio Android ne s'ouvre pas sur Windows
  • Comment faire de la visionneuse html par défaut de chrome sur Android
  • Le moteur de virtualisation Genymotion n'est pas trouvé / le chargement des plugins est interrompu sur Mac
  • Analyser la chaîne XML à l'aide de SAX
  • 6 Solutions collect form web for “Comment effacer une activité spécifique de l'historique de la pile?”

    Je ne suis pas sûr de pouvoir supprimer directement automatiquement les activités de l'historique, mais si vous utilisez startActivityForResult() au lieu de startActivity() , puis selon la valeur de retour de votre activité, vous pouvez ensuite finish() l'activité prédécesseur pour simuler Le comportement que vous voulez. En utilisant cette méthode dans toutes vos activités, vous pouvez avoir ce comportement en cascade de la pile d'activité pour vous permettre de passer de l'activité D à l'activité A.

    Je sais que ce n'est pas votre situation, mais à l'avenir, si vous savez avant de commencer l'activité que vous ne voulez pas que le prédécesseur reste, vous pouvez appeler finish() immédiatement après startActivity() .

    Consultez la section intitulée «Durée de vie du nouvel écran» dans Common Tasks et comment les faire dans Android

    Je suis d'accord avec @RivieraKid, mais je pense à une autre façon: lorsque vous appuyez sur "Supprimer", vous définissez un drapeau personnalisé sur true.

    Remplacez l'événement de la clé arrière:

     public void onBackPressed() { if (!remove){ super.onBackPressed(); }else{ Intent goToA = new Intent((this,ActivityA.class);); goToA.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(goToA); } } 

    Pensez-vous que cela fait ce que vous voulez?

    Bonne chance.

    RivieraKid a la meilleure réponse (et une connexion cool), mais pour l'exhaustivité, j'aimerais mentionner que vous pouvez également définir le drapeau FLAG_ACTIVITY_NO_HISTORY dans une intention, afin que l'activité nouvellement lancée n'apparaisse pas dans l'historique. Voir http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_NO_HISTORY

    Une alternative est de créer une classe pour avoir accès aux activités et les fermer. Exemple:

    Activités:

    • acte 1
    • Act2
    • Act3

    Classe de contrôle:

     public class ActivitiesControl { public static act1 vAct1 = null; public static act2 vAct2 = null; public static act3 vAct3 = null; } 

    Dans le code OnCreate de chaque activité, vous définissez: ActivitiesControl.vAct1 = this;

    Et onDestroy (): ActivitiesControl.vAct1 = null;

    Lorsque vous souhaitez détruire une activité pour l'enlever de la pileHistory, vous venez d'appeler:

    ActivitiesContro.vAct1.finish ();

    Je ne sais pas si c'est la meilleure méthode, mais c'est ce qui a fonctionné pour moi.

    Lorsque vous lancez l'application. Toutes les activités sont lancées dans la même tâche par défaut. Donc, la pile arrière ressemble à la suivante.

    Tâche: A-> B-> C-> D dans ce cas le TOP de la pile arrière pointe vers "D"

    Maintenant, si vous voulez que le TOP pointe à "A" à nouveau. Il suffit de déclarer l'attribut

     android:launchMode="singleTask" 

    Pour l'activité "A" dans votre AndroidManifest.xml

    Maintenant, lorsque vous appuyez sur le bouton "supprimer" dans l'activité "D", commencez l'activité comme d'habitude. La pile arrière est effacée de l'activité "B" et "C" et vous obtenez un démarrage propre de l'activité "A"

    Rappelez-vous que cela va fermer et détruire votre activité D de la mémoire, même si vous n'êtes pas appelé finish() explicitement dans "D"

    Je pense que cela ferait ce que vous voulez. Dans le fichier manifeste, il suffit d'ajouter l'attribut "noHistory" aux activités "B" et "C" que vous ne souhaitez pas revoir en appuyant sur le bouton arrière dans "D".

      <activity android:name="com.acme.activityA"></activity> <activity android:name="com.acme.activityB" android:noHistory="true"></activity> <activity android:name="com.acme.activityC" android:noHistory="true"></activity> <activity android:name="com.acme.activityD"></activity> 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.