Powody, dla których przekazana intencja miałaby wartość NULL w onStartCommand

100

Czy jest jakiś inny powód, dla którego przekazywana intencja onStartCommand(Intent, int, int)miałaby wartość NULL, poza ponownym uruchomieniem usługi przez system za pomocą flagi takiej jak START_STICKY?

Ponadto, gdy usługa jest ponownie uruchamiana przez system, Intent.getAction()metoda czasami zwraca NULL ... Intencja nie jest tylko NULLgetAction()

Tutaj też pytałem , ale nie otrzymałem jeszcze odpowiedzi.

AKTUALIZACJA : Po rozmowie z Markiem Murphym zasugerował, abym powrócił START_REDELIVER_INTENTw onStartCommand()oddzwonieniu w mojej usłudze zamiast START_STICKYtak, aby cała intencja została wysłana po ponownym uruchomieniu.

Nie zrobiłem tego początkowo, ponieważ obawiałem się, że jeśli usługa próbowała coś zrobić, to w połowie tego usługa została ponownie uruchomiona ... czy rozpozna, że ​​zaczęła coś robić? Myślę, że to logika, za którą będę musiał być odpowiedzialny :)

rf43
źródło
16
Zamiast edytować pytanie wraz z odpowiedzią, dodaj odpowiedź i zaakceptuj ją, aby Twoje pytanie przestało pojawiać się w zestawie pytań bez odpowiedzi - dziękuję.
Dale Wilson,
2
Tylko uwaga dla kogoś z podobnym problemem. Zauważyłem, że zwykle kiedy pojawia się błąd, który intentjest nullwłączony onStartCommand(), jest to spowodowane innym błędem, który jest wcześniej widoczny w LogCacie. Nie wiem dlaczego, ale właśnie to zauważyłem i dość łatwo to przeoczyć.
Piotr Chojnacki
2
@DaleWilson Chciałbym, ale to pytanie nie jest naprawdę rozwiązane. Dopóki nie otrzymam ostatecznej odpowiedzi, dlaczego intencja jest zerowa lub jak uniknąć zerowej intencji bez uciekania się do użycia START_REDELIVER_INTENT (co, jak się później dowiedziałem, nie jest tym, czego potrzebowałem, ale nadal rozwiąże problemy niektórych ludzi, więc zostawiłem swoją edycję) Nie mogę przyjąć odpowiedzi.
rf43
@Mosquito Czy zauważyłeś, co konkretnie powodowało błąd?
rf43
1
@DDoSAttack Nie ma znaczenia. W moim przypadku było to na przykład NullPointerExceptiongdzieś w jednym z działań. Później był to inny błąd. Ale w obu przypadkach mój ślad stosu pokazał, że moja usługa - która była uruchomiona, gdy wystąpił ten błąd - miała intenttak nulljak w twoim przypadku. Dość długo zastanawiałem się, co jest nie tak, gdy zdecydowałem się przewinąć ślad stosu i okazało się, że gdzieś na górze mam swój prawdziwy błąd. Po rozwiązaniu tego, null intentzniknął również ten z .
Piotr Chojnacki

Odpowiedzi:

50

Dziwię się, że nie ma dyskusji na temat nadchodzących flag. Mam zamiar monitorować to w dziennikach za pomocą:

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

Aktualizacja: flagi były 0, więc nie było tam nic do podjęcia. Zostawiłem tam zerową odprawę bez utraty funkcji.

Edycja: Ok, znalazłem to w dokumentacji START_STICKY wszystkich miejsc! „Jeśli nie ma żadnych oczekujących poleceń uruchomienia, które mają być dostarczone do usługi, zostanie wywołana z obiektem o zerowej intencji, więc musisz uważać, aby to sprawdzić”.

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

Eric Woodruff
źródło
6
w kotlinie intencja jest oznaczona jako niezerowa i powoduje awarię aplikacjioverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Muhammad Naderi
@MuhammadNaderi możesz po prostu zamienić zamiar Intent?. Pracował dla mnie. Ale wtedy oczywiście musisz poprawnie obsługiwać intencję zerową.
Patrick Boos,
@PatrickBoos But then of course you need to correctly handle null intent; Co masz na myśli?! W jaki sposób? Dzięki.
Dr Jacky
Miałem na myśli, że tylko w twoim kodzie onStartCommand(intent: Intent?, ...)powinno działać. A potem po prostu nie rób, intent!!ale poprawnie sprawdź, czy intencja jest zerowa.
Patrick Boos