Mon application affiche une activité d'inscription la première fois que l'utilisateur exécute l'application, ressemble à:
- ActivitySplashScreen (bienvenue dans le jeu, ouvrir un compte?)
- ActivitySplashScreenSignUp (super, remplissez cette info)
- ActivityGameMain (écran principal du jeu)
les activités se lancent donc exactement dans cet ordre, lorsque l'utilisateur clique sur un bouton sur chaque écran.
Lorsque l'utilisateur passe de l'activité # 2 à # 3, est-il possible d'effacer complètement # 1 et # 2 de la pile d'historique? Je voudrais que si l'utilisateur est au n ° 3 et appuie sur le bouton de retour, il passe simplement à l'écran d'accueil, au lieu de revenir à l'écran de démarrage.
Je pense que je peux accomplir cela avec des tâches (c'est-à-dire commencer une nouvelle tâche sur # 3) mais je voulais voir s'il y avait une méthode plus simple,
Merci
Réponses:
Vous pouvez y parvenir en définissant l'
android:noHistory
attribut sur"true"
dans les<activity>
entrées pertinentes de votreAndroidManifest.xml
fichier. Par exemple:la source
FLAG_ACTIVITY_NO_HISTORY
.android:noHistory="true"
Vous pouvez utiliser le transfert pour supprimer l'activité précédente de la pile d'activités lors du lancement de la suivante. Il y a un exemple de cela dans l'APIDemos , mais en gros tout ce que vous faites, c'est appeler
finish()
immédiatement après avoir appeléstartActivity()
.la source
FLAG_ACTIVITY_CLEAR_TOP
ne fonctionnera pas car C n'est pas déjà dans la pile arrière.Oui, jetez un œil à Intent.FLAG_ACTIVITY_NO_HISTORY .
la source
android:noHistory="true"
dans le manifeste.intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY)
pour définir ce drapeau.Ce n'est probablement pas le moyen idéal de le faire. Si quelqu'un a un meilleur moyen, je serai impatient de le mettre en œuvre. Voici comment j'ai accompli cette tâche spécifique avec le sdk pré-version-11.
dans chaque classe que vous souhaitez quitter quand il est temps clair, vous devez le faire:
alors celui qui doit déclencher la chaîne de pops de la pile doit simplement l'appeler lorsque vous voulez l'initier:
Ensuite, les activités ne sont pas sur la pile!
N'oubliez pas que vous pouvez démarrer une activité, puis commencer à nettoyer derrière elle, l'exécution ne suit pas un seul thread (l'interface utilisateur).
la source
Une façon de fonctionner avant l'API 11 consiste à commencer d'
ActivityGameMain
abord, puis àonCreate
démarrer cette activité dans l'ActivitySplashScreen
activité. LeActivityGameMain
n'apparaîtra pas lorsque vous appelez startActivity trop tôt pour le splash.Ensuite, vous pouvez effacer la pile au début
ActivityGameMain
en définissant ces drapeaux sur l'intention:Vous devez également l'ajouter à ActivitySplashScreen:
Donc, le fait de revenir sur cette activité ne vous revient pas
ActivityGameMain
.Je suppose que vous ne voulez pas non plus que l'écran de démarrage soit rétabli, pour ce faire, je suggère de le configurer
noHistory
dans votreAndroidManifest.xml
. Mettez ensuite legoBackPressed
code dans votreActivitySplashScreenSignUp
classe à la place.Cependant, j'ai trouvé quelques façons de briser cela. Démarrez une autre application à partir d'une notification lorsque
ActivitySplashScreenSignUp
s'affiche et que l'historique de retour n'est pas réinitialisé.Le seul vrai moyen de contourner cela est dans l'API 11:
la source
J'utilise de cette façon.
la source
Je sais que je suis en retard sur ce point (cela fait deux ans que la question a été posée), mais j'ai accompli cela en interceptant la touche de retour. Plutôt que de vérifier des activités spécifiques, je regarde simplement le nombre et s'il est inférieur à 3, il envoie simplement l'application à l'arrière (pause de l'application et retour de l'utilisateur à tout ce qui était en cours d'exécution avant le lancement). J'en vérifie moins de trois car je n'ai qu'un seul écran d'introduction. De plus, je vérifie le nombre car mon application permet à l'utilisateur de revenir à l'écran d'accueil via le menu, ce qui leur permet de sauvegarder à travers d'autres écrans comme d'habitude s'il y a des activités autres que l'écran d'introduction sur la pile.
la source
Dans le manifeste, vous pouvez ajouter:
Vous pouvez également appeler
immédiatement après avoir appelé startActivity (..)
la source
Il suffit de définir
noHistory="true"
dans le fichier manifeste . Cela rend l'activité supprimée du backstack.la source
C'est fou que personne n'ait mentionné cette solution élégante. Ce devrait être la réponse acceptée.
SplashActivity -> AuthActivity -> DashActivity
La clé ici est d'utiliser
intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
pour l'intermédiaireActivity
. Une fois ce lien du milieu rompu, leDashActivity
testament sera le premier et le dernier de la pile.android:noHistory="true"
est une mauvaise solution, car elle pose des problèmes lors de l'utilisation duActivity
comme un rappel par exempleonActivityResult
. C'est la solution recommandée et doit être acceptée.la source
C'est trop tard mais j'espère que ça aide. La plupart des réponses ne pointent pas dans la bonne direction. Il y a deux drapeaux simples pour une telle chose.
Depuis les documents Android:
la source
Appelez simplement this.finish () avant startActivity (intention) comme ceci-
la source
La suppression d'une activité d'un historique se fait en mettant le drapeau avant l'activité Vous ne voulez pas
A-> B-> C-> D
Supposons que A, B, C et D sont 4 activités si vous souhaitez effacer B et C, puis définissez l'indicateur
Dans l'activité A et B
Voici le bit de code
la source
la source
Essaye ça:
intent.addFlags(Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)
c'est le niveau API 1, vérifiez le lien .
la source
Intent.FLAG_ACTIVITY_NO_HISTORY
?