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 aux tâches 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 homogène, nous avons classé ces éléments dans trois catégories principales de types de tâches : les tâches asynchrones, les API de planification de tâches 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 (tâche asynchrone, API de planification de tâches 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:
- Tâche lancée par l'utilisateur lorsque l'application est visible
- La tâche est lancée en réponse à un événement, interne ou externe.
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 aux API de tâches 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).
API de planification des tâches
Les API de planification des tâches 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 pour exécuter des tâches en arrière-plan 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:
- Utiliser des transferts de données initiés par l'utilisateur pour effectuer des téléchargements ou des importations volumineux, au lieu de créer un service de premier plan de synchronisation des données
- Utiliser le gestionnaire d'appareils associés pour l'association Bluetooth et le transfert de données, au lieu d'utiliser un service de premier plan d'appareil connecté
- Utiliser le mode Picture-in-picture pour lire des vidéos au lieu de créer un service de premier plan de lecture multimédia
Tâches lancées par l'utilisateur
Si une application doit effectuer des tâches 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 à s'exécuter lorsque l'application est 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 serait 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
Parfois, une application doit effectuer un travail en arrière-plan en réponse à un déclencheur, par exemple:
- Messages de diffusion
- Messages Firebase Cloud Messaging (FCM)
- Alarmes définies par l'application
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 les API de planification des tâches.