Tâches et pile "Retour"

Une tâche est un ensemble d'activités avec lesquelles les utilisateurs interagissent lorsqu'ils tentent de faire quelque chose dans votre application. Ces activités sont organisées dans une pile appelée pile "Retour" dans l'ordre dans lequel chaque activité est ouverte.

Par exemple, une application de messagerie peut avoir une activité pour afficher une liste des nouveaux messages. Lorsque l'utilisateur sélectionne un une nouvelle activité s'ouvre pour l'afficher. Cette nouvelle activité a été ajoutée à la pile "Retour". Ensuite, lorsque l'utilisateur appuie ou fait un retour arrière, cette nouvelle activité se termine et est retiré de la pile.

Cycle de vie d'une tâche et de sa pile "Retour"

L'écran d'accueil de l'appareil est le point de départ de la plupart des tâches. Lorsqu'un utilisateur touche l'icône d'une application ou d'un raccourci dans le lanceur d'applications ou sur l'écran d'accueil ; la tâche de cette application passe au premier plan. Si aucune tâche n'existe pour l'application, une nouvelle tâche est créée et la commande principale activité de cette application s'ouvre. en tant qu'activité racine de la pile.

Lorsque l'activité en cours démarre une autre, la nouvelle activité est placée en haut de la liste de la pile et se concentre. L'activité précédente reste dans la pile, mais est s'est arrêtée. Lorsqu'une activité est arrêtée, le système conserve l'état actuel de ses de l'interface utilisateur. Lorsque l'utilisateur effectue l'action Retour, l'activité en cours est sorti du haut de la pile et détruit. La l'activité précédente reprend et l'état précédent de son UI est restauré.

Activités du les piles ne sont jamais réorganisées, mais seulement transférées et retirées de la pile telles qu'elles sont lancées par l'activité actuelle et ignorées par l'utilisateur à l'aide du bouton ou d'un geste Retour. Par conséquent, la pile "Retour" fonctionne comme une structure d'objet de type dernier entré, premier sorti. La figure 1 illustre une chronologie avec activités qui sont poussées et supprimées d'une pile "Retour".

Figure 1. Représentation de la manière dont chaque nouvelle activité ajoute un élément à la pile "Retour". Lorsque l'utilisateur appuie ou fait un geste De retour, l'activité en cours est détruite et l'activité précédente CV.

Alors que l'utilisateur continue d'appuyer ou de revenir en arrière, chaque activité de la pile s'affiche pour faire apparaître la précédente, jusqu'à ce que l'utilisateur retourne à la page d'accueil. ou à toute activité en cours d'exécution au début de la tâche. Lorsque tous les activités sont supprimées de la pile, la tâche n'existe plus.

Comportement du bouton Retour pour les activités du lanceur d'applications racine

Les activités du lanceur d'applications racine sont des activités qui déclarent un intent filtre comportant à la fois ACTION_MAIN et CATEGORY_LAUNCHER. Ces activités sont uniques car elles servent de points d'entrée dans votre application à partir de le lanceur d'applications et permettent de démarrer une tâche.

Lorsqu'un utilisateur appuie ou revient en arrière à partir d'une activité du lanceur d'applications racine, le système gère l'événement différemment selon la version d'Android l'appareil est en cours d'exécution.

Comportement du système sous Android 11 ou version antérieure
Le système termine l'activité.
Comportement du système sous Android 12 ou version ultérieure

Le système déplace l'activité et sa tâche en arrière-plan au lieu de de terminer l'activité. Ce comportement correspond au comportement système par défaut lorsque Quitter une application à l'aide du bouton d'accueil ou d'un geste

Dans la plupart des cas, ce comportement signifie que les utilisateurs peuvent réactiver plus rapidement votre application. à partir d'un état chaud, au lieu devoir redémarrer complètement l'application à partir d'un système à froid .

Si vous devez fournir un retour arrière personnalisé, procédez comme suit : nous vous recommandons d'utiliser les API AndroidX Activity plutôt que de remplacer onBackPressed() Les API AndroidX Activity s'en remettront automatiquement à la le comportement approprié du système si aucun composant n'intercepte le système. Appuie sur l'arrière.

