Dans Android, j'ai quelques activités, disons A, B, C.
Dans 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 veux revenir à A et effacer la pile arrière (fermer à la fois B et C). Donc, lorsque l'utilisateur utilise le bouton de 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 apparaissent toujours si j'utilise le bouton de retour lorsque je suis de retour dans l'activité A. Comment puis-je éviter cela?
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_NEW_TASK);
la source
CLEAR_TOP
drapeau - cette combinaison est la SEULE qui a complètement effacé la pile entière et fait de la nouvelle activité la seule dans l'application. Je vous remercie!Qu'en est-il de l'ajout d'un fichier de manifestes pour une activité connexe:
à la définition d'activité de B et C? Ils ne seront pas ajoutés au backstack. Je ne sais pas si c'est ce que vous voulez.
la source
Cela me dérange depuis longtemps. Enfin, je l'ai résolu en faisant ceci:
En fragment, utilisez:
Dans Activity, utilisez (ajoutez un indicateur d'intention de plus
Intent.FLAG_ACTIVITY_CLEAR_TASK
par rapport au fragment):la source
android:launchMode="singleTop"
à l'élément d'activité dans votre manifeste pour l'activité Aintent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
etintent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
au début de l'activité ACela signifie que lorsque l'activité A est lancée, toutes les tâches au-dessus d'elle sont effacées afin que A soit en haut. Une nouvelle pile arrière est créée avec A à la racine, et l'utilisation
singleTop
garantit que vous ne lancez jamais A une seule fois (puisque A est maintenant en haut à cause de..._CLEAR_TOP
).la source
À 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 sur 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
la source
Essayez d'utiliser
et pas
la source
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 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 activités de back-stack,
http://developer.android.com/reference/android/app/Activity.html#finishAffinity%28%29
la source
Selon Wakka dans Suppression d'une activité de la pile d'historique ...
Ajouter
android:noHistory="true"
attribut à votre<activity>
dans laAndroidManifest.xml
présente comme suit:la source
Pour de futures recherches, essayez ce code.
la source
Utilisez finishAffinity (); dans la tâche C lors du démarrage de la tâche A pour effacer les activités de backstack.
la source
Utilisez ce code pour démarrer une nouvelle activité et fermez ou détruisez toute autre pile d'activité ou pile arrière.
la source
la source
J'ai trouvé une solution intéressante qui pourrait aider. Je l'ai fait dans ma
onBackPressed()
méthode.FinishAffinity
supprime la connexion de l'activité existante à sa pile. Et puis terminer vous aide à quitter cette activité. Ce qui finira par quitter l'application.la source
J'ai trouvé les réponses ici un peu trompeuses car le code de la question d'origine semble bien fonctionner pour moi?
Avec A étant l'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.
la source
En kotlin, c'est presque la même chose que java. Uniquement | le symbole est remplacé par ou texte. Donc, c'est écrit comme-
la source
J'ai essayé toutes les solutions et aucune ne fonctionnait individuellement pour moi. Ma solution est:
Déclarez
Activity A
commeSingleTop
en utilisant[android:launchMode="singleTop"]
dans le manifeste Android.Ajoutez maintenant les drapeaux suivants lors du lancement
A
de n'importe où. Cela effacera la pile.la source
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.
la source
Il me semble que vous devez commencer à
Activity C
partir àActivity B
l'aidestartActivityForResult()
. Lorsque vous cliquez sur un boutonActivity C
, appelezsetResult(RESULT_OK)
etfinish()
ainsiActivity C
se termine. DansActivity B
, vous pourriez avoir laonActivityResult()
réponse en vous invoquant égalementfinish()
, et vous seriez alors ramené àActivity A
.la source
logout.addFlags (Intent.FLAG_ACTIVITY_CLEAR_TASK); logout.addFlags (Intent.FLAG_ACTIVITY_NEW_TASK);
la source
Vous pouvez utiliser cet exemple pour appeler votre
Activity A
deActivity C
Intent loout = new Intent(context, LoginActivity.class); loout.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); context.startActivity(loout);
la source
pour moi l'ajout a
Intent.FLAG_ACTIVITY_CLEAR_TASK
résolu le problèmela source
Kotlin avancé et réutilisable:
Vous pouvez définir le drapeau directement en utilisant la méthode setter. Dans Kotlin
or
est le remplacement de Java au niveau du bit ou|
.Si vous l'utilisez plusieurs fois, créez une fonction d'extension d'intention
Vous pouvez ensuite appeler directement cette fonction avant de démarrer l'intention
Si vous avez besoin d'ajouter des indicateurs supplémentaires dans d'autres situations, ajoutez un paramètre facultatif à la fonction d'extension.
la source
De plus
FLAG_ACTIVITY_CLEAR_TOP
, vous pouvez également essayer d'ajouterIntent.FLAG_ACTIVITY_SINGLE_TOP
:intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
la source
Le code donné fonctionne correctement. J'ai essayé dans l'exemple de cycle de vie d'application.
Je n'ai pas eu B et C dans la pile arrière après avoir commencé l'activité A avec l'indicateur FLAG_ACTIVITY_CLEAR_TOP
la source
J'ai appelé
activity_name.this.finish()
après avoir commencé une nouvelle intention et cela a fonctionné pour moi.Mais cela ne fonctionnera pas pour moi ... Je ne suggère pas cette solution, mais si la définition du drapeau ne fonctionne pas pour vous, vous pouvez essayer ceci .. Mais je recommande toujours de ne pas l'utiliser
la source
Ajoutez AUCUN indicateur d'historique dans l'intention.
Dans l'activité B, démarrez l'activité C comme ci-dessous >>>>>>
la source
En manifeste
et
la source
Soit ajoutez ceci à votre
Activity B
etActivity C
ou
Override
onBackPressed
fonction pour éviter d'appuyer à nouveau avec areturn
.la source
Utilisez la méthode setFlags () pour effacer l'arrière ouvert toutes les activités fermer et démarrer votre activité
la source