Différence entre Intent.FLAG_ACTIVITY_CLEAR_TASK et Intent.FLAG_ACTIVITY_TASK_ON_HOME

De la documentation Android:

FLAG_ACTIVITY_CLEAR_TASK

S’il est défini dans Intent passé à Context.startActivity (), cet indicateur entraîne l’effacement de toute tâche existante associée à l’activité avant le démarrage de l’activité. En d’autres termes, l’activité devient la nouvelle racine d’une tâche par ailleurs vide et toutes les anciennes activités sont terminées. Ceci ne peut être utilisé qu’avec FLAG_ACTIVITY_NEW_TASK.

et

FLAG_ACTIVITY_TASK_ON_HOME

S’il est défini dans Intent transmis à Context.startActivity (), cet indicateur entraîne le lancement d’une nouvelle tâche de lancement sur la tâche d’activité domestique actuelle (s’il en existe une). En d’autres termes, le fait de repousser la tâche renverra toujours l’utilisateur à la maison même si ce n’était pas la dernière activité qu’il a vue. Ceci ne peut être utilisé qu’avec FLAG_ACTIVITY_NEW_TASK.

Considérez ces deux extraits:

Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

et

 Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME); startActivity(intent); 

Si je comprends bien, dans un extrait de code, nous créons une nouvelle tâche qui contient juste de l’activité, et lorsque vous appuyez sur, vous accédez à l’écran d’accueil. En supposant que je me trompe probablement, quelles sont les différences entre les deux? Aussi, si j’avais un autre extrait avec Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME | Intent.FLAG_ACTIVITY_CLEAR_TASK comment cela se comporterait?

Il y a une différence entre les 2 extraits. Voici quelques informations de base importantes:

  • Une tâche contient une stack d’activités. Une tâche peut être au premier plan ou en arrière-plan.

  • Les tâches sont également “empilées”. Si vous êtes dans la tâche A et que vous lancez une nouvelle tâche B , la tâche B est empilée sur la tâche A Si l’utilisateur appuie sur la touche BACK suffisamment de fois dans la tâche B , il finira par se retrouver dans la tâche A. C’est le comportement standard d’Android.

Votre extrait …

 Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); startActivity(intent); 

… fera 1 des choses suivantes, en fonction de …

  1. Si Activity a la même affinité de tâche que la tâche en cours (c.-à-d. La tâche à partir de laquelle ce code est exécuté), la tâche en cours sera effacée (terminer toutes les activités de la tâche) et lancer une nouvelle instance d’ Activity dans la tâche en cours. Si l’utilisateur appuie sur la touche BACK, cela termine l’ Activity et termine également la tâche en cours (puisqu’il n’y a qu’une activité dans la tâche) et renvoie l’utilisateur à l’écran HOME ou à la tâche qui a démarré cette tâche (tâche sous cette tâche dans la stack de tâches).
  2. Si l’ Activity a une affinité de tâche différente de la tâche en cours, et qu’il existe déjà une tâche avec cette affinité (c’est-à-dire une tâche existante à laquelle appartient l’ Activity ), cette tâche existante est mise au premier plan, effacée (toutes les activités dans la tâche sont terminés), une nouvelle instance d’ Activity est créée à la racine de la tâche et cette tâche est placée au-dessus de la tâche en cours (de sorte que lorsque l’ Activity termine, l’utilisateur est replacé dans la tâche en cours).
  3. Si Activity a une affinité de tâche différente de celle de la tâche en cours, et qu’il n’y a pas de tâche existante avec cette affinité, une nouvelle tâche est créée et une nouvelle instance d’ Activity est créée à la racine de la tâche. la tâche en cours (de sorte que lorsque l’ Activity termine, l’utilisateur est replacé dans la tâche en cours).

Cet extrait de code …

 Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME); startActivity(intent); 