Toutefois, si votre application remplace onBackPressed() à gérer Revenir en arrière et terminer l'activité, mettre à jour votre implémentation pour appeler jusqu'à super.onBackPressed() au lieu de terminer. Appel en cours super.onBackPressed() déplace l'activité et sa tâche en arrière-plan lorsque appropriée et fournit une expérience de navigation plus cohérente aux utilisateurs entre les applications.

Tâches en arrière-plan et au premier plan

Figure 2. Deux tâches: la tâche B reçoit une interaction de l'utilisateur dans au premier plan, tandis que la tâche A est en arrière-plan, attend à reprendre.

Une tâche est une unité cohérente qui peut passer en arrière-plan lorsqu'un utilisateur commence nouvelle tâche ou pour accéder à l'écran d'accueil. En arrière-plan, toutes les activités dans la tâche sont arrêtées, mais la pile "Retour" de la tâche reste intacte : la tâche perd sa concentration pendant l'exécution d'une autre tâche, comme illustré dans la figure 2. A la tâche peut alors revenir au premier plan afin que les utilisateurs puissent reprendre là où ils l'avaient laissée désactivée.

Considérez le flux de tâches suivant pour la tâche A actuelle qui La pile contient trois activités, dont deux sous l'activité actuelle:

  1. L'utilisateur utilise le bouton ou le geste d'accueil, puis lance une nouvelle application à partir de lanceur d'applications.

    Lorsque l'écran d'accueil apparaît, la tâche A passe en arrière-plan. Lorsque le nouveau application démarre, le système lance une tâche pour cette application (Tâche B) avec sa propre pile d'activités.

  2. Après avoir interagi avec cette application, l'utilisateur revient à l'accueil et sélectionne l'icône application qui a initialement démarré la Tâche A.

    Maintenant, la Tâche A arrive au premier plan. Les trois activités de sa pile sont intacts et l'activité en haut de la pile reprend. À ce stade, l'utilisateur peut également revenir à la tâche B en accédant à la page d'accueil et en sélectionnant l'icône de l'application. qui a lancé cette tâche ou en sélectionnant la tâche de l'application dans le panneau Récents écran.

Plusieurs instances d'activité

Figure 3. Une même activité peut être instanciée plusieurs fois.

Comme les activités de la pile "Retour" ne sont jamais réorganisées, si votre application permet aux utilisateurs de démarrer une activité particulière à partir de plusieurs activités, une nouvelle une instance de cette activité est créée et transférée vers la pile, pour placer toute instance précédente de l'activité en haut. Ainsi, un l'activité dans votre application peut être instanciée plusieurs fois, même à partir de différentes tâches, comme illustré dans la figure 3.

Si l'utilisateur revient en arrière à l'aide du bouton Retour un bouton ou un geste, les instances de l'activité sont révélées dans l'ordre dans lequel elles chacun avec son propre état d'UI. Toutefois, vous pouvez modifier si vous ne voulez pas qu'une activité soit instanciée plusieurs fois. Apprendre Pour plus d'informations à ce sujet, consultez la section Gérer tâches.

Environnements multifenêtres

Lorsque les applications s'exécutent simultanément en mode multifenêtre environnement, compatible avec Android 7.0 (API niveau 24) ou supérieur, le système gère les tâches séparément pour chaque fenêtre. Chaque peut comporter plusieurs tâches. Il en va de même pour les applications Android exécutées sur Chromebooks: le système gère des tâches, ou groupes de tâches, sur un par fenêtre.

Récapitulatif du cycle de vie

