Gründe, warum die übergebene Absicht in onStartCommand NULL ist

100

Gibt es einen anderen Grund dafür, dass die Absicht, an onStartCommand(Intent, int, int)die übergeben wird, NULL ist, außer dass das System den Dienst über ein Flag wie neu startet START_STICKY?

Wenn der Dienst vom System neu gestartet wird, gibt die Intent.getAction()Methode manchmal NULL zurück ... manchmal. Absicht ist nicht nur NULLgetAction()

Ich habe auch hier gefragt , aber noch keine Antwort erhalten.

UPDATE : Nachdem er mit Mark Murphy gesprochen hatte, schlug er vor, dass ich START_REDELIVER_INTENTden onStartCommand()Rückruf in meinem Dienst zurückgeben sollte, anstatt START_STICKYdass die gesamte Absicht nach einem Neustart gesendet wird.

Ich habe dies anfangs nicht getan, weil ich befürchtet hatte, dass der Dienst mitten in diesem Vorgang neu gestartet wurde, wenn der Dienst versuchte, etwas zu tun. Wird er erkennen, dass er damit begonnen hat, etwas zu tun? Ich denke, das ist Logik, für die ich verantwortlich sein muss :)

rf43
quelle
16
Anstatt Ihre Frage mit der Antwort zu bearbeiten, fügen Sie bitte eine Antwort hinzu und akzeptieren Sie sie, damit Ihre Frage nicht mehr in den unbeantworteten Fragen angezeigt wird - danke.
Dale Wilson
2
Nur eine Notiz für jemanden mit ähnlichen Problemen. Ich fand , dass in der Regel , wenn ich Fehler erhalten, intentist nullauf onStartCommand(), es durch einen anderen Fehler verursacht wird , die in LogCat bevor diese sichtbar ist. Ich weiß nicht warum, aber das habe ich beobachtet und es ist ziemlich leicht, es zu übersehen.
Piotr Chojnacki
2
@ DaleWilson würde ich, aber diese Frage ist nicht wirklich gelöst. Bis ich eine endgültige Antwort darauf erhalte, warum eine Absicht null ist oder wie eine Null-Absicht vermieden werden kann, ohne auf START_REDELIVER_INTENT zurückzugreifen (was, wie ich später erfuhr, nicht das ist, was ich brauche, aber dennoch die Probleme einiger Leute lösen wird, habe ich meine Bearbeitung verlassen). Ich kann keine Antwort akzeptieren.
RF43
@Mosquito Haben Sie zufällig bemerkt, was speziell einen Fehler ausgelöst hat?
RF43
1
@DDoSAttack Ist nicht wirklich wichtig. In meinem Fall war es zum Beispiel NullPointerExceptionirgendwo in einer der Aktivitäten. Später war es ein anderer Fehler. Aber in beiden Fällen mein Stack - Trace zeigte , dass mein Service - die ausgeführt wurde , während dieser Fehler aufgetreten ist - hatte intentdas war nullwie in Ihrem Fall. Ich habe ziemlich lange darüber nachgedacht, was los ist, als ich mich entschied, den Stack-Trace nach oben zu scrollen, und es schien, dass ich irgendwo oben meinen wahren Fehler hatte. Nach dem Lösen dieses Problems ist auch der mit null intentverschwunden.
Piotr Chojnacki

Antworten:

50

Ich bin überrascht, dass es keine Diskussion über die eingehenden Flaggen gibt. Ich werde dies in den Protokollen wie folgt überwachen:

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

Update: Flags waren 0, daher war dort nichts umsetzbar. Ich habe den Null-Check dort ohne Funktionsverlust belassen.

Edit: Ok, ich habe es ausgerechnet in der Dokumentation von START_STICKY gefunden! "Wenn keine ausstehenden Startbefehle an den Dienst übermittelt werden sollen, wird dieser mit einem Null-Intent-Objekt aufgerufen. Sie müssen daher darauf achten, dies zu überprüfen."

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

Eric Woodruff
quelle
6
In Kotlin ist die Absicht als nicht null markiert und die App stürzt aboverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi
@ MuhammadNaderi können Sie nur die Absicht machen Intent?. Hat für mich gearbeitet. Aber dann müssen Sie natürlich mit Null Intent korrekt umgehen.
Patrick Boos
@PatrickBoos But then of course you need to correctly handle null intent; Was meinst du?! Wie? Vielen Dank.
Dr.jacky
Ich meinte nur in Ihrem Code machen, dass onStartCommand(intent: Intent?, ...)es funktionieren sollte. Und dann tun Sie es einfach nicht, intent!!sondern überprüfen Sie korrekt, ob die Absicht null ist.
Patrick Boos