Présentation des tâches en arrière-plan

Les applications doivent souvent effectuer plusieurs actions à la fois. Les API Android vous permettent de le faire de nombreuses façons. Choisir la bonne option est très important : une option peut être adaptée à une situation, mais très incorrecte dans une autre. Choisir les mauvaises API peut nuire aux performances de votre application ou à l'efficacité des ressources, ce qui peut décharger la batterie et dégrader les performances de l'appareil de l'utilisateur dans son ensemble. Dans certains cas, choisir la mauvaise approche peut empêcher votre application d'être listée sur le Play Store.

Ce document décrit les différentes options à votre disposition et vous aide à choisir celle qui convient le mieux à votre situation.

Terminologie

Certains termes importants liés au travail en arrière-plan peuvent être utilisés de plusieurs manières contradictoires. C'est pourquoi il est important de définir nos termes.

Si une application s'exécute en arrière-plan, le système lui impose un certain nombre de restrictions. (Par exemple, dans la plupart des cas, une application en arrière-plan ne peut pas lancer de services de premier plan.)

Dans ce document, nous utiliserons le terme "tâche" pour désigner une opération effectuée par une application en dehors de son workflow principal. Pour assurer une compréhension cohérente, nous avons classé ces tâches dans trois catégories principales de types de tâches : les tâches asynchrones, les tâches en arrière-plan et les services de premier plan.

Choisir la bonne option

Dans la plupart des scénarios, vous pouvez déterminer les API appropriées à utiliser pour votre tâche en déterminant la catégorie (travail asynchrone, travail en arrière-plan ou services de premier plan) à laquelle appartient la tâche.

Si vous avez encore un doute, vous pouvez utiliser les organigrammes que nous fournissons pour enrichir votre décision. Chacune de ces options est décrite plus en détail plus loin dans ce document.

Il existe deux scénarios principaux à prendre en compte pour les tâches en arrière-plan:

Ces deux scénarios ont leurs propres arbres de décision.

Tâches asynchrones

Dans de nombreux cas, une application doit simplement effectuer des opérations simultanées lorsqu'elle s'exécute au premier plan. Par exemple, une application peut avoir besoin d'effectuer un calcul chronophage. S'il effectuait le calcul sur le thread UI, l'utilisateur ne pourrait pas interagir avec l'application tant que le calcul n'est pas terminé. Cela peut entraîner une erreur ANR. Dans ce cas, l'application doit utiliser une option de travail asynchrone.

Les options de travail asynchrone courantes incluent les coroutines Kotlin et les threads Java. Pour en savoir plus, consultez la documentation sur les tâches asynchrones. Il est important de noter que, contrairement au travail en arrière-plan, il n'est pas garanti que le travail asynchrone se termine si l'application cesse d'être dans une phase de cycle de vie valide (par exemple, si l'application quitte le premier plan).

Travail en arrière-plan

Les tâches en arrière-plan sont une option plus flexible lorsque vous devez effectuer des tâches qui doivent se poursuivre même si l'utilisateur quitte l'application. Dans la plupart des cas, la meilleure option consiste à utiliser WorkManager. Toutefois, dans certains cas, il peut être approprié d'utiliser l'API JobScheduler de la plate-forme.

WorkManager est une bibliothèque puissante qui vous permet de configurer des tâches simples ou compliquées selon vos besoins. Vous pouvez utiliser WorkManager pour planifier l'exécution de tâches à des heures spécifiques ou spécifier les conditions d'exécution de la tâche. Vous pouvez même configurer des chaînes de tâches, de sorte que chaque tâche s'exécute l'une après l'autre et transmet les résultats à la suivante. Pour comprendre toutes les options disponibles, consultez la liste des fonctionnalités de WorkManager.

