Android: effacer la stack arrière

Dans Android, j’ai des activités, disons A, B, C.

Dans AI, utilisez ce code pour ouvrir B:

Intent intent = new Intent(this, B.class); startActivity(intent); 

Dans BI, utilisez ce code pour ouvrir C:

 Intent intent = new Intent(this, C.class); startActivity(intent); 

Lorsque l’utilisateur appuie sur un bouton du CI, il souhaite revenir à A et effacer la stack arrière (fermez B et C). Donc, lorsque l’utilisateur utilise le bouton de retour B et C ne s’affiche pas, j’ai essayé les éléments suivants:

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

Mais B et C apparaissent toujours si j’utilise le bouton arrière quand je suis de retour dans l’activité A. Comment puis-je éviter cela?

Essayez d’append FLAG_ACTIVITY_NEW_TASK comme décrit dans les documents pour FLAG_ACTIVITY_CLEAR_TOP :

Ce mode de lancement peut également être utilisé conjointement avec FLAG_ACTIVITY_NEW_TASK: s’il est utilisé pour démarrer l’activité racine d’une tâche, il met au premier plan toute instance en cours d’exécution de cette tâche, puis la désactive à son état racine. Cela est particulièrement utile, par exemple, lors du lancement d’une activité à partir du gestionnaire de notifications.

Donc, votre code pour lancer A serait:

 Intent intent = new Intent(this, A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); // call this to finish the current activity 
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

Qu’en est-il de l’ajout dans le fichier de manifestes pour l’activité associée:

 android:noHistory="true" 

à la définition de l’activité de B et C? Ils ne seront pas ajoutés au backstack. Je ne sais pas si c’est ce que vous voulez.

Cela me dérange longtemps. Finalement, je me suis débrouillé pour cela:

En fragment, utilisez:

 Intent intent = new Intent(view.getContext(), A.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); 

Dans Activity, utilisez (ajoutez un autre indicateur d’intention Intent.FLAG_ACTIVITY_CLEAR_TASK par rapport à fragment):

 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. Ajouter android:launchMode="singleTop" à l’élément d’activité dans votre manifeste pour l’activité A
  2. Utilisez ensuite intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP) et intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) lors du démarrage de l’activité A

Cela signifie que lorsque l’Activité A est lancée, toutes les tâches au-dessus sont effacées pour que A soit en haut. Une nouvelle stack arrière est créée avec A à la racine, et l’utilisation de singleTop vous permet de ne lancer qu’une seule fois A (car A est maintenant en haut à cause de ..._CLEAR_TOP ).

À partir de l’API 16 (Jelly Bean), vous pouvez simplement appeler finishAffinity() .

Maintenant, vous pouvez également appeler ActivityCompat.finishAffinity(Activity activity) avec la bibliothèque de compatibilité.

Veillez à définir taskAffinity dans le manifeste sous un nom de package unique pour ce groupe d’activités.

Voir pour plus d’informations:
http://developer.android.com/reference/android/support/v4/app/ActivityCompat.html#finishAffinity%28android.app.Activity%29

Essayez d’utiliser

 intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

et pas

 intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); 

Pour des recherches futures, essayez ce code.

 Intent intent = new Intent(context, LoginActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); 

Selon Wakka dans Suppression d’une activité de la stack d’historique …


Ajouter android:noHistory="true" atsortingbut à votre dans le AndroidManifest.xml comme ceci:

    

Si votre application a au minimum la version 16 de SDK, vous pouvez utiliser finishAffinity ()

Terminez cette activité ainsi que toutes les activités immédiatement au-dessous dans la tâche en cours qui ont la même affinité.

C’est un travail pour moi Dans l’écran Top Payment, supprimez toutes les activités de back-stack,

  @Override public void onBackPressed() { finishAffinity(); startActivity(new Intent(PaymentDoneActivity.this,Home.class)); } 

http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29

Utilisez finishAffinity (); dans la tâche C lors du démarrage de la tâche A pour effacer les activités de secours.

