402 votes

Suppression d'une activité de la pile d'historique

Mon application montre une activité d'inscription la première fois que l'utilisateur lance l'application, comme suit :

  1. ActivitySplashScreen (bienvenue dans le jeu, création d'un compte ?)
  2. ActivitySplashScreenSignUp (super, remplissez ces informations)
  3. ActivityGameMain (écran principal du jeu)

Ainsi, les activités se lancent les unes les autres dans cet ordre précis, lorsque l'utilisateur clique sur un bouton de chaque écran.

Lorsque l'utilisateur passe de l'activité n°2 à l'activité n°3, est-il possible d'effacer complètement les activités n°1 et n°2 de la pile d'historique ? J'aimerais que, si l'utilisateur se trouve à l'activité n° 3 et qu'il appuie sur le bouton Retour, il revienne à l'écran d'accueil et non à l'écran d'accueil.

Je pense pouvoir y parvenir avec des tâches (par exemple, en commençant une nouvelle tâche au point 3), mais je voulais savoir s'il existait une méthode plus simple,

Merci

0 votes

Après avoir été sur l'écran d'accueil, lorsque l'utilisateur reprend votre application, celle-ci l'emmène-t-elle sur ActivitySplashScreen ou ActivityGameMain ?

668voto

Wakka Points 3417

Vous pouvez y parvenir en définissant l'option android:noHistory attribut a "true" dans les <activity> dans votre AndroidManifest.xml fichier. Par exemple :

<activity
    android:name=".AnyActivity"
    android:noHistory="true" />

13 votes

C'est le meilleur moyen de le faire.

24 votes

De manière équivalente, vous pouvez utiliser FLAG_ACTIVITY_NO_HISTORY .

38 votes

Comment puis-je réaliser cela à partir du code ? Parce que je ne veux pas faire cela tout le temps. Je voudrais supprimer une activité donnée de l'historique uniquement sous certaines conditions.

139voto

Daniel Lew Points 39063

Vous pouvez utiliser le transfert pour supprimer l'activité précédente de la pile d'activités tout en lançant la suivante. Il y a un exemple de cela dans l'APIDemos mais en fait, tout ce que vous faites, c'est appeler finish() immédiatement après avoir appelé startActivity() .

1 votes

Bonjour Daniel, j'ai lu l'exemple, mais cela n'effacera la pile de l'historique que d'une seule activité, n'est-ce pas ? Si ma pile ressemble à A, B, et que je lance C, je veux que C soit le nouveau Root et efface complètement A et B. Dans l'exemple du sdk, appeler finish() depuis B me laisserait avec une pile de A, C, n'est-ce pas ? Merci.

1 votes

Vous pourriez dégager A au moment où vous lancez B, et dégager B au moment où vous lancez C ; cependant, je suppose qu'alors vous ne pourriez pas faire marche arrière de B à A si c'est ce que vous désirez. Je vais devoir y réfléchir davantage si cela pose un problème.

3 votes

Mark, pour obtenir ce que tu veux, tu dois utiliser le drapeau : FLAG_ACTIVITY_CLEAR_TOP. J'espère que cela vous aidera.

55voto

Matthias Points 17181

Oui, jetez un coup d'œil à Intent.FLAG_ACTIVITÉ_NO_HISTORY .

47 votes

Notez que cela ne crée aucun historique pour l'activité que vous lancez. Pour ne pas avoir d'historique pour l'activité à partir de laquelle vous lancez, il suffit de le définir comme suit android:noHistory="true" dans le manifeste.

1 votes

Cela fonctionne bien. Utilisez le intent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) pour activer ce drapeau.

1 votes

@georgiecasey c'est utile quand parfois vous voulez le garder dans l'histoire et parfois vous ne le voulez pas dans l'histoire.

25voto

Travis Points 1664

Ce n'est probablement pas la façon idéale de procéder. Si quelqu'un a une meilleure méthode, je me réjouis de la mettre en œuvre. Voici comment I a accompli cette tâche spécifique avec le sdk pré-version-11.

dans chaque classe vous voulez partir quand c'est l'heure de la sortie, vous devez faire cela :

    ... interesting code stuff ...
    Intent i = new Intent(MyActivityThatNeedsToGo.this, NextActivity.class);
    startActivityForResult(i, 0);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    if (resultCode == R.string.unwind_stack_result_id) {
        this.setResult(R.string.unwind_stack_result_id);
        this.finish();
    }
}

alors celui qui doit déclencher la chaîne des pops de la pile doit juste appeler ceci quand vous voulez l'initier :

NextActivity.this.setResult(R.string.unwind_stack_result_id);
NextActivity.this.finish();

Alors les activités ne sont pas sur la pile !
Rappelez-vous, les amis, que vous pouvez commencer une activité, puis commencer à nettoyer derrière elle, l'exécution ne suit pas un seul fil (l'ui).

0 votes

Au cas où quelqu'un tomberait dessus plus tard, j'ai pensé qu'il serait important de savoir que si vous avez fait pivoter l'écran, Android redémarrera votre application lorsque vous sortirez la dernière activité de la pile. Soyez-en conscient !

0 votes

C'est une bonne réponse si vous voulez seulement retirer une activité de la pile de manière conditionnelle en fonction de ce que l'utilisateur fait dans l'activité suivante +1.

23voto

mxcl Points 5921

Une façon qui fonctionne avant l'API 11 est de démarrer ActivityGameMain d'abord, puis dans le onCreate de cette Activité commencez votre ActivitySplashScreen activité. Le site ActivityGameMain n'apparaîtra pas car vous appelez startActivity trop tôt pour le splash.

Alors vous peut effacer la pile au démarrage ActivityGameMain en plaçant ces drapeaux sur l'intention :

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);

Vous devez également l'ajouter à ActivitySplashScreen :

@Override
public void onBackPressed() {
    moveTaskToBack(true);
}

Pour que le fait d'appuyer sur cette activité ne revienne pas à votre ActivityGameMain .

Je suppose que vous ne voulez pas non plus que l'écran d'accueil revienne, pour cela je suggère de le paramétrer à noHistory dans votre AndroidManifest.xml . Ensuite, mettez le goBackPressed dans votre ActivitySplashScreenSignUp à la place.

Cependant, j'ai trouvé quelques moyens d'y remédier. Lancer une autre application à partir d'une notification pendant que ActivitySplashScreenSignUp est affiché et l'historique n'est pas réinitialisé.

Le seul véritable moyen de contourner ce problème est l'API 11 :

intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X