Voici quelques-uns des scénarios les plus courants pour les tâches en arrière-plan:

  • Récupération périodique des données du serveur
  • Récupérer les données du capteur (par exemple, les données du compteur de pas)
  • Obtenir des données de localisation périodiques (vous devez disposer de l'autorisation ACCESS_BACKGROUND_LOCATION sur Android 10 ou version ultérieure)
  • Importer du contenu en fonction d'un déclencheur de contenu, comme des photos créées par l'appareil photo

Services de premier plan

Les services de premier plan offrent un moyen efficace d'exécuter immédiatement des tâches qui ne doivent pas être interrompues. Toutefois, les services de premier plan peuvent potentiellement exercer une charge importante sur l'appareil, et ils ont parfois des implications en termes de confidentialité et de sécurité. C'est pourquoi le système impose de nombreuses restrictions sur la manière et le moment où les applications peuvent utiliser les services de premier plan. Par exemple, un service de premier plan doit être visible par l'utilisateur et, dans la plupart des cas, les applications ne peuvent pas lancer de services de premier plan lorsqu'elles sont en arrière-plan. Pour en savoir plus, consultez la documentation sur les services de premier plan.

Il existe deux méthodes pour créer un service de premier plan. Vous pouvez déclarer votre propre Service et spécifier qu'il s'agit d'un service de premier plan en appelant Service.startForeground(). Vous pouvez également utiliser WorkManager pour créer un service de premier plan, comme indiqué dans la section Compatibilité avec les nœuds de calcul de longue durée. Cependant, il est important de savoir qu'un service de premier plan créé par WorkManager doit respecter les mêmes restrictions que tout autre service de premier plan. WorkManager fournit simplement quelques API pratiques pour faciliter la création d'un service de premier plan.

Autres API

Le système propose d'autres API conçues pour améliorer les performances dans des cas d'utilisation plus spécifiques. S'il existe une autre API pour votre cas d'utilisation, nous vous recommandons de l'utiliser plutôt qu'un service de premier plan, car cela devrait améliorer les performances de votre application. La documentation sur les types de services de premier plan indique s'il existe une bonne alternative à utiliser à la place d'un type de service de premier plan particulier.

Voici quelques-uns des scénarios les plus courants d'utilisation d'API alternatives:

Tâches lancées par l'utilisateur

Organigramme montrant comment choisir l'API appropriée. Ce graphique récapitule le contenu de la section "Tâches initiées par l'utilisateur".
Figure 1: Choisir l'API appropriée pour exécuter une tâche en arrière-plan déclenchée par l'utilisateur

Si une application doit effectuer une tâche en arrière-plan et que l'opération est lancée par l'utilisateur alors qu'elle est visible, répondez à ces questions pour trouver la bonne approche.

La tâche doit-elle continuer à s'exécuter lorsque l'application est exécutée en arrière-plan ?

Si la tâche n'a pas besoin de continuer à fonctionner lorsque l'application est exécutée en arrière-plan, vous devez utiliser une tâche asynchrone. Il existe de nombreuses options pour effectuer un travail asynchrone. Il est important de comprendre que ces options cessent toutes de fonctionner si l'application passe en arrière-plan. Elles s'arrêtent également si l'application est arrêtée. Par exemple, une application de réseaux sociaux peut souhaiter actualiser son flux de contenu, mais elle n'aurait pas besoin de terminer l'opération si l'utilisateur a quitté l'écran.

Y aura-t-il une mauvaise expérience utilisateur si la tâche est différée ou interrompue ?

Il est important de déterminer si l'expérience utilisateur ne sera pas affectée si une tâche est reportée ou annulée. Par exemple, si une application doit mettre à jour ses éléments, l'utilisateur peut ne pas remarquer si l'opération se produit immédiatement ou au milieu de la nuit pendant la recharge de l'appareil. Dans ce cas, vous devez utiliser les options de travail en arrière-plan.

S'agit-il d'une tâche courte et critique ?

Si la tâche ne peut pas être retardée et qu'elle se termine rapidement, vous pouvez utiliser un service de premier plan de type shortService. Ces services sont plus faciles à créer que d'autres services de premier plan et ne nécessitent pas autant d'autorisations. Toutefois, les services courts doivent s'exécuter dans un délai de trois minutes.

Existe-t-il une autre API dédiée uniquement à cet usage ?

Si la tâche n'est pas invisible pour l'utilisateur, la solution consiste peut-être à utiliser un service de premier plan. Une fois démarrés, ces services s'exécutent en continu. Il s'agit donc d'un bon choix lorsque l'interruption de la tâche peut nuire à l'expérience utilisateur. Par exemple, une application de suivi de l'entraînement peut utiliser des capteurs de localisation pour permettre aux utilisateurs d'enregistrer leur parcours de jogging sur une carte. Vous ne voudriez pas effectuer cette opération avec une option de travail en arrière-plan, car si la tâche était mise en pause, le suivi s'arrêterait immédiatement. Dans une situation comme celle-ci, un service de premier plan est le plus logique.

Toutefois, comme les services de premier plan peuvent potentiellement utiliser de nombreuses ressources d'appareil, le système impose de nombreuses restrictions sur leur utilisation et le moment où elles peuvent être utilisées. Dans de nombreux cas, au lieu d'utiliser un service de premier plan, vous pouvez utiliser une API alternative qui gère la tâche à votre place plus facilement. Par exemple, si votre application doit effectuer une action lorsque l'utilisateur arrive à un certain endroit, la meilleure option consiste à utiliser l'API de géorepérage au lieu de suivre la position de l'utilisateur avec un service de premier plan.

Tâches en réponse à un événement

Organigramme montrant comment choisir l'API appropriée. Ce graphique résume le contenu de la section "Tâches en réponse à un événement".
Figure 2: Choisir l'API appropriée pour exécuter une tâche en arrière-plan déclenchée par un événement

Parfois, une application doit effectuer un travail en arrière-plan en réponse à un déclencheur, par exemple:

Il peut s'agir d'un déclencheur externe (comme un message FCM) ou d'une réponse à une alarme définie par l'application elle-même. Par exemple, un jeu peut recevoir un message FCM lui demandant de mettre à jour certains éléments.

Si vous pouvez être sûr que la tâche se termine en quelques secondes, utilisez une tâche asynchrone. Le système laisse quelques secondes à votre application pour effectuer ces tâches, même si elle était en arrière-plan.

Si la tâche prend plus de quelques secondes, il peut être judicieux de démarrer un service de premier plan pour la gérer. En fait, même si votre application est actuellement en arrière-plan, elle peut être autorisée à démarrer un service de premier plan si la tâche a été déclenchée par l'utilisateur et qu'elle relève de l'une des exceptions approuvées des restrictions de démarrage en arrière-plan. Par exemple, si une application reçoit un message FCM à priorité élevée, elle est autorisée à démarrer un service de premier plan, même si elle est en arrière-plan.

Si la tâche prend plus de quelques secondes, utilisez un travail en arrière-plan.