Personnalisé JobIntentService onHandleWork pas appelé
J'ai récemment été mise à jour d'une application que je travaille pour gérer les notifications de push à l'aide d'un JobIntentService au lieu de régulièrement IntentService car il semble que la bonne façon de gérer cette pré-sucette appareils ainsi que la poste. Je suis enqueueing travail en tant que tel:
enqueueWork(context, MyJobServiceExtension.class, JOB_ID, work);
C'est le manifeste de la déclaration:
<service android:name="com.example.MyJobServiceExtension"
android:permission="android.permission.BIND_JOB_SERVICE"
android:exported="true"
tools:node="replace">
Je ne vois jamais de rappels dans onHandleWork ou les journaux d'erreurs dans mon logcat. Quelqu'un a réussi à intégrer ce qui pourrait aider?
Mise à jour: j'ai testé cela sur une api de niveau 21 de l'appareil et cela a fonctionné.. mais il ne semble pas être appelé sur mon android O pixel XL appareil.. Des indices quant à pourquoi?
Mise à jour #2: Aussi, j'ai l'impression de voir le intentservice du onCreate être appelé, mais aucun de l'autre du cycle de vie des méthodes (y compris onHandleWork). Quelqu'un a rencontré ce soit?
- J'ai les mêmes symptômes, mais pas encore de réponse. Fonctionne très bien sur une API de niveau 23 de l'appareil, pas sur l'API de niveau 26 Nexus 5X. Comment est votre
work
Intention construit? - actuellement, mon travail, l'intention est construit avec une action personnalisée, plus quelques extras et c'est tout.
- J'ai le même problème, en fait, je reçois ce message "JobServiceContext: Time-out, tout en essayant de se lier..."
Vous devez vous connecter pour publier un commentaire.
J'ai eu le même problème après la mise à niveau à partir de IntentService à JobIntentService. Assurez-vous que vous retirez de cette méthode à partir de votre ancien de mise en œuvre:
Pour moi, cela a résolu le problème, et maintenant il fonctionne à la fois sur la pré - et de post-Oreo.
J'ai eu le même problème (qui a bien fonctionné sur un pré-O de l'appareil, aucune indication de quelque chose qui se passe, que ce soit sur un joint périphérique). Aujourd'hui, j'ai essayé de nouveau avec exactement le même code que hier, maintenant il fonctionne seule différence est que j'ai redémarré l'appareil entre les deux.
Ma théorie actuelle est que mon premier programme d'installation n'a pas fonctionné; mes que l'on fait et juste redéploiement nouveau code n'est pas clair sur les brisées de l'état de la JobScheduler; un redémarrage ou une désinstallation/réinstallation du paquet n'.
Le programme d'installation qui travaille maintenant (migré à partir d'un ancien IntentService):
et de commencer avec
Noter que l'intention est pas une intention explicite (c'est à dire, la Nomcomposant n'est pas défini).
startForegroundService
avecJobIntentService.enqueueWork
réussi à le faire fonctionner pour moi sur API 26.android:exported="true"
. Je viens de testerJe suis tombé sur cette question en essayant de mettre en file d'attente le
JobIntentService
à l'aide deJobScheduler
. Alors queJobScheduler
a son propre enqueueWork() la méthode, il ne fonctionne pas avecJobIntentService
. Le service démarre, mais onHandleWork() n'est jamais appelée.Il a commencé à travailler à nouveau lorsque j'ai utilisé la statique enqueueWork() méthode qui est sur le JobIntentService - eg:
MyJobIntentService.enqueueWork(context, ...)
Ce n'était pas évident à la lecture de Android javadoc.
C'est ce qui a fonctionné pour moi,
Supprimer la
IBind
Remplacer comme suggéré par @agirardelloet a ajouté ce qui suit
N'ai aucune idée de pourquoi cela a fonctionné.
Si vous avez remplacé le
onCreate
méthode dans votreJobIntentService
, elle permettra d'éviter le onHandleWork à être appelé.J'ai converti mon
Service
àJobIntentService
et seulement après j'ai enlevé leonCreate
méthode, il a travaillé.J'ai rencontré un peu le même problème avec
onHandleWork
pas être appelé la deuxième fois, après la migration deService
àJobIntentService
. Les journaux indiquent queenqueueWork
a été appelé, maisonHandleWork
était en cours d'exécution seulement la première et semblait être coincé.Après certains plus de creuser et de journalisation, j'ai découvert que la différence est que dans un "coincé" scénario il n'y a
JobIntentService#onDestroy
même si toutes les opérations dansonHandleWork
ont été effectuées et apparemment fini.S'est avéré que le coupable était
bindService
appel de service à l'activité du cycle de vie qui a été la prévention de l'élimination du premier emploi et pour une raison que l'appel deenqueueWork
après cette condition était à l'origine du service "coincé" et de ne jamais exécuter une des opérations suivantesonHandleWork
de nouveau.Donc, ici, c'est un mauvais journal d'événements dans lesquels
JobIntentService
semble être coincé après le premier appel n'déclenchementonHandleWork
de nouveau:Et ici est le bon journal des événements avec
JobIntentService
fonctionne correctement après la suppression debindService
appel:Espère que ce sera utile à quelqu'un.
Pour moi, j'étais toujours en partant le service après enqueueWork et me donnait de l'erreur à cause de cela.
Juste essayer de sortir et de l'exécution de l'Android à nouveau en Studio. Puis tester à nouveau.
Dans mon cas, la version d'Android Studio est v 3.3.1.
Voir l'exemple de code qui fonctionne correctement.
//début de la JobIntentService que vous en avez besoin.
CustomizedIntentService.enqueueJobAction(contexte, CustomizedIntentService.MY_ACTION);
Aussi drôle que cela puisse paraître, l a eu un problème similaire, parce que l ne change pas le nom de la classe à son propre nom dans le enqueueWork() parce que l copié le code d'une de mes classes.
Après l fait la mise à jour il a commencé à travailler correctement.
J'ai enfin trouvé la solution pour ce problème LoL
Si vous remplacez le "onBind" méthode et u appeler le travail à l'aide de la "enqueueWork" méthode, vous devez retourner la liaison vers le moteur de la ce:
Afin de retourner l'IBinder de la "super.onBind" la méthode, de sorte que vous devez utiliser pour se lier à la JobIntentService.
Si vous souhaitez lier et de revenir un autre classeur, vous pouvez le faire:
Donc en commençant par vous "onHandleWork" dans un autre Thread.
De cette façon, vous pouvez utiliser:
"bindService(....., JobIntentService.BIND_AUTO_CREATE);"
de lier le service et le retour de votre Classeur.
De toute façon quand vous séparer de service, le service va se faire tuer, et si elle est toujours exécuter vous ne pouvez pas lier de nouveau à elle, car le service a été tué, mais le thread dans lequel le "onHandleWork" est toujours en cours...
Alors je vous suggérons d'utiliser cette version est disponible uniquement si vous avez à faire une tâche qui a besoin de communiquer avec l'activité jusqu'à ce qu'elle est en vie et le besoin de continuer à travailler si l'activité a été tué (sans la possibilité de se lier à nouveau le jobService, mais seulement pour en commencer une nouvelle...)
Pour ne pas tuer le service après la unbind vous avez besoin pour démarrer en "premier plan", le "stopForeground" dans le "onDestroy". De cette façon, vous service être encore en vie juste pour le thread qui est de la manipulation de la "onHandleWork" méthodes.
J'espère que google va résoudre ce sh*t rapide LoL, j'ai converti l'ensemble de l'ancien "Service" et "IntentService" à la nouvelle de l'emploi mais... ils travaillent vraiment pire qu'avant!
Bye, ont une belle codage 😉
Pour tout le monde qui ne pouvait pas résoudre le problème avec les autres réponses:
Essayez d'utiliser le JOB_IDs chaque fois enqueueWork est appelé. Si un travail précédent n'a pas fini d', le Service peut juste être coincé (similaire au problème de l'utilisateur "git pull origin" a décrit) et un nouveau travail avec un ID différent peut-être de résoudre ce problème.
Je pense que avez ce problème, depuis que j'ai essayer de porter un Toast du texte à l'intérieur de
onHandleWork()
, mais en fait le problème était que c'était mal et que je devrais utiliser un Gestionnaire. Il est peut-être le problème si on utilise par exempleAsyncTask
des sous-classes pour l'exécuter sur un autre fil à l'intérieur deonHandleWork()
, ce qui est une très mauvaise idée.