Ainsi, avec Android O, vous devez faire fonctionner votre service en tant que service de premier plan si vous voulez recevoir plus que quelques mises à jour de localisation par heure.
J'ai remarqué que l'ancienne méthode pour démarrer un service en avant-plan semble fonctionner sur O. c'est-à-dire
startForeground(NOTIFICATION_ID, getNotification());
Selon le guide des changements de comportement ici : https://developer.Android.com/preview/behavior-changes.html
La méthode NotificationManager.startServiceInForeground() démarre un service en avant-plan. L'ancienne méthode pour démarrer un service en avant-plan ne fonctionne plus.
Bien que la nouvelle méthode ne fonctionne qu'en ciblant O, il semble que l'ancienne méthode fonctionne toujours sur un appareil O, qu'il cible O ou non.
Modifier Y compris l'exemple :
Le projet d'exemple de Google, LocationUpdatesForegroundService, contient un exemple fonctionnel qui vous permet de constater le problème de visu. https://github.com/googlesamples/Android-play-location/tree/master/LocationUpdatesForegroundService
La méthode startForeground semble fonctionner sans problème, qu'elle soit ciblée et compilée par rapport au niveau 25 de l'API OU ciblée et compilée par rapport au niveau O (comme indiqué ici) : https://developer.Android.com/preview/migration.html#uya )
Donc, pour reproduire :
- Configurez l'application gradle comme mentionné dans le lien précédent.
- Ouvrez l'application
- Demander des mises à jour de l'emplacement
- Fermez l'application (soit par le bouton retour, soit par le bouton d'accueil).
Le service est en cours d'exécution au premier plan (indiqué par une icône dans l'ombre de notification). Les mises à jour de localisation arrivent comme prévu (toutes les 10 secondes), même sur un appareil fonctionnant sous O. Qu'est-ce que j'ai raté ?
1 votes
Mon interprétation de cette partie de la documentation est qu'en utilisant
startServiceinForeground()
est moins risqué, au cas où vous seriez en arrière-plan et sur le point de perdre la possibilité de lancer des services d'arrière-plan.0 votes
D'après la lecture de la section developer.Android.com/preview/behavior-changes.html#abll Il est écrit que le démarrage d'un service au premier plan ne fonctionne pas du tout dans Android O (du moins lorsqu'on le cible). J'ai juste été surpris de voir que cela fonctionne malgré cette phrase dans la documentation. Donc, si une application conserve le SDK cible < 26 et s'assure de démarrer un service au premier plan en utilisant l'ancienne méthode startForeground(), tout devrait bien se passer ?
0 votes
Il vaut mieux que ça aille, sinon beaucoup d'applications vont se casser.
0 votes
Oui, c'est ce que je pensais. Mais je me disais aussi qu'il s'agissait peut-être d'une approche de Google visant à les faire sortir de l'eau pour empêcher les batteries des utilisateurs d'être détruites par des applications qui font des choses en arrière-plan et épuisent la batterie.
0 votes
C'est juste moi ou il n'y a pas
startServiceinForeground()
méthode dans NotificationManager ?1 votes
Je pense qu'ils ont changé l'API depuis ODP1. Mais attention. Ils ne semblent pas avoir mis à jour tous les documents. developer.Android.com/about/versions/oreo/
0 votes
Mes deux centimes : le démarrage d'un service à partir d'une diffusion explicite et personnalisée, et le fait de ne pas le faire "à la manière d'Android O" fait que mon application plante sur Android O, lorsqu'elle cible Android O. J'ai dû faire les ajustements documentés pour me débarrasser du plantage.
0 votes
Oui, cela fonctionne pour moi aussi, mais le coût est que votre service sera tué par le système dès que votre application est inactive. C'est en tout cas ce qui se passe dans mon cas. Mon service recherche les appareils BTLE et je ne veux PAS que le système tue ce service lorsque mon application n'est plus au premier plan !
0 votes
Je crois que startService ne fonctionne que lorsque l'application est au premier plan.