web-dev-qa-db-fra.com

Android: effacer la pile arrière

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

En A, j'utilise ce code pour ouvrir B:

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

En B, j'utilise ce code pour ouvrir C:

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

Lorsque l'utilisateur appuie sur un bouton en C, je souhaite revenir à A et vider la pile arrière (fermer B et C). Ainsi, lorsque l'utilisateur utilise le bouton de retour B et C n'apparaissent pas, j'ai essayé les solutions suivantes:

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

Mais B et C continuent d'apparaître si j'utilise le bouton Précédent lorsque je reprends l'activité A. Comment puis-je éviter cela?

288
Martin

Essayez d’ajouter FLAG_ACTIVITY_NEW_TASK comme décrit dans la documentation de FLAG_ACTIVITY_CLEAR_TOP :

Ce mode de lancement peut également être utilisé pour bon effet en conjonction avec FLAG_ACTIVITY_NEW_TASK: si utilisé pour démarrer l'activité racine d'une tâche, il apportera tout en cours d'exécution exemple de cette tâche au avant-plan, puis effacez-le à sa état racine. Ceci est particulièrement utile, par exemple, lors du lancement d'un fichier activité de la notification directeur.

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
394
Jake Basile
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
134
diesel

Qu'en est-il de l'ajout d'un fichier de manifestes pour une activité connexe:

Android:noHistory="true"

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

72
cirrus

Cela me dérange depuis longtemps. Finalement, j'ai résolu le problème en faisant ceci:

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);
53
Geng Jiawen
  1. Ajoutez Android:launchMode="singleTop" à l'élément activity de votre manifeste pour l'activité A
  2. Ensuite, utilisez 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 superposent sont effacées de sorte que A soit en haut. Une nouvelle pile de retour est créée avec A à la racine et l'utilisation de singleTop vous garantit de ne lancer que A une fois (car A est maintenant en haut à cause de ..._CLEAR_TOP).

28
Joseph Earl

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

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

Assurez-vous de définir taskAffinity dans le manifeste sur un nom de package unique pour ce groupe d'activités.

Voir pour plus d'infos:
http://developer.Android.com/reference/Android/support/v4/app/ActivityCompat.html#finishAffinity%28Android.app.Activity%29

25
Daniel Schuler

Essayez d'utiliser

intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);

et pas

intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
14

Si votre application possède au minimum la version 16 de sdk, vous pouvez utiliser finishAffinity ()

Terminez cette activité ainsi que toutes les activités immédiatement inférieures à celle-ci dans la tâche en cours ayant la même affinité. 

C’est un travail pour moiDans l’écran de paiement supérieur, supprimez toutes les activités de pile arrière,

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

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

8
Jaydeep purohit

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

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

6
baswaraj

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>
6
Richard Le Mesurier

utilisez ce code pour démarrer une nouvelle activité et fermez ou détruisez toute autre pile d'activités ou backstack ...

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

J'ai trouvé les réponses ici un peu trompeuses parce que le code de la question initiale semble bien fonctionner pour moi?

Avec A comme activité racine, le démarrer à partir de B ou C uniquement avec FLAG_ACTIVITY_CLEAR_TOP supprime B et C de la pile arrière.

3
ianjoyner

En kotlin, c'est presque pareil à Java. Seulement | symbole est remplacé par ou texte . Donc, il est écrit comme-

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
3
Exigente05
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.
3
Firzan Shaikh

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.

2
Ashish Saini

J'ai trouvé une solution intéressante qui pourrait aider. Je l'ai fait dans ma méthode onBackPressed().

finishAffinity();
finish();

FinishAffinity supprime la connexion de l'activité existante à sa pile. Et puis finir vous aide à sortir de cette activité. Ce qui finira par quitter l'application.

2
Sujit Royal

Il me semble que vous devez démarrer Activity C à partir de Activity B en utilisant startActivityForResult(). Lorsque vous cliquez sur un bouton dans Activity C, appelez setResult(RESULT_OK) et finish() pour que Activity C soit terminé. Dans Activity B, vous pourriez demander à la onActivityResult() de répondre en appelant également finish() sur elle-même, puis vous serez ramené à Activity A.

2
Maximus

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

1
Abhijeet

J'ai essayé toutes les solutions et aucune ne fonctionnait individuellement pour moi ..__ Ma solution est la suivante:

Déclarez Activity A en tant que SingleTop en utilisant [Android:launchMode="singleTop"] dans le manifeste Android.

Ajoutez maintenant les indicateurs suivants lors du lancement de A depuis n’importe où. Cela va effacer 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();
1
Tarun

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

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

1
Vipin Yadav

En plus de FLAG_ACTIVITY_CLEAR_TOP, vous pouvez également essayer d'ajouter Intent.FLAG_ACTIVITY_SINGLE_TOP:

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

0
binnyb

En manifeste

Android:launchMode="singleTask"

et

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

Ajouter AUCUN indicateur d'historique dans l'intention.

Dans l'activité B, démarrez 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();
0
Arun Sharma
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
0
Mujeeb Rahaman T

Voici comment j'ai résolu le problème:

private boolean clearHistoryBackStack = true;

@Override
public final void finish() {
    super.finish();

    if(clearHistoryBackStack)
        finishAffinity();
}
0
user2830808

Ce code fonctionne pour moi en kotlin:

 val intent = Intent(this, MainActivity::class.Java)
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_CLEAR_TASK or Intent.FLAG_ACTIVITY_NEW_TASK)
 startActivity(intent)
 finish()
0
Shohan Ahmed Sijan

Soit ajouter ceci à vos Activity B et Activity C

Android:noHistory="true"

ou OverrideonBackPressed pour éviter d’appuyer sur une return.

@Override
public void onBackPressed() {
   return;
}
0
Renjith JR

Le code donné fonctionne correctement. J'ai essayé dans l'échantillon du 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 l'indicateur, FLAG_ACTIVITY_CLEAR_TOP

0
Sathesh

Exemple Kotlin:

      val intent = Intent(this@LoginActivity, MainActivity::class.Java)
      intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP or Intent.FLAG_ACTIVITY_NEW_TASK
      startActivity(intent)
      finish()
0
stevyhacker

j'ai appelé activity_name.this.finish() après avoir commencé une nouvelle intention et cela a fonctionné pour moi.

I tried "FLAG_ACTIVITY_CLEAR_TOP" and "FLAG_ACTIVITY_NEW_TASK"

Mais cela ne fonctionnera pas pour moi ... Je ne suggère pas cette solution pour une utilisation, mais si le paramètre flag ne fonctionnera pas pour vous, vous pourrez l'essayer ..

0
Swap-IOS-Android

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

Utilisez la méthode setFlags () pour dégager le dos de toutes les activités fermées et démarrez votreActvité 

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