Причины, по которым переданное намерение будет NULL в onStartCommand

100

Есть ли какая-либо другая причина, по которой намерение, которое передается onStartCommand(Intent, int, int), будет NULL, кроме перезапуска системы с помощью флага, такого как START_STICKY?

Кроме того, когда служба перезапускается системой, Intent.getAction()метод иногда возвращает NULL ... Намерение не равно NULL, простоgetAction()

Я тоже здесь спрашивал, но пока не получил ответа.

ОБНОВЛЕНИЕ : после разговора с Марком Мерфи он предложил мне вернуться START_REDELIVER_INTENTв обратном onStartCommand()вызове в моей службе вместо того, START_STICKYчтобы все намерение отправлялось после перезапуска.

Я не делал этого изначально, потому что был обеспокоен тем, что если служба пытается что-то сделать, то в середине этого чего-то служба была перезапущена ... распознает ли она, что она начала что-то делать? Думаю, это логика, за которую я должен нести ответственность :)

rf43
источник
16
Вместо того, чтобы редактировать свой вопрос с ответом, добавьте ответ и примите его, чтобы ваш вопрос перестал отображаться в наборе вопросов без ответа - спасибо.
Дейл Уилсон
2
Просто примечание для кого-то с похожей проблемой. Я обнаружил , что обычно , когда я получаю сообщение об ошибке , что intentэто nullна onStartCommand(), это вызвано какой - либо другой ошибки , которая видна в LogCat до этого. Не знаю почему, но это то, что я наблюдал, и это довольно легко не заметить.
Piotr Chojnacki
2
@DaleWilson Я бы хотел, но этот вопрос еще не решен. Пока я не получу окончательный ответ о том, почему намерение равно нулю или как избежать нулевого намерения, не прибегая к использованию START_REDELIVER_INTENT (что, как я позже узнал, не то, что мне нужно, но все же решит проблемы некоторых людей, поэтому я оставил свое редактирование) Я не могу принять ответ.
rf43
@Mosquito Вы случайно не заметили, что именно выдает ошибку?
rf43
1
@DDoSAttack На самом деле не имеет значения. В моем случае это было, например, NullPointerExceptionгде-то в одном из Activity. Позже была другая ошибка. Но в обоих случаях моя трассировка стека показала, что моя служба - которая работала во время возникновения этой ошибки - имела intentто же самое, что nullи в вашем случае. Я довольно долго думал, что случилось, когда решил прокрутить трассировку стека вверх и оказалось, что где-то наверху у меня была настоящая ошибка. После решения этого null intentпропал и тот, у которого .
Piotr Chojnacki

Ответы:

50

Я удивлен, что нет обсуждения входящих флагов. Я собираюсь отслеживать это в журналах следующим образом:

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

Обновление: флаги были равны 0, поэтому там не было никаких действий. Я оставил там нулевую проверку без потери функции.

Изменить: Хорошо, я нашел это в документации START_STICKY всех мест! «если в службе нет ожидающих команд запуска, она будет вызываться с объектом с нулевым намерением, поэтому вы должны проверить это».

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

Эрик Вудрафф
источник
6
в котлине намерение помечено как ненулевое, и это приводит к сбою приложенияoverride fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {}
Мухаммад Надери
@MuhammadNaderi, ты можешь просто задуматься Intent?. Работал у меня. Но тогда, конечно, вам нужно правильно обрабатывать нулевое намерение.
Патрик Боос,
@PatrickBoos But then of course you need to correctly handle null intent; Что вы имеете в виду?! Как? Спасибо.
Доктор Джеки
Я имел в виду, что onStartCommand(intent: Intent?, ...)это должно работать только в вашем коде . А затем просто не делайте этого, intent!!а правильно проверьте, является ли намерение нулевым.
Патрик Боос,