Les applications doivent souvent effectuer plusieurs tâches à la fois. Les API Android proposent de nombreuses façons de procéder. Le choix de la bonne option est très important. Une option peut être adaptée à une situation, mais très inappropriée dans 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 décrit les différentes options disponibles 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 conditions.
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 le cadre de 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 commune, nous avons regroupé les 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 à utiliser pour votre tâche en identifiant la catégorie (travail asynchrone, les API de planification des tâches ou les services de premier plan) à laquelle elle appartient.
Si vous n'êtes toujours pas sûr, vous pouvez utiliser les organigrammes que nous fournissons, qui apportent plus de nuances à la décision. Chacune de ces options est décrite plus en détail dans la suite de ce document.
Il existe deux scénarios principaux à prendre en compte pour les tâches en arrière-plan:
- Tâche déclenché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 n'a besoin que d'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 d'UI, l'utilisateur ne pourrait pas interagir avec l'application tant que le calcul n'est 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. Notez que, contrairement aux API de tâche en arrière-plan, il n'est pas garanti que le travail asynchrone se termine si l'application ne se trouve 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 de la plate-forme JobScheduler
.
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 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 afin que chacune d'elles s'exécute à son tour, en transmettant ses résultats à la suivante. Pour connaître toutes les options disponibles, consultez la liste des fonctionnalités WorkManager.
Voici quelques-uns des scénarios les plus courants pour les tâches en arrière-plan:
- Extraire des données du serveur régulièrement
- 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_LOCATION
sur Android 10 ou version ultérieure) - Importer du contenu en fonction d'un déclencheur de contenu, comme les 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 mettre une charge importante sur l'appareil, et parfois avoir des conséquences sur la confidentialité et la sécurité. Pour ces raisons, le système impose de nombreuses restrictions sur la façon et le moment où les applications peuvent utiliser des services de premier plan. Par exemple, un service de premier plan doit être visible par l'utilisateur. 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 la section 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 toutes les mêmes restrictions que n'importe quel autre service de premier plan.
WorkManager fournit simplement des API pratiques pour simplifier 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 pour des cas d'utilisation plus spécifiques. Si une autre API existe pour votre cas d'utilisation, nous vous recommandons de l'utiliser à la place d'un service de premier plan, car elle devrait améliorer les performances de votre application. La documentation sur les types de services de premier plan indique quand une API de remplacement est disponible à 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:
- Utilisation de transferts de données déclenchés par l'utilisateur pour effectuer de gros téléchargements ou importations, au lieu de créer un service de premier plan de synchronisation des données
- Utilisation du 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 déclenché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 lorsque 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 un 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 a quitté 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 composants, 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 tâche 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 autre API à cette fin ?
Si la tâche n'est pas invisible pour l'utilisateur, la solution appropriée peut être d'utiliser un service de premier plan. Une fois lancés, ces services s'exécutent en continu. Ils sont 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 position pour permettre aux utilisateurs d'enregistrer leur parcours de jogging sur une carte. Vous ne souhaitez pas le faire 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 ce cas, un service de premier plan est le plus approprié.
Toutefois, comme les services de premier plan peuvent potentiellement utiliser de nombreuses 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 à votre place avec moins de difficultés. Par exemple, si votre application doit effectuer une action lorsque l'utilisateur arrive à un certain endroit, 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 demandant de mettre à jour certains éléments.
Si vous pouvez être sûr que la tâche se terminera en quelques secondes, utilisez le travail asynchrone pour l'effectuer. Le système accorde à votre application quelques secondes pour effectuer ces tâches, même si elle s'exécute 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, il est possible qu'elle soit autorisée à démarrer un service de premier plan, si la tâche a été déclenchée par l'utilisateur et qu'elle fait partie 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 en arrière-plan.
Si la tâche prend plus de quelques secondes, utilisez les API de planification des tâches.