Android O - Ancien service de premier plan au démarrage fonctionnant toujours?
Donc, avec Android O, vous avez besoin de votre service en cours d'exécution comme un avant-plan service si vous souhaitez recevoir plus que juste un peu de l'emplacement des mises à jour à l'heure.
J'ai remarqué que l'ancienne méthode de démarrage d'un premier plan de service ne semble pas fonctionner sur O.
c'est à dire
startForeground(NOTIFICATION_ID, getNotification());
Selon les changements de comportement guide ici:
https://developer.android.com/preview/behavior-changes.html
La NotificationManager.startServiceInForeground() méthode commence par un premier plan de service. L'ancienne façon de commencer un premier plan de service ne fonctionne plus.
Si la nouvelle méthode ne fonctionne que lorsque le ciblage de O, il semble que l'ancienne méthode qui semble fonctionner sur un joint périphérique si le ciblage de O ou pas.
Modifier
Y compris par exemple:
Google exemple de projet LocationUpdatesForegroundService a effectivement un exemple de travail où vous pouvez voir le problème de première main.
https://github.com/googlesamples/android-play-location/tree/master/LocationUpdatesForegroundService
La startForeground méthode semble fonctionner sans problème si le ciblage et la compilation à l'encontre de l'API de niveau 25 OU le ciblage et la compilation de contre O (comme indiqué ici: https://developer.android.com/preview/migration.html#uya)
Donc, à reproduire:
- Configurer l'application gradle comme mentionné dans le précédent lien
- Ouvrez l'application
- Demande de l'emplacement des mises à jour
- Fermer l'application (soit via le bouton de retour ou le bouton d'accueil)
Service est en cours d'exécution dans le premier plan (indiqué par l'icône de notification de l'ombre). Emplacement des mises à jour sont à venir à travers comme prévu (toutes les 10 secondes), même sur un dispositif en cours d'exécution O. Ce que je suis en manque ici?
source d'informationauteur the_new_mr
Vous devez vous connecter pour publier un commentaire.
Cela a fonctionné pour moi.
Espère que ça fonctionne!
Vous commencez généralement à votre service à partir d'un récepteur de radiodiffusion à l'aide de
startService
. Ils disent qu'il n'est plus possible (ou fiabilité) pour appelerstartService
car il existe maintenant d'arrière-plan des limites, de sorte que vous devez appelerstartServiceInForeground
à la place. Cependant à partir de docs c'est pas vraiment clair lorsque cela se produit parce que l'application est dans la liste blanche lorsqu'il reçoit une diffusion de l'intention, de sorte qu'il ne sait pas exactement quandstartService
jetteIllegalStateException
.L'héritage de façon de commencer un premier plan de service fonctionne même quand l'application est au premier plan, mais la méthode recommandée pour démarrer un premier plan de service pour les Applications qui ciblent les API de niveau 26/Android O est l'utilisation de la nouvellement introduite NotificationManager#startServiceInForeground méthode pour créer un premier plan de service dans la première place.
L'ancien mode de démarrage du service en arrière-plan puis en faire la promotion à l'avant-plan ne fonctionnera pas si l'application est en arrière-plan, en raison de l'exécution en arrière-plan des limites de Android O.
Processus de Migration, et des mesures sont documentés ici. https://developer.android.com/preview/features/background.html#migration
Dans l'Activité (ou de tout contexte que démarre le premier plan de service), appelons cela:
Lorsque le service a commencé, créer un canal de notification à l'aide du code similaire à ce que Android docs direpuis créer un et de l'utiliser:
Comme aussi @Kislingk mentionné dans un commentaire
NotificationManager.startServiceInForeground
a été supprimé. Il a été marqué comme obsolète w/la s'engager 08992ac.À partir de la validation du message:
- Je ajouter de l'échantillon si certains ont besoin avec backstack constructeur