android flag_activity_clear_top - Android: Effacer la pile arrière




15 Answers

Essayez d'ajouter FLAG_ACTIVITY_NEW_TASK comme décrit dans les documents FLAG_ACTIVITY_CLEAR_TOP à FLAG_ACTIVITY_CLEAR_TOP :

Ce mode de lancement peut également être utilisé avec FLAG_ACTIVITY_NEW_TASK: s'il est utilisé pour démarrer l'activité racine d'une tâche, il mettra au premier plan toute instance en cours d'exécution de cette tâche, puis l'effacera à 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
launchmode back

Dans Android, j'ai quelques 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 dans CI, vous voulez revenir à A et effacer la pile arrière (fermer à la fois B et C). Donc, lorsque l'utilisateur utilise le bouton retour B et C ne s'affiche pas, j'ai essayé ce qui suit:

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

Mais B et C sont toujours visibles si j'utilise le bouton retour quand je suis de retour dans l'activité A. Comment puis-je éviter cela?




Qu'en est-il de l'ajout dans le fichier des manifestes pour une activité connexe:

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 tu veux.




  1. Ajouter android:launchMode="singleTop" à l'élément d'activité dans votre manifeste pour l'activité A
  2. Ensuite, utilisez les 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 qui s'y trouvent sont effacées afin que A soit en haut. Une nouvelle pile arrière est créée avec A à la racine, et l'utilisation de singleTop garantit que vous ne lancez qu'une seule fois A (puisque A est maintenant au top en raison de ..._CLEAR_TOP ).




Essayez d'utiliser

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

et pas

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);



Si votre application a une version minimum de sdk 16, vous pouvez utiliser finishAffinity ()

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

Cela fonctionne pour moi Dans l'écran Top Payment, supprimez toutes les activations 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




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

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

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



utiliser ce code pour lancer une nouvelle activité et fermer ou détruire toute autre pile d'acivités ou satack arrière ...

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



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, veuillez consulter this documentation.




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




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

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

Maintenant, ajoutez les drapeaux suivants lors du lancement de A partir de n'importe où. Cela effacera la pile.

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



Le code donné fonctionne correctement. J'ai essayé dans l'exemple de cycle de vie de l'application.

Je n'ai pas B et C dans la pile arrière après avoir démarré l'activité A avec le flag, FLAG_ACTIVITY_CLEAR_TOP




Ajouter l'indicateur NO History 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();



Ajoutez ceci à votre Activity B et votre Activity C

android:noHistory="true"

ou Override onBackPressed fonction pour éviter le retour de pression avec un return .

@Override
public void onBackPressed() {
   return;
}



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



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



Related