Pour résumer le comportement par défaut des activités et des tâches:

  • Lorsque l'activité A lance l'activité B, l'activité A est arrêtée, mais le système conserve son état, comme sa position de défilement et tout texte saisi dans les formulaires. Si l'utilisateur appuie ou utilise le geste Retour lorsqu'il se trouve dans l'activité B (activité A) ; reprend avec son état restauré.

  • Lorsque l'utilisateur quitte une tâche à l'aide du bouton Accueil ou d'un geste, l'état actuel activité est arrêtée et que sa tâche passe en arrière-plan. Le système conserve l'état de chaque activité de la tâche. Si l'utilisateur reprend ultérieurement la tâche en après avoir sélectionné l'icône du lanceur d'applications, celle-ci s'affiche au premier plan et reprend l'activité en haut de la pile.

  • Si l'utilisateur appuie ou fait un geste pour revenir en arrière, l'activité en cours est supprimée de la pile et détruite. L'activité précédente de la pile reprend. Quand ? si une activité est détruite, le système ne conserve pas l'état de l'activité.

    Ce comportement est différent pour les activités du lanceur d'applications racine Lorsque votre application s'exécute sur un appareil équipé d'Android 12 ou version ultérieure.

  • Les activités peuvent être instanciées plusieurs fois, même à partir d'autres tâches.

Gérez des tâches

Android gère les tâches et la pile "Retour" en plaçant toutes les activités ont été lancées successivement dans la même tâche, au cours d'une dernière entrée, en premier de la pile de stockage. Cela fonctionne très bien pour la plupart des applications et vous n'avez généralement pas à vous soucier comment vos activités sont associées aux tâches ou comment elles existent à l’arrière pile.

Cependant, vous pouvez décider d'interrompre le comportement normal. Par exemple, vous pouvez vouloir qu'une activité de votre application commence une nouvelle tâche lorsqu'elle commencé, au lieu d'être placé dans la tâche actuelle. Ou, lorsque vous démarrez un activité, vous pouvez en transférer une instance existante, en créant une nouvelle instance au-dessus de la pile "Retour". Ou vous pourriez que votre pile "Retour" soit effacée de toutes les activités, à l'exception de l'activité racine lorsque l'utilisateur quitte la tâche.

Vous pouvez effectuer ces opérations et bien d'autres en utilisant les attributs Élément <activity> du fichier manifeste et les indicateurs dans l'intent que vous transmettez startActivity()

Voici les principaux attributs <activity> que vous pouvez utiliser pour gérer les tâches:

Voici les options d'intent principal que vous pouvez utiliser:

Les sections suivantes expliquent comment utiliser ces attributs de fichier manifeste et d'intents pour définir comment les activités s'associent aux tâches et comment elles se comportent dans la pile "Retour".

Les considérations relatives à la façon dont les tâches et les activités sont représentées et gérées dans l'écran "Recents" (Éléments récents). Normalement, vous laissez le comment votre tâche et vos activités sont représentées dans le "Récents", et vous n'avez pas besoin de modifier ce comportement. Pour plus consultez l'écran "Recents" (Éléments récents).

Définir les modes de lancement

Les modes de lancement vous permettent de définir comment la nouvelle instance d'une activité est associée avec la tâche en cours. Vous pouvez définir des modes de lancement de deux manières, décrites dans les sections suivantes:

Ainsi, si l'activité A lance l'activité B, l'activité B peut la définir dans son fichier manifeste. comment elle s'associe à la tâche en cours, et l'activité A peut utiliser une option d'intent pour demander comment l'activité B peut s'associer à la tâche en cours.

Si les les activités définissent comment l'activité B s'associe à une tâche, puis l'activité A comme défini dans l'intent, est honoré par rapport à la requête de l'activité B, car défini dans son fichier manifeste.

Définir les modes de lancement à l'aide du fichier manifeste

Lorsque vous déclarez une activité dans votre fichier manifeste, vous pouvez spécifier la manière d'activité associée à une tâche en utilisant de l'élément <activity> launchMode

