Raisons pour lesquelles l'intention passée serait NULL dans onStartCommand

100

Y a-t-il une autre raison pour laquelle l'intention qui est passée onStartCommand(Intent, int, int)serait NULL en plus du redémarrage du service par le système via un indicateur tel que START_STICKY?

De plus, lorsque le service est redémarré par le système, la Intent.getAction()méthode renvoie NULL ... parfois. L'intention n'est pas NULL justegetAction()

J'ai demandé ici aussi mais je n'ai pas encore reçu de réponse.

MISE À JOUR : Après avoir discuté avec Mark Murphy, il m'a suggéré de revenir START_REDELIVER_INTENTdans le onStartCommand()rappel dans mon service au lieu de START_STICKYpour que l'intégralité de l'intention soit envoyée après un redémarrage.

Je n'ai pas fait cela au départ parce que je craignais que si le service essayait de faire quelque chose, alors au milieu de ce quelque chose, le service a été redémarré ... reconnaîtra-t-il qu'il a commencé à faire quelque chose? Je suppose que c'est logique dont je devrai être responsable :)

rf43
la source
16
Plutôt que de modifier votre question avec la réponse, veuillez ajouter une réponse et l'accepter afin que votre question ne s'affiche plus dans l'ensemble des questions sans réponse - merci.
Dale Wilson
2
Juste une note pour quelqu'un avec un problème similaire. Je trouve que généralement quand je reçois erreur intentest nullsur onStartCommand(), elle est causée par une autre erreur qui est visible dans LogCat avant cela. Je ne sais pas pourquoi, mais c'est ce que j'ai observé et il est assez facile de l'ignorer.
Piotr Chojnacki
2
@DaleWilson je le ferais mais cette question n'est pas vraiment résolue. Jusqu'à ce que je reçoive une réponse définitive sur la raison pour laquelle une intention est nulle ou comment éviter une intention nulle sans recourir à l'utilisation de START_REDELIVER_INTENT (ce qui, j'ai appris plus tard, n'est pas ce dont j'avais besoin mais résoudra toujours les problèmes de certaines personnes, j'ai donc quitté ma modification) Je ne peux pas accepter de réponse.
rf43
@Mosquito Avez-vous remarqué ce qui provoquait une erreur?
rf43
1
@DDoSAttack Cela n'a pas vraiment d'importance. Dans mon cas, c'était par exemple NullPointerExceptionquelque part dans l'une des activités. Plus tard, ce fut une autre erreur. Mais dans les deux cas, ma trace de pile a montré que mon service - qui fonctionnait pendant que cette erreur se produisait - intentétait nullcomme dans votre cas. J'ai longtemps réfléchi à ce qui n'allait pas, quand j'ai décidé de faire défiler la trace de la pile et il est apparu que quelque part en haut j'avais ma vraie erreur. Après avoir résolu celui-ci, celui avec a également null intentdisparu.
Piotr Chojnacki

Réponses:

50

Je suis surpris qu'il n'y ait pas de discussion sur les drapeaux entrants. Je vais surveiller cela dans les journaux avec ce qui suit:

if (null == intent || null == intent.getAction ()) {
        String source = null == intent ? "intent" : "action";
        Log.e (TAG, source + " was null, flags=" + flags + " bits=" + Integer.toBinaryString (flags));
        return START_STICKY;
}

Mise à jour: les indicateurs étaient 0, il n'y avait donc rien de concret. J'ai laissé l'enregistrement nul là-dedans sans perte de fonction.

Edit: Ok, je l'ai trouvé dans la documentation de START_STICKY de tous les lieux! "s'il n'y a pas de commandes de démarrage en attente à livrer au service, il sera appelé avec un objet d'intention nul, vous devez donc prendre soin de vérifier cela."

http://developer.android.com/reference/android/app/Service.html

Eric Woodruff
la source
6
dans kotlin, l'intention est marquée comme non nulle et l'application plante l'applicationoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi
@MuhammadNaderi vous pouvez simplement faire une intention Intent?. A travaillé pour moi. Mais alors, bien sûr, vous devez gérer correctement l'intention nulle.
Patrick Boos
@PatrickBoos But then of course you need to correctly handle null intent; Que voulez-vous dire?! Comment? Merci.
Dr.jacky
Je voulais dire que dans votre code, onStartCommand(intent: Intent?, ...)cela devrait fonctionner. Et puis ne faites pas intent!!mais vérifiez correctement si l'intention est nulle.
Patrick Boos