Подтвердить что ты не робот

IntentService onHandleIntent (Intent) получает нулевой аргумент

Я использую IntentService для запуска фоновой службы для моего приложения на Android. Как ни странно, я получаю много отчетов о сбоях с случаями, когда намерение, переданное onHandleIntent, равно null. Я даже не уверен, как это возможно и кажется крайне странным. Может ли кто-нибудь предположить, почему это может происходить?

STACK_TRACE

java.lang.NullPointerException
    at com.example.MyService.onHandleIntent(MyService.java:466)
    at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:136)
    at android.os.HandlerThread.run(HandlerThread.java:61)

Строка № 466 в моем файле службы, где исключение нулевого указателя:

465 protected void onHandleIntent(Intent intent) {
466                Bundle data = intent.getExtras();   

Служба запускается как:

serviceIntent = new Intent(this, MyService.class);
serviceIntent.putExtra("ip", ip);
serviceIntent.putExtra("port", port);
startService(serviceIntent);                         

Изменить: Теперь я понимаю, что могу злоупотреблять IntentServices. Когда я запускаю службу, я запускаю некоторые рабочие потоки из onHandleIntent(), которые продолжают работать даже после возвращения onHandleIntent(). И связываться с потоками, привязывая к службе и вызывающим функциям/обратным вызовам. Я буду изучать использование лучшего способа использования сервисов для этой цели, тем временем я до сих пор не понимаю, как переданное намерение является нулевым. Я могу только подозревать, что система Android вызывает onHandleIntent сама по себе с нулевым намерением, которое кажется еще странным. Может кто-нибудь объяснить, почему система Android может называть его таким образом?

4b9b3361

Ответ 1

Смотрите документацию для Android для IntentService.onStartCommand.

[Цель] может быть нулевой, если служба перезапускается после того, как ее процесс ушел, и она ранее возвращала что-либо, кроме START_STICKY_COMPATIBILITY.

Поведение перезапуска можно в некоторой степени контролировать с помощью IntentService.setIntentRedelivery

Ответ 2

Я также получал нулевой смысл внутри onHandleIntent. И причина в том, что я принимал в этом намерении целый предмет. Я не мог понять причину, но у меня это получилось после того, как я не прошел мимо приемлемого объекта.