Est-il possible de démarrer une activité sur la pile, en effaçant tout l'historique avant elle?
La situation
J'ai une pile d'activités qui va soit A-> B-> C ou B-> C (l'écran A sélectionne le jeton des utilisateurs, mais de nombreux utilisateurs n'ont qu'un seul jeton).
Dans l'écran C, l'utilisateur peut effectuer une action qui rend l'écran B invalide, de sorte que l'application souhaite les amener à l'écran A, qu'il soit déjà dans la pile ou non. L'écran A devrait alors être le seul élément de la pile dans mon application.
Remarques
Il existe de nombreuses autres questions similaires, mais je n'ai rien trouvé qui réponde à cette question exacte. J'ai essayé d'appeler getParent().finish()
- cela entraîne toujours une exception de pointeur nul. FLAG_ACTIVITY_CLEAR_TOP
ne fonctionne que si l'activité est déjà sur la pile.
la source
Cas 1: Seulement deux activités A et B:
Ici, le flux d'activité est A-> B.En cliquant sur le bouton de retour de B, nous devons fermer l'application, puis lors du démarrage de l'activité B à partir de A, appelez simplement finish (), cela empêchera Android de stocker l'activité A dans le Backstack.eg pour l'activité A est Écran d'application de dépôt / Splash.
Cas 2: Plus de deux activités:
S'il y a un flux comme A-> B-> C-> D-> B et en cliquant sur le bouton de retour dans l'activité B en venant de l'activité D. Dans ce cas, nous devrions utiliser.
Ici, l'activité B sera démarrée à partir du backstack plutôt que d'une nouvelle instance en raison de Intent.FLAG_ACTIVITY_CLEAR_TOP et Intent.FLAG_ACTIVITY_NEW_TASK efface la pile et en fait la première. Ainsi, lorsque nous appuierons sur le bouton de retour, l'application entière sera terminée.
la source
Avec la nouvelle version d'Android> = utilisation de l'API 16
finishAffinity()
convient à> = API 16.
la source
J'ai aussi passé quelques heures là-dessus ... et je suis d'accord pour dire que FLAG_ACTIVITY_CLEAR_TOP ressemble à ce que vous voudriez: effacer toute la pile, à l'exception de l'activité en cours de lancement, donc le bouton Précédent quitte l'application. Pourtant, comme Mike Repass l'a mentionné, FLAG_ACTIVITY_CLEAR_TOP ne fonctionne que lorsque l'activité que vous lancez est déjà dans la pile; quand l'activité n'est pas là, le drapeau ne fait rien.
Que faire? Placez l'activité en cours de lancement dans la pile avec FLAG_ACTIVITY_NEW_TASK, ce qui fait de cette activité le début d'une nouvelle tâche sur la pile d'historique. Ajoutez ensuite l'indicateur FLAG_ACTIVITY_CLEAR_TOP.
Maintenant, lorsque FLAG_ACTIVITY_CLEAR_TOP va chercher la nouvelle activité dans la pile, elle sera là et sera relevée avant que tout le reste ne soit effacé.
Voici ma fonction de déconnexion; le paramètre View est le bouton auquel la fonction est attachée.
la source
Vous ne devez pas changer la pile. Le bouton de retour Android devrait fonctionner comme dans un navigateur Web.
Je peux penser à un moyen de le faire, mais c'est tout un hack.
Faites vos activités
singleTask
en l'ajoutant à l'AndroidManifest
exemple:Prolongez
Application
ce qui détiendra la logique de l'endroit où aller.Exemple:
De A à B:
De B à C:
En C:
et manipulez le bouton de retour à
pop()
partir de la pile.Encore une fois, vous ne devriez pas faire ça :)
la source
Application
prend leurs instances, le système d'exploitation ne sera pas en mesure de libérer la RAM restante des activités détruites.Immédiatement après avoir démarré une nouvelle activité, à l'aide de
startActivity
, assurez-vous d'appelerfinish()
afin que l'activité en cours ne soit pas empilée derrière la nouvelle.la source
Essaye ça:
la source
Kotlin réutilisable avancé:
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 prévoyez de l'utiliser régulièrement, 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
la source
Essayez le code ci-dessous,
la source
Pour moi, aucune des méthodes ci-dessus ne fonctionne.
Faites simplement ceci pour effacer toutes les activités précédentes :
la source
Parfois, votre émulateur Android peut ne pas connecter l'outil DDMS eclipse et demander à adb de démarrer manuellement. Dans ce cas, vous pouvez démarrer ou arrêter l'adb à l'aide de l'invite de commande.
la source
J'ai trouvé un hack trop simple, il suffit d'ajouter ceci
AndroidManifest
comme: -le
android:noHistory
va effacer votre activité indésirable de la pile.la source