Create a background service [FRENCH] - nicolas-garcia/HowToXamarin GitHub Wiki
Background Service Android
Quelques liens vers mes recherches pour Android.
Background service
Des liens vers des ressources à propos des services d'arrière-plan. Comment les choisir et les mettre en place.
- Choisir un scheduler
- Exécuter une tâche périodique
- Doc Android sur les
Background Tasks - Doc Android pour
AlarmManager - Utiliser
AlarmManagerpour les tâches périodiques - Le
JobScheduler - Doc Microsoft sur les
Foreground Services - Exemple par Xamarin sur les
Foreground Services - Le mode Doze d'Android expliqué
- Un article résumant un peu tout et présentant des solutions
- Firebase JobDispatcher
Solution retenue
Au final, la ressource la plus intéressante était l'article résumant un peu tout.
- Un service de type
Android.App.Service, déclaré en tant queForegroundServicesur android 8.0+ - Un
HandlerThreadavec une prioritéBackground - Un
Handlerutilisant le précédentHandlerThread.Looper - Un
WakeLock Partialest acquis auprès duPowerManager - Toute les 5 secondes, une callback est exécuté effectuant un check est fait pour savoir si il faut envoyer un message via
AlarmService.SendPeriodicMessage()puis elle programme une autre callback pour dans 5 secondes viaHandler.PostDelayed()
Réserves
- Malgré cette solution, certains device (Huawei) rentrent quand même en mode Doze. Pour y remédier, il faut s'attacher au GPS, ça l'empêche de basculer en mode Doze. Après 60 minutes de WakeLock, Huawei semble tuer quand même l'application
Piste de résolution de ce problème ici - Sur mon One Plus 5, avec Android 8.0, la solution ne semble pas stable non plus
iOS
Quelques liens vers mes recherches pour iOS.
Application en Background
Sur iOS, toutes les applications ne peuvent pas tourner indéfiniment en arrière plan. Pour avoir ce privilège, il faut :
- Jouer du contenu audible en arrière plan, tel qu'un lecteur musical
- Enregister de l'audio en arrière plan
- Garder l'utilisateur informé de sa position à tout moment, tel une application de navigation
- Une application de VoIP
- Une application qui a besoin de télécharger et traiter du contenu régulièrement
- Une application qui reçoit des mise à jour régulières d'un accessoire externe
Dans cette liste, nous sommes éligible à 2 items :
- Garder l'utilisateur informé de sa position
- Recevoir des mise à jour régulière d'un accessoire externe (BLE)
Malheureusement, une application ne peut pas tourner indéfiniment en arrière plan sans rien faire, un watchdog veille au grain et tue tout ce qui bouge depuis plus de 600 secondes.
Les choix offerts par iOS pour une tâche périodique en arrière plan sont :
- Les tâches opportunistes : équivalent du mode Doze sur Android, le système prévoit des plages de "maintenance" pendant lesquelles les applications en fond sont autorisée à effectuer des actions.
- Les services de transfert en arrière plan : En gros, télécharger/envoyer un fichier.
- Intervalles déterminé par le système : L'application est réveillée à des intervalles définis par le système afin d'effectuer ses opérations.
- Notification push : L'application est réveillée par une notification push provenant d'APN. La notification peut être silencieuse et ne rien afficher à l'utilisateur.
En conclusion, la seule solution qu'il nous reste est la notification push. Petit détail, Apple se réserve le droit de limiter le nombre de notifications transmises via leurs serveurs APN. Cette limite est aujourd'hui inconnue.