web-dev-qa-db-fra.com

IntentService + startForeground vs JobIntentService

Depuis Android Oreo background execution limits, les docs recommandent de refactoriser IntentServices en JobIntentService.

https://developer.Android.com/about/versions/oreo/background

JobIntentService s'exécute immédiatement en tant que IntentService sous Oreo, mais planifie un Job sur Oreo +

https://developer.Android.com/reference/Android/support/v4/app/JobIntentService

Dans quels cas serait-il judicieux d'exécuter un IntentService normal comme premier plan Service avec une notification persistante, et quand un JobIntentService est-il préférable?

Un inconvénient que je peux voir dans JobIntentService est qu'il ne démarre pas immédiatement.

8
Florian Walther

Le service de premier plan n'est pas affecté par Doze, mais vous devez toujours utiliser des verrous de réveil, si vous avez besoin que votre tâche soit poursuivie lorsque l'écran est éteint.

Le JobIntentService (qui utilise le JobScheduler) gère les verrous de réveil pour vous, mais vous avez moins de contrôle sur le démarrage du travail.

J'utiliserais l'intentService (ou service) de premier plan pour des tâches de haute priorité (par exemple, le téléchargement d'une base de données) qui devraient s'exécuter immédiatement et qui ne devraient pas être interrompues/supprimées par le système.

J'utiliserais JobIntentService en conjonction avec AlarmManager pour planifier des tâches de faible priorité, comme l'actualisation périodique des données du widget.

5
Derek K

Si vous souhaitez effectuer une opération de longue durée, quelque chose comme Music Player, utilisez Foreground Service avec notification. car JobIntentService a une limite d'exécution de temps comme JobScheduler. ( 10 minutes)

Si vous pensez que l'utilisateur n'a pas besoin de connaître votre travail, vous pouvez utiliser JobIntentService sans notification.

Vous n'avez pas à vous soucier du mode Doze si l'utilisateur utilise activement votre application.

Il existe certains cas pour le mode Doze, selon https://www.bignerdranch.com/blog/diving-into-doze-mode-for-developers/

Light-Doze commence à se déclencher peu de temps après que l'écran soit éteint et que l'appareil ne se charge pas, n'attendant que quelques minutes avant d'appliquer les restrictions juste pour s'assurer que l'utilisateur a cessé d'utiliser son téléphone

Par exemple, l'utilisateur a désactivé l'écran pendant que vous calculez quelque chose. Votre tâche est terminée et vous souhaitez exécuter le service en arrière-plan. Dans ce cas, votre JobIntentService peut être différé, car le périphérique peut être en mode somnolence.

Cependant, si vous souhaitez effectuer immédiatement une opération en arrière-plan, utilisez ForegrounService avec WakeLock, car ForegroundService ne fonctionne pas lorsque l'écran est éteint.

2
Valgaal