Vous pouvez attribuer cinq modes de lancement à l'attribut launchMode:

  1. "standard"
    Mode par défaut. Le système crée une instance de l'activité dans la tâche à partir duquel elle a été lancée et qui achemine l'intent. L'activité peut être instanciées plusieurs fois, chaque instance peut appartenir à différentes tâches, et Une tâche peut avoir plusieurs instances.
  2. "singleTop"
    Si une instance de l'activité existe déjà en haut de la tâche actuelle, le système achemine l'intent vers cette instance via un appel vers onNewIntent() , plutôt que de créer une instance de l'activité. L'activité est instanciées plusieurs fois, chaque instance peut appartenir à différentes tâches, Une tâche peut avoir plusieurs instances (mais uniquement si l'activité de la pile "Retour" n'est pas une instance existante de l'activité).

    Par exemple, supposons que la pile "Retour" d'une tâche soit composée de l'activité racine A avec activités B, C et D en haut (la pile est donc A-B-C-D, avec D en haut). Un intent arrive pour une activité de type D. Si D a le lancement "standard" par défaut une nouvelle instance de la classe est lancée et la pile devient A-B-C-D-D. Cependant, si le mode de lancement de D est "singleTop", l'instance existante de D reçoit l'intent via onNewIntent(), car il se trouve en haut de la pile, et celle-ci reste A-B-C-D. Si, d'un autre côté, arrive pour une activité de type B, puis une nouvelle instance de B est ajoutée la pile même si son mode de lancement est "singleTop".

  3. "singleTask"
    Le système crée l'activité à la racine d'une nouvelle tâche ou localise sur une tâche existante ayant la même affinité. Si une instance du type existe déjà, le système achemine un intent à l'instance existante via un appel onNewIntent() , plutôt que de créer une instance. Pendant ce temps, tous les autres les activités qui s'y trouvent sont détruites.
  4. "singleInstance".
    Le comportement est le même que pour "singleTask", sauf que le système ne lance aucune autre la tâche contenant l'instance. L'activité est toujours le seul et unique membre de sa tâche. Toutes les activités lancées par celle-ci s'ouvrent dans une tâche distincte.
  5. "singleInstancePerTask".
    L'activité ne peut s'exécuter qu'en tant qu'activité racine de la tâche, la première activité ayant créé la tâche. Par conséquent, il ne peut y avoir qu'une seule instance de cette activité dans une tâche. Contrairement au mode de lancement singleTask, activité peut être lancée dans plusieurs instances pour des tâches différentes FLAG_ACTIVITY_MULTIPLE_TASK ou FLAG_ACTIVITY_NEW_DOCUMENT est défini.

Autre exemple, l'application du navigateur Android déclare que le navigateur Web l'activité s'ouvre toujours dans sa propre tâche en spécifiant le singleTask mode de lancement dans <activity> . Cela signifie que si votre application émet un intent pour ouvrir son activité n'est pas placée dans la même tâche que votre application. À la place, soit une nouvelle tâche démarre pour le navigateur, soit, si le navigateur dispose déjà d'une tâche, qui s'exécute en arrière-plan, elle est transférée pour gérer l'intention.

Peu importe si une activité commence dans une nouvelle tâche ou dans la même tâche que l'activité qui l'a lancée, le geste et le bouton Retour prennent toujours à l'activité précédente. En revanche, si vous lancez une activité spécifie le mode de lancement singleTask et une instance de cette activité existe dans en arrière-plan, l'ensemble de la tâche est mis au premier plan. À ce stade, la pile "Retour" inclut toutes les activités de la tâche transmise au en haut de la pile. La figure 4 illustre ce type de scénario.

Figure 4. Représentation de la façon dont une activité avec lancement "singleTask" est ajouté à la pile "Retour". Si l'activité fait déjà partie d'une tâche en arrière-plan avec sa propre pile "Retour", l'ensemble de la pile "Retour" s'affiche également, au-dessus de la pile actuelle tâche.

Pour en savoir plus sur l'utilisation des modes de lancement dans le fichier manifeste, consultez la Documentation de l'élément <activity>.

Définir des modes de lancement à l'aide d'indicateurs d'intent

Lorsque vous démarrez une activité, vous pouvez modifier son association par défaut à sa tâche en incluant des indicateurs dans l'intent que vous transmettez à startActivity() Les options que vous pouvez utiliser pour modifier le comportement par défaut sont les suivantes:

FLAG_ACTIVITY_NEW_TASK

Le système lance l'activité dans une nouvelle tâche. Si une tâche est déjà en cours d'exécution pour le activité lancée, cette tâche est mise au premier plan avec son le dernier état restauré, et l'activité reçoit le nouvel intent onNewIntent()

Cela produit le même comportement que "singleTask". Valeur launchMode discutée dans la section précédente.

FLAG_ACTIVITY_SINGLE_TOP

Si l'activité en cours de démarrage est l'activité actuelle, en haut de l'arrière pile, l'instance existante reçoit un appel onNewIntent() au lieu de créer une instance de l'activité.

Cela produit le même comportement que "singleTop". la valeur launchMode décrite dans la section précédente.

FLAG_ACTIVITY_CLEAR_TOP

Si l'activité en cours de démarrage est déjà en cours d'exécution dans la tâche en cours, alors, au lieu de lancer une nouvelle instance de cette activité, la le système détruit toutes les autres activités qui s’y rattachent. L'objectif est livré à l'instance réactivée de l'activité, maintenant au-dessus, via onNewIntent()

Aucune valeur n'est définie pour l'attribut launchMode qui produit ce comportement.

FLAG_ACTIVITY_CLEAR_TOP est le plus souvent utilisé conjointement avec FLAG_ACTIVITY_NEW_TASK Lorsqu'ils sont utilisés ensemble, ces indicateurs localiser une activité existante dans une autre tâche et la placer dans une position où il peut répondre à l'intent.

Gérer les affinités

Une affinité indique la tâche qu'une activité "préfère" auxquels appartenir. Par par défaut, toutes les activités d'une même application présentent une affinité entre elles: ils "préfèrent" dans la même tâche.

Toutefois, vous pouvez modifier l'affinité par défaut d'une activité. Activités définies dans différentes applications peuvent partager une affinité, et les activités définies dans la même application peuvent se voir attribuer différentes affinités de tâches.

Vous pouvez modifier l'affinité d'une activité à l'aide de la taskAffinity de l'attribut <activity> .

L'attribut taskAffinity accepte une valeur de chaîne qui doit être différente de celle le nom de package par défaut déclaré dans le <manifest> car le système utilise ce nom pour identifier la tâche par défaut affinité avec l'application.

L'affinité entre en jeu dans deux cas:

  1. Lorsque l'intent qui lance une activité contient FLAG_ACTIVITY_NEW_TASK .

    Par défaut, une nouvelle activité est lancée dans la tâche de l'activité appelé startActivity() Il est placé sur la même pile "Retour" que l'appelant.

    Toutefois, si l'intent transmis à startActivity() contient FLAG_ACTIVITY_NEW_TASK indicateur, le système recherche une autre tâche pour héberger la nouvelle activité. Souvent, il s'agit d'une nouvelle tâche. Cependant, ce n'est pas une fatalité. S'il existe un tâche existante ayant la même affinité que la nouvelle activité, l'activité est lancée dans cette tâche. Sinon, il commence une nouvelle tâche.

    Si cet indicateur entraîne le démarrage d'une nouvelle tâche par une activité et que l'utilisateur utilise la Bouton d'accueil ou geste pour le quitter, il doit y avoir un moyen pour l'utilisateur de revenez à la tâche. Certaines entités, comme le gestionnaire de notifications, toujours démarrer des activités dans une tâche externe, jamais dans le cadre de leurs propres activités. ils placent toujours FLAG_ACTIVITY_NEW_TASK dans les intents auxquels ils sont transmis startActivity()

    Si une entité externe qui pourrait utilisez cet indicateur pour appeler votre activité, assurez-vous que l'utilisateur dispose manière indépendante de revenir à la tâche qui a commencé, par exemple avec une icône de lanceur, où l'activité racine de la tâche comporte CATEGORY_LAUNCHER filtre d'intent intégré. Pour plus d'informations, consultez la section sur le début des tâches.

  2. Lorsqu'une activité a son allowTaskReparenting défini sur "true".

    Dans ce cas, l’activité peut passer de la tâche qu’elle commence à la tâche qu’elle a une affinité pour la tâche quand cette tâche passe au premier plan.

    Par exemple, supposons qu'une activité indique les conditions météorologiques dans villes sélectionnées est défini dans le cadre d'une application de voyage. Elle a la même affinité que les autres activités de la même application, l'affinité d'application par défaut changer de parent avec cet attribut.

    Lorsque l'une de vos activités démarre l'activité de bulletin d'informations météo, celle-ci appartient initialement à la même tâche que activité. Toutefois, lorsque la tâche de l'application de voyage passe au premier plan, l'activité de journaliste météorologique est réaffectée à cette tâche et s'y affiche.

Effacer la pile "Retour"

Si l'utilisateur quitte une tâche pendant une longue période, le système l'efface de toutes des activités à l'exception de l'activité racine. Lorsque l'utilisateur revient à la tâche, seule l'activité racine est restaurée. Le système se comporte de cette façon l'hypothèse qu'après une longtemps que les utilisateurs abandonnent ce qu'ils faisaient auparavant et qui reviennent à la tâche pour commencer quelque chose de nouveau.

Vous pouvez utiliser certains attributs d'activité pour modifier ce comportement:

alwaysRetainTaskState
Lorsque cet attribut est défini sur "true" dans l'activité racine d'une tâche, la le comportement par défaut que nous venons de décrire ne se produit pas. La tâche conserve tous les activités de sa pile, même après une longue période.
clearTaskOnLaunch

Lorsque cet attribut est défini sur "true" dans l'activité racine d'une tâche, la tâche est effacé de l'activité racine chaque fois que l'utilisateur quitte la tâche et y retourne. En d'autres termes, c'est le contraire de alwaysRetainTaskState La l'utilisateur revient toujours à la tâche dans son état initial, même après avoir quitté la cette tâche pendant un instant.

finishOnTaskLaunch

Cet attribut est semblable à clearTaskOnLaunch, mais il s'applique à une seule activité, et non à une tâche entière. Cela peut aussi causer n'importe quelle activité à terminer, à l'exception de l'activité racine. Lorsqu'il est réglé sur "true" : l'activité reste dans la tâche uniquement pour la session en cours. Si l'utilisateur quitte la tâche, puis y retourne, elle n'est plus présente.

Démarrer une tâche

Vous pouvez configurer une activité comme point d'entrée d'une tâche en lui attribuant un intent filtrer avec "android.intent.action.MAIN" comme action spécifiée et "android.intent.category.LAUNCHER" comme catégorie spécifiée:

<activity ... >
    <intent-filter ... >
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
    ...
</activity>

Un filtre d'intent de ce type entraîne la création d'une icône et d'un libellé pour l'activité s'affichent dans le lanceur d'applications, ce qui permet aux utilisateurs de lancer l'activité et revenir à la tâche qu'il a créée à tout moment après son lancement.

Cette deuxième capacité est importante. Les utilisateurs doivent pouvoir quitter une tâche y revenir plus tard à l'aide de ce lanceur d'activités. C'est pourquoi vous ne devez utiliser les deux les modes de lancement qui marquent les activités comme étant toujours à l'origine d'une tâche, "singleTask" et "singleInstance", lorsque l'activité présente ACTION_MAIN et un CATEGORY_LAUNCHER filtre.

Imaginez, par exemple, ce qui pourrait se passer si le filtre était manquant : l'intent lance une activité "singleTask" et lance une nouvelle tâche, et l'utilisateur passe du temps à travailler dans cette tâche. L'utilisateur utilise ensuite le bouton Accueil ou geste. La tâche est maintenant envoyée en arrière-plan et n'est pas visible. Maintenant, l’utilisateur n'a aucun moyen de revenir à la tâche, car elle n'est pas représentée dans l'application. lanceur d'applications.

Dans les cas où vous ne voulez pas que l'utilisateur revienne d'activité, définissez l'élément <activity> finishOnTaskLaunch de l'élément à "true". Pour en savoir plus, consultez la section Effacer la pile "Retour".

Informations supplémentaires sur la façon dont les tâches et les activités sont représentées et gérées de l'écran "Recents" (Éléments récents) est disponible dans la section Recents écran.

Autres ressources