Motivi per cui l'intento passato sarebbe NULL in onStartCommand


100

C'è qualche altra ragione per cui l'Intent che viene passato onStartCommand(Intent, int, int)sarebbe NULL oltre al sistema che riavvia il servizio tramite un flag come START_STICKY?

Inoltre, quando il servizio viene riavviato dal sistema, il Intent.getAction()metodo restituisce NULL ... a volte. L'intento non è solo NULLgetAction()

Ho chiesto anche qui ma non ho ancora ricevuto risposta.

AGGIORNAMENTO : Dopo aver chattato con Mark Murphy, mi ha suggerito di tornare START_REDELIVER_INTENTnella onStartCommand()richiamata nel mio servizio invece di in START_STICKYmodo che l'intero intento venga inviato dopo un riavvio.

Inizialmente non l'ho fatto perché ero preoccupato che se il servizio stava tentando di fare qualcosa, nel mezzo di quel qualcosa il servizio è stato riavviato ... riconoscerà che ha iniziato a fare quel qualcosa? Immagino sia logica di cui dovrò essere responsabile :)


16
Anziché modificare la tua domanda con la risposta, aggiungi una risposta e accettala in modo che la tua domanda non venga più visualizzata nella serie di domande senza risposta - grazie.
Dale Wilson

2
Solo una nota per qualcuno con problemi simili. Ho scoperto che di solito quando ricevo errore che intentè nullsu onStartCommand(), è causata da qualche altro errore che è visibile in LogCat prima di questo. Non so perché, ma è quello che ho osservato ed è abbastanza facile trascurarlo.
Piotr Chojnacki

2
@DaleWilson lo farei, ma questa domanda non è veramente risolta. Fino a quando non ricevo una risposta definitiva sul motivo per cui un intento è nullo o su come evitare un intento nullo senza ricorrere all'uso di START_REDELIVER_INTENT (che, ho appreso in seguito, non è ciò di cui avevo bisogno ma risolverà comunque i problemi di alcune persone, quindi ho lasciato la mia modifica) Non posso accettare una risposta.
rf43

@ Mosquito Ti è capitato di notare cosa, nello specifico, generava un errore?
rf43

1
@DDoSAttack Non importa davvero. Nel mio caso, ad esempio, era da NullPointerExceptionqualche parte in una delle Attività. Successivamente è stato un altro errore. Ma in entrambi i casi la mia traccia dello stack ha mostrato che il mio servizio, che era in esecuzione mentre si verificava questo errore, intentera nullcome nel tuo caso. Stavo pensando da molto tempo a cosa non andava, quando ho deciso di scorrere verso l'alto la traccia dello stack ed è apparso che da qualche parte in alto avevo il mio vero errore. Dopo aver risolto questo, anche quello con null intentscomparso.
Piotr Chojnacki

Risposte:


50

Sono sorpreso che non si discuta delle bandiere in arrivo. Lo monitorerò nei log con quanto segue:

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

Aggiornamento: i flag erano 0 quindi non c'era nulla di utilizzabile lì. Ho lasciato lì il controllo nullo senza perdita di funzionalità.

Modifica: ok, l'ho trovato nella documentazione di START_STICKY di tutti i posti! "se non ci sono comandi di avvio in sospeso da consegnare al servizio, verrà chiamato con un oggetto con intento nullo, quindi devi fare attenzione a verificarlo."

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


6
in kotlin, l'intento è contrassegnato come non nullo e l'app si bloccaoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi

@ MuhammadNaderi puoi solo fare l'intento Intent?. Ha funzionato per me. Ma poi ovviamente devi gestire correttamente l'intento nullo.
Patrick Boos

@PatrickBoos But then of course you need to correctly handle null intent; Cosa intendi?! Come? Grazie.
Dr.jacky

Intendevo solo nel tuo codice farlo onStartCommand(intent: Intent?, ...)funzionare. E poi non farlo, intent!!ma controlla correttamente se l'intento è nullo.
Patrick Boos
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.