Effacer toutes les activités dans une tâche?

J’ai une activité d’écran de démarrage, puis une activité de connexion. Ma stack d’historique ressemble à:

SplashActivity LoginActivity 

Lorsque l’utilisateur se connecte avec succès via LoginActivity, je souhaite démarrer WelcomeActivity, mais efface la totalité de la stack:

 SplashActivity LoginActivity // launches WelcomeActivity -> WelcomeActivity // but now all three are in the history stack, while I only // want WelcomeActivity in the stack at this point. 

Y a-t-il un drapeau que je peux utiliser pour le faire?

 // LoginActivity.java Intent intent = new Intent(this, WelcomeActivity.class); intent.addFlag(Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); finish(); 

Vous ne savez pas si l’utilisation de FLAG_ACTIVITY_CLEAR_TASK effacera toutes les activités de ma tâche ou non. Je peux le faire “manuellement” en déroulant la stack en utilisant les appels startActivityForResult (), mais ce sera plus fragile et plus de code à gérer.

Merci

Oui ça devrait bien fonctionner. Vous pouvez utiliser:

  • FLAG_ACTIVITY_CLEAR_TOP
  • FLAG_ACTIVITY_SINGLE_TOP
  • FLAG_ACTIVITY_CLEAR_TASK
  • FLAG_ACTIVITY_NEW_TASK

ce qui garantit que si une instance est déjà en cours d’exécution et n’est pas en haut, tout ce qui est dessus sera effacé et utilisé, au lieu de démarrer une nouvelle instance (utile une fois l’activité Welcome -> Activité vous voulez revenir à la page d’accueil de A, mais les drapeaux supplémentaires ne devraient pas affecter votre cas ci-dessus).

Utilisez android:noHistory="true" sur l’activité de démarrage dans le fichier manifeste.

  

finish() supprime l’activité de la stack. Donc, si vous démarrez LoginActivity et que vous appelez finish() sur SplashActivity, puis que vous faites exactement la même chose pour démarrer WelcomeActivity, vous obtiendrez le comportement souhaité. Pas besoin d’utiliser des drapeaux supplémentaires.

Intent.FLAG_ACTIVITY_NO_HISTORY peut également fonctionner dans votre cas si vous ne souhaitez pas que l’activité figure dans la stack d’historique.

 Intent intent = new Intent(this, NextActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | IntentCompat.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 
  • Si toutes les trois activités sont impliquées dans la même application (même taskAffinity), vous pouvez choisir 1,2 ou 3 ci-dessous. sinon vous devriez choisir 1,2 ci-dessous.

    1. Si vous ne voulez pas renvoyer SplashActivity depuis LoginActivity , vous pouvez définir l’atsortingbut d’activité noHistory dans AndroidManifest.xml ou définir FLAG_ACTIVITY_NO_HISTORY dans l’intention de lancer SplashActivity. Si SplashActivity est lancé à partir de Launcher, vous devez choisir le moyen de définir l’atsortingbut d’activité noHistory.

    2. Si vous ne voulez pas retourner LoginActivity depuis WelcomeActivity, vous pouvez utiliser soit l’atsortingbut activity noHistory, soit FLAG_ACTIVITY_NO_HISTORY comme le numéro 1 ci-dessus.

    3. Si vous souhaitez effacer la stack sur une situation spécifique, vous pouvez utiliser FLAG_ACTIVITY_CLEAR_TASK conjointement avec FLAG_ACTIVITY_NEW_TASK ( FLAG_ACTIVITY_CLEAR_TASK doit toujours être utilisé conjointement avec FLAG_ACTIVITY_NEW_TASK ). Mais si l’activité en cours de démarrage est impliquée dans une autre application (par exemple, taskAffinity différente), la tâche sera lancée dans une autre tâche après la suppression de la tâche et non dans la tâche en cours. assurez-vous donc que l’activité lancée est impliquée dans la même application (taskAffinity).