Les applications doivent souvent effectuer plusieurs tâches à la fois. Les API Android offrent de nombreuses façons de procéder. Il est très important de choisir la bonne option. Une option peut être adaptée à une situation, mais pas du tout à une autre. Choisir les mauvaises API peut nuire aux performances ou à l'efficacité des ressources de votre application, 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 explique les différentes options disponibles et vous aide à choisir celle qui convient à 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 qu'une application effectue en dehors de son workflow principal. Pour que nous soyons sur la même longueur d'onde, nous avons classé ces types de tâches en trois catégories principales : le travail asynchrone, les API de planification des tâches et les services de premier plan.
Choisir la bonne option
Dans la plupart des cas, vous pouvez déterminer les API appropriées pour votre tâche en identifiant la catégorie (tâche asynchrone, API de planification des tâches ou services de premier plan) à laquelle elle appartient.
Si vous n'êtes toujours pas sûr, vous pouvez utiliser les organigrammes que nous fournissons, qui ajoutent plus de nuances à la 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 :
- La 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. Si le calcul était effectué sur le thread UI, l'utilisateur ne pourrait pas interagir avec l'application tant que le calcul ne serait pas terminé, ce qui pourrait 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 le travail asynchrone. Il est important de noter que, contrairement aux API de tâches en arrière-plan, le travail asynchrone n'est pas garanti de se terminer si l'application n'est plus dans une étape 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, bien que dans certains cas, il puisse ê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 complexes selon vos besoins. Vous pouvez utiliser WorkManager pour planifier l'exécution de tâches à des moments précis ou spécifier les conditions dans lesquelles la tâche doit s'exécuter. Vous pouvez même configurer des chaînes de tâches, de sorte que chaque tâche s'exécute à tour de rôle, en transmettant ses 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ération des données des capteurs (par exemple, les données du podomètre)
- Obtenir des données de localisation périodiques (vous devez disposer de l'autorisation
ACCESS_BACKGROUND_LOCATIONsur Android 10 ou version ultérieure) - Importer du contenu en fonction d'un déclencheur de contenu, comme des photos prises 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 imposer une charge importante à l'appareil et 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 dont les applications peuvent utiliser les services de premier plan et à quel moment. 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 que le service est 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 Compatibilité avec les nœuds de calcul de longue durée.
Toutefois, 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 des API pratiques pour faciliter la création d'un service de premier plan.
API alternatives
Le système propose d'autres API conçues pour offrir de meilleures performances dans des cas d'utilisation plus spécifiques. Si une autre API existe pour votre cas d'utilisation, nous vous recommandons de l'utiliser au lieu d'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 quand il existe une bonne API 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'autres API :
- 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 une vidéo, au lieu de créer un service de premier plan de lecture multimédia
Tâches initié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 que l'application est visible, répondez à ces questions pour trouver la bonne approche.
La tâche doit-elle continuer à s'exécuter lorsque l'application est 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 le travail asynchrone. Il existe plusieurs options pour effectuer des tâches asynchrones. Il est important de comprendre que toutes ces options cessent de fonctionner si l'application passe en arrière-plan. (Ils s'arrêtent également si l'application est fermée.) Par exemple, une application de réseau social peut vouloir actualiser son flux de contenu, mais elle n'a pas besoin de terminer l'opération si l'utilisateur quitte l'écran.
L'expérience utilisateur sera-t-elle mauvaise si la tâche est différée ou interrompue ?
Il est important de déterminer si l'expérience utilisateur sera 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 que l'appareil se recharge. 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 les autres services de premier plan et ne nécessitent pas autant d'autorisations. Toutefois, les services courts doivent se terminer en trois minutes.
Existe-t-il une API alternative juste pour cela ?
Si la tâche n'est pas invisible pour l'utilisateur, la solution appropriée peut consister à utiliser un service de premier plan. Ces services s'exécutent en continu une fois démarrés. Ils constituent donc un bon choix lorsque l'interruption de la tâche entraînerait une mauvaise 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 devez pas utiliser une option de tâche en arrière-plan, car si la tâche était mise en pause, le suivi s'arrêterait immédiatement. Dans une telle situation, un service de premier plan est le plus logique.
Toutefois, comme les services de premier plan peuvent potentiellement utiliser beaucoup de ressources de l'appareil, le système impose de nombreuses restrictions sur le moment et la manière dont ils peuvent être utilisés. 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 pour vous avec moins de difficultés. Par exemple, si votre application doit effectuer une action lorsque l'utilisateur arrive à un certain emplacement, la meilleure option consiste à utiliser l'API Geofence 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 des tâches 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 indiquant de mettre à jour certains éléments.
Si vous êtes certain que la tâche se terminera en quelques secondes, utilisez le travail asynchrone pour l'effectuer. Le système accorde 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 approprié 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 aux 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 exécutée en arrière-plan.
Si la tâche prend plus de quelques secondes, utilisez les API de planification des tâches.