Razones por las que el Intent pasado sería NULL en onStartCommand

100

¿Hay alguna otra razón por la que el Intent que se pasa onStartCommand(Intent, int, int)sea ​​NULL además de que el sistema reinicie el servicio a través de una bandera como START_STICKY?

Además, cuando el sistema reinicia el servicio, el Intent.getAction()método devuelve NULL ... a veces. La intención no es NULL sologetAction()

También pregunté aquí, pero todavía no he recibido una respuesta.

ACTUALIZACIÓN : Después de conversar con Mark Murphy, sugirió que regresara START_REDELIVER_INTENTen la onStartCommand()devolución de llamada en mi servicio en lugar de START_STICKYenviar la intención completa después de un reinicio.

No hice esto inicialmente porque me preocupaba que si el servicio intentaba hacer algo, en medio de ese algo, el servicio se reiniciaba ... ¿reconocerá que comenzó a hacer ese algo? Supongo que esa es la lógica de la que tendré que ser responsable :)

rf43
fuente
16
En lugar de editar su pregunta con la respuesta, agregue una respuesta y acéptela para que su pregunta deje de aparecer en el conjunto de preguntas sin respuesta. Gracias.
Dale Wilson
2
Solo una nota para alguien con un problema similar. He descubierto que por lo general cuando llegue error que intentes nullel onStartCommand(), que es causado por algún otro error que es visible en LogCat antes de esto. No sé por qué, pero esto es lo que observé y es bastante fácil pasarlo por alto.
Piotr Chojnacki
2
@DaleWilson Lo haría, pero esta pregunta no está realmente resuelta. Hasta que reciba una respuesta definitiva sobre por qué un Intent es nulo o cómo evitar un intent nulo sin recurrir al uso de START_REDELIVER_INTENT (que, según supe más tarde, no es lo que necesitaba pero aún resolverá los problemas de algunas personas, por lo que dejé mi edición) No puedo aceptar una respuesta.
rf43
@Mosquito ¿Se dio cuenta de qué, específicamente, estaba arrojando un error?
rf43
1
@DDoSAttack Realmente no importa. En mi caso fue, por ejemplo, NullPointerExceptionen algún lugar de una de las Actividades. Más tarde fue algún otro error. Pero en ambos casos, mi seguimiento de pila mostró que mi servicio, que se estaba ejecutando mientras ocurría este error, intentera nullcomo en su caso. Estuve pensando durante bastante tiempo en lo que estaba mal, cuando decidí desplazarme hacia arriba en el seguimiento de la pila y parecía que en algún lugar de la parte superior tenía mi verdadero error. Después de resolver este, también null intentdesapareció el que tenía .
Piotr Chojnacki

Respuestas:

50

Me sorprende que no haya discusión sobre las banderas entrantes. Voy a monitorear esto en los registros con lo siguiente:

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;
}

Actualización: las banderas eran 0, por lo que no había nada procesable allí. Dejé el cheque nulo allí sin pérdida de función.

Editar: Ok, lo encontré en la documentación de START_STICKY de todos los lugares. "Si no hay ningún comando de inicio pendiente para entregar al servicio, se llamará con un objeto de intención nula, por lo que debe tener cuidado de verificar esto".

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

Eric Woodruff
fuente
6
en kotlin, la intención está marcada como no nula y bloquea la aplicaciónoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi
@MuhammadNaderi, puedes intentarlo Intent?. Trabajó para mi. Pero, por supuesto, debe manejar correctamente la intención nula.
Patrick Boos
@PatrickBoos But then of course you need to correctly handle null intent; ¡¿Qué quieres decir?! ¿Cómo? Gracias.
Dr.jacky
Me refiero a que solo en tu código onStartCommand(intent: Intent?, ...)debería funcionar. Y luego simplemente no lo haga, intent!!pero verifique correctamente si la intención es nula.
Patrick Boos