… fera 1 des choses suivantes en fonction …

  1. Si Activity a la même affinité de tâche que la tâche en cours (c’est-à-dire la tâche à partir de laquelle ce code est exécuté) et Activity est l’activité racine de la tâche en cours, cela ne fera rien. Il ne démarrera pas une nouvelle tâche, ne supprimera aucune activité, ne créera pas une nouvelle instance d’ Activity et ne modifiera pas le comportement de la tâche en cours (c’est-à-dire si la tâche en cours a été démarrée). par une autre tâche, lorsque toutes les activités de la tâche en cours sont terminées, l’utilisateur renverra la tâche précédente dans la stack de tâches).
  2. Si Activity a la même affinité de tâche que la tâche en cours (c.-à-d. La tâche à partir de laquelle ce code est exécuté) et Activity n’est pas l’activité racine de la tâche en cours, cela créera simplement une nouvelle instance d’ Activity l’activité en cours dans la tâche en cours. Cela ne démarrera pas une nouvelle tâche, cela ne supprimera aucune activité et ne changera pas le comportement de ce qui se passe lorsque la tâche en cours est terminée (par exemple: si la tâche en cours a été lancée par une autre tâche La tâche est terminée, l’utilisateur renverra la tâche précédente dans la stack de tâches).
  3. Si Activity a une affinité de tâche différente de la tâche en cours et qu’il existe déjà une tâche avec cette affinité (par exemple, une tâche existante à laquelle l’ Activity appartiendrait) et Activity est l’activité racine de cette tâche existante, cette tâche existante est mis au premier plan et cette tâche est découplée de la stack de tâches (c.-à-d. lorsque toutes les activités de cette tâche sont terminées, l’utilisateur retourne à l’écran HOME et non à la tâche qui a lancé cette tâche).
  4. Si l’ Activity a une affinité de tâche différente de la tâche en cours, et qu’il existe déjà une tâche avec laquelle l’affinité de la tâche (une tâche existante appartient à l’activité) et l’ Activity n’est pas l’activité racine de cette tâche existante, cette tâche existante la tâche est mise au premier plan et cette tâche est découplée de la stack de tâches (c.-à-d. lorsque toutes les activités de cette tâche sont terminées, l’utilisateur retourne à l’écran HOME et non à la tâche qui a lancé cette tâche) de l’ Activity est créé et mis au dessus de toutes les activités existantes dans cette tâche.
  5. Si Activity a une affinité de tâche différente de la tâche en cours et qu’il n’existe aucune tâche avec cette affinité, une nouvelle tâche est créée et une nouvelle instance d’ Activity est créée à la racine de la tâche et la nouvelle tâche est découplée de la tâche. stack de tâches (de sorte que lorsque l’ Activity termine, l’utilisateur est renvoyé à l’écran HOME et non à la tâche qui l’a lancé).

et enfin cet extrait …

 Intent intent = new Intent(this, Activity.class); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_TASK_ON_HOME); startActivity(intent); 

… fera 1 des choses suivantes, en fonction de …

  1. Si Activity a la même affinité de tâche que la tâche en cours (c.-à-d. La tâche à partir de laquelle ce code est exécuté), la tâche en cours sera effacée (terminer toutes les activités de la tâche) et lancer une nouvelle instance d’ Activity dans la tâche en cours. Si l’utilisateur appuie sur la touche BACK, cela finit l’ Activity et termine également la tâche en cours (puisqu’il n’y a qu’une activité dans la tâche) et renvoie l’utilisateur à l’écran HOME.
  2. Si l’ Activity a une affinité de tâche différente de la tâche en cours, et qu’il existe déjà une tâche avec cette affinité (c’est-à-dire une tâche existante à laquelle appartient l’ Activity ), cette tâche existante est mise au premier plan, effacée (toutes les activités dans la tâche sont terminés), une nouvelle instance d’ Activity est créée à la racine de la tâche et cette tâche est découplée de la stack de tâches (de sorte que lorsque l’ Activity terminée, l’utilisateur est renvoyé à l’écran HOME).
  3. Si Activity a une affinité de tâche différente de la tâche en cours et qu’il n’y a pas de tâche existante avec cette affinité, une nouvelle tâche est créée et une nouvelle instance d’ Activity est créée à la racine de la tâche et cette tâche est découplée de la tâche. stack (de sorte que lorsque l’ Activity termine, l’utilisateur est renvoyé à l’écran HOME).

Je me rends compte que cette réponse est longue et compliquée, mais il y a tellement de cas différents. Je n’ai probablement même pas couvert tous les cas possibles (par exemple, si Activity a un mode de lancement spécial) …