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?
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
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
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.
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);
Android:launchMode="singleTop"
à l'élément activity de votre manifeste pour l'activité Aintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
et intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
lors du démarrage de l'activité ACela 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
).
À 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
Essayez d'utiliser
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
et pas
intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
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
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();
Utilisez finishAffinity (); dans la tâche C lors du démarrage de la tâche A pour effacer les activités de pile.
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>
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);
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.
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)
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, veuillez consulter this documentation.
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.
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
.
logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
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();
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);
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);
En manifeste
Android:launchMode="singleTask"
et
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
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();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
Voici comment j'ai résolu le problème:
private boolean clearHistoryBackStack = true;
@Override
public final void finish() {
super.finish();
if(clearHistoryBackStack)
finishAffinity();
}
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()
Soit ajouter ceci à vos Activity B
et Activity C
Android:noHistory="true"
ou Override
onBackPressed
pour éviter d’appuyer sur une return
.
@Override
public void onBackPressed() {
return;
}
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
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()
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 ..
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();
}
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);