web-dev-qa-db-fra.com

Android: activité ouverte sans sauvegarde dans la pile

J'ai 2 activités: principale et liste.

Depuis Main, vous pouvez ouvrir la liste. à partir de la liste, vous pouvez ouvrir Main.

J'aimerais que chaque ouverture de la liste ne soit pas enregistrée dans "l'historique". Par conséquent, si vous appuyez de nouveau sur Main , vous ne pouvez pas revenir à la liste.

C'est possible?

87
realtebo

Lorsque vous démarrez la liste Activity de votre liste, définissez ses indicateurs Intent comme suit:

Intent i = new Intent(...); // Your list's Intent
i.setFlags(i.getFlags() | Intent.FLAG_ACTIVITY_NO_HISTORY); // Adds the FLAG_ACTIVITY_NO_HISTORY flag
startActivity(i);

L'option FLAG_ACTIVITY_NO_HISTORY empêche le nouveau Activity d'être ajouté à la pile d'historique.

NB: Comme @Sam le fait remarquer, vous pouvez utiliser i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); à la place. Il n'y a pas de différence fonctionnelle.

145
Eric

Dans le fichier manifeste, ajoutez:

Android:noHistory="true" 

à l'activité que vous ne voulez pas garder sur la pile.

86
Marcin S.

Utilisez la nouvelle tâche avec effacement. Cela a fonctionné dans mon cas lorsque les autres options ne fonctionnaient pas.

intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);

Efface toute la pile d'historique et commence une nouvelle activité sur Android

27
Kalel Wade

Il semble que si vous appelez finish () sur votre activité juste après en avoir ouvert une autre, celle qui est terminée est retirée de la pile.

par exemple:

Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
finish();
19
dac2009

Dans mon cas particulier FLAG_ACTIVITY_NO_HISTORY n'a pas fonctionné. _ FLAG_ACTIVITY_NEW_TASK ou FLAG_ACTIVITY_CLEAR_TASK seuls travaillent seuls.

Toutefois FLAG_ACTIVITY_NEW_TASK et FLAG_ACTIVITY_CLEAR_TASK ensemble ont fonctionné.

Intent intent = new Intent(FooActivity.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivity(intent);
4
Fred

Je voulais juste ajouter un moyen de faire cela à Kotlin:

val i = Intent(this, LogInActivity::class.Java)
startActivity(i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK))
2
Devin B

Réponse tardive, mais ajoute de la profondeur à d’autres réponses. Tout se résume à ce que vous voulez faire avec les autres activités démarrées à partir de cette activité.

Option 1 - Seule cette activité ne devrait pas avoir d'antécédent d'activité d'appel

Alors juste faire:

Intent i = new Intent(...);
i.addFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

Option 2 - Toutes les activités lancées à partir de cette activité spécifique ne doivent pas avoir d'historique

Ajoutez ensuite le manifeste de l’activité d’appel:

Android:noHistory="true" 

Mais si vous voulez avoir un historique dans une nouvelle activité, vous devez supprimer manuellement le drapeau:

Intent i = new Intent(...);
i.removeFlag(Intent.FLAG_ACTIVITY_NO_HISTORY);
startActivity(i);

J'espère que ça clarifie d'autres réponses :)

1
Miku
1
VinceFR

Essayez FLAG_ACTIVITY_CLEAR_TOP si l'activité est déjà en cours d'exécution:

Intent intent = new Intent(this, MyActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
0
live-love