1

Avec les nouvelles restrictions de service d'arrière-plan introduites dans Oreo, j'ai du mal à trouver un endroit pour clarifier si IntentServices peut encore être lancé à partir d'un JobScheduler pendant que l'application est en arrière-plan.La restriction de service Android Oreo affecte les services intents des planificateurs de travaux?

J'ai une fonction très importante basée sur le geofencing qui doit exécuter un service d'intention après la rupture d'une clôture. J'ai passé beaucoup de temps à le mettre en place pour faire la queue des emplois lorsque les clôtures sont brisées et l'application est en DOZE pour Nougat. Lorsque le travail est finalement exécuté par le système d'exploitation lorsque la fenêtre de la connexion réseau est rouverte, je retire chaque travail l'un après l'autre dans un service d'intention. Est-ce que je ne peux plus le faire maintenant que techniquement je démarre un service alors que l'application n'est pas au premier plan ou est-ce toujours autorisé depuis que j'utilise le JobScheduler?

Répondre

0

Je fait quelques tests le week-end avec un pixel du travail et trouvé des choses intéressantes. Geofences encore déclenchée avec l'application en arrière-plan et le téléphone verrouillé, mais les restrictions de somnolence toujours appliquées. Mon planificateur de travaux a géré les restrictions de somnolence et l'intentionService tiré dans le travail a également fonctionné! Les déclencheurs pour les geofences étaient plutôt en retard comme prévu des nouvelles restrictions d'emplacement annoncées. Donc, la question principale de mon message est répondu.

Une chose très intéressante que j'ai remarquée. J'ai un service non lié régulier qui fonctionne en arrière-plan qui utilise l'API de localisation fusionnée et obtient l'emplacement toutes les 5 secondes. Dans l'émulateur 8.0, ce service a été arrêté environ 5 secondes après la mise en arrière-plan de l'application. Cependant, sur le pixel que j'ai eu, le service n'a jamais vraiment arrêté, il est devenu super retardé. Il a semblé attendre des intervalles de réveil de Doze, a retourné l'emplacement une fois et s'est rendormi. Je vais tester plus que j'ai le temps avant de les poster comme des modifications pour toute personne intéressée.

0

lire cet article [Explorer les limites d'exécution en arrière-plan sur Android Oreo]

https://medium.com/exploring-android/exploring-background-execution-limits-on-android-oreo-ab384762a66c espérons qu'il répondra à votre question

+1

Je lisais cet article avant que je pose cette question. C'est la même chose que 99% des ressources pour cette nouvelle restriction. Il dit JobScheduler est une alternative, mais ne va pas dans les détails sur son utilisation ou les spécificités pour engendrer IntentServices hors de lui. – Le2e410

+0

@ Le2e410 si je ne me trompe pas alors dans cet article il est clairement mentionné que "Pour commencer, la chose la plus importante à noter est que si vous essayez d'appeler startService() lorsque votre application n'est pas au premier plan, une exception IllegalStateException sera jeté. ". l'exception sera donc levée si vous essayez de démarrer votre service en arrière-plan quel que soit le composant qui démarre ce service. –

+0

Ouais, c'est ce que je pensais mais je n'étais pas sûr si puisque l'OS est celui qui lance les travaux c'est un travail autour. Cela me fait me demander ce qui se passe quand une geofence est cassée et que le système d'exploitation envoie le pendingIntent à votre intentionService. Il semble que geofences ne fonctionnera que lorsque votre application est au premier plan? C'est un très mauvais oubli si je ne manque pas quelque chose ici. – Le2e410

2

Vous ne devez pas supposer que votre application peut démarrer des services à partir d'un travail. En particulier, les applications sont souvent encore dans un état d'arrière-plan lorsque leurs travaux s'exécutent, et l'appel startService() alors que dans un état d'arrière-plan va jeter une exception. Bien sûr, il est toujours légal d'appeler startForegroundService(); Bien que cela ait évidemment des implications sur l'assurance-chômage.

JobIntentService est explicitement destiné à remplacer IntentService d'une manière qui est compatible avec les restrictions d'arrière-plan Android O +. Vous devriez envisager de passer à cela au lieu d'utiliser la classe de support IntentService héritée.