Причини того, що переданий Намір буде NULL у OnStartCommand


100

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

Крім того, коли служба перезапускається системою, Intent.getAction()метод повертає NULL ... іноді. Намір не просто НУЛЬНИЙgetAction()

Я також запитав тут, але ще не отримав відповіді.

UPDATE : Після бесіди з Марком Мерфі, він запропонував мені повернутися START_REDELIVER_INTENTв onStartCommand()зворотному виклику в моїй службі , а не START_STICKYтак , що вся мета відправляється після перезавантаження.

Я цього не робив спочатку, тому що я був стурбований тим, що якщо служба намагається щось зробити, то посеред цього щось було перезапущено ... чи визнає вона, що вона щось робила? Я думаю, що це логіка, за яку мені потрібно буде відповідати :)


16
Замість того, щоб редагувати своє запитання з відповіддю, додайте відповідь і прийміть її, щоб ваше питання перестало відображатися в наборі питань без відповіді - дякую.
Дейл Вілсон,

2
Просто примітка для когось із подібною проблемою. Я виявив , що зазвичай , коли я отримую повідомлення про помилку , що intentце nullна onStartCommand(), це викликано який - або інший помилки , яку видно в LogCat до цього. Я не знаю чому, але це те, що я спостерігав, і це досить просто не помітити.
Piotr Chojnacki

2
@DaleWilson Я б хотів, але це питання справді не вирішено. Поки я не отримаю остаточної відповіді на те, чому наміри є недійсними або як уникнути нульового наміру, не вдаючись до використання START_REDELIVER_INTENT (який, пізніше я дізнався, не є тим, що мені потрібно, але все одно вирішуватиме проблеми деяких людей, тому я залишив свою редакцію) Я не можу прийняти відповідь.
rf43

@Mosquito Чи траплялось вам помітити, що конкретно було помилкою?
rf43

1
@DDoSAttack насправді не має значення. У моєму випадку це було, наприклад, NullPointerExceptionдесь в одному з заходів. Пізніше це була якась інша помилка. Але в обох випадках мій трас стека показав, що в моїй службі, яка працювала під час виникнення цієї помилки intent, було, nullяк у вашому випадку. Довго думав, що не так, коли вирішив прокрутити стек вгору, і виявилося, що десь вгорі у мене була моя справжня помилка. Після вирішення цього, також null intentзниклого.
Петро Чоняцький

Відповіді:


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; Що ви маєте на увазі?! Як? Дякую.
Dr.jacky

Я мав на увазі саме у вашому коді, щоб onStartCommand(intent: Intent?, ...)він працював. А потім просто не робіть, intent!!а правильно перевіряйте, чи є намір нульовим.
Патрік Боос
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.