utilisez ce code pour démarrer une nouvelle activité et fermer ou détruire toute autre stack ou sature arrière …

 Intent intent = new Intent(this, MainActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

J’ai trouvé les réponses ici un peu trompeuses car le code dans la question initiale semble fonctionner correctement pour moi?

Avec A étant l’activité racine, le démarrage à partir de B ou C uniquement avec FLAG_ACTIVITY_CLEAR_TOP supprime B et C de la stack arrière.

 Use finishAffinity() to clear all backstack with existing one. Suppose, Activities A, B and C are in stack, and finishAffinity(); is called in Activity C, - Activity B will be finished / removing from stack. - Activity A will be finished / removing from stack. - Activity C will finished / removing from stack. 

Intent.FLAG_ACTIVITY_CLEAR_TOP ne fonctionnera pas dans ce cas. Veuillez utiliser (Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK)

Pour plus de détails, consultez cette documentation.

Il me semble que vous devez démarrer l’ Activity C partir de l’ Activity B en utilisant startActivityForResult() . Lorsque vous cliquez sur un bouton dans l’ Activity C , appelez setResult(RESULT_OK) et finish() pour que l’ Activity C soit terminée. Dans l’ Activity B , vous pouvez faire en onActivityResult() réponde également en appelant finish() sur lui-même, puis vous retournez à l’ Activity A

logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);

Vous pouvez utiliser cet exemple pour appeler votre Activity A partir de l’ Activity C

Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);

J’ai essayé toutes les solutions et aucune n’a fonctionné individuellement pour moi. Ma solution est la suivante:

Déclarez l’ Activity A comme SingleTop en utilisant [android:launchMode="singleTop"] dans le manifeste Android.

Maintenant, ajoutez les indicateurs suivants lors du lancement de A depuis n’importe où. Cela effacera la stack.

 Intent in = new Intent(mContext, A.class); in.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK ); startActivity(in); finish(); 

Outre FLAG_ACTIVITY_CLEAR_TOP , vous pouvez également append Intent.FLAG_ACTIVITY_SINGLE_TOP :

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

Le code donné fonctionne correctement. J’ai essayé dans l’échantillon de cycle de vie d’application.

Je n’ai pas B et C dans la stack arrière après le démarrage de l’activité A avec un indicateur, FLAG_ACTIVITY_CLEAR_TOP

J’ai appelé activity_name.this.finish() après avoir lancé une nouvelle intention et cela a fonctionné pour moi.

 I sortinged "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK" 

Mais ça ne marchera pas pour moi … Je ne propose pas cette solution pour l’utilisation, mais si le paramétrage du drapeau ne fonctionne pas pour vous, vous ne pouvez pas essayer ceci.

Ajouter NO Historique Flag dans l’intention.

Dans l’activité B, lancez l’activité C comme ci-dessous >>>>>>

 Intent intent = new Intent(this, C.class); intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); startActivity(intent); finish(); 

En manifeste

 android:launchMode="singleTask" 

et

 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); startActivity(intent); 

Ajoutez ceci à votre Activity B et à votre Activity C

 android:noHistory="true" 

ou Override fonction onBackPressed pour éviter de revenir en arrière avec un return .

 @Override public void onBackPressed() { return; } 

Utilisez la méthode setFlags () pour effacer le côté ouvert de toutes les activités et fermez votre activité

 Intent intent = new Intent(getApplicationContext(), yourActivity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

Cela a fonctionné pour moi avec onBackPressed:

 public void onBackPressed() { Intent intent = new Intent(ImageUploadActivity.this, InputDataActivity.class); Intent myIntent = new Intent(this, ImageUploadActivity.class); myIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); finish(); } 

C’est une réponse vraiment ancienne et je n’ai pas vraiment trouvé de solution appropriée, dans le seul but d’effacer le backStack, j’ai décidé de créer ma propre backstack, qui n’est même pas une stack tbh, mais elle n’a pas être, puisque nous voulons tout effacer de toute façon;

Il y a une surcharge de handlind le backstack à chaque fois, mais cela m’a donné le contrôle dont j’avais besoin;


Déclarez d’abord une liste publique statique des activités (ou des fragments, tout ce dont vous avez besoin);

 public static ArrayList  backStack = new ArrayList<>(); 

Et dans la méthode onCreate de toutes les autres activités:

 MainActivity.backStack.add(this); 

Et enfin, lorsque vous voulez effacer le problème, appelez simplement:

 public static void killBackStack () { for (Activity ac : backStack) { if (ac != null) ac.finish(); } } 
 Intent intent = new Intent(this, A.class); startActivity(intent); finish();