Android IntentService выполняется только один раз

Я использую Android AlarmManger, чтобы запланировать запуск IntentService через небольшие промежутки времени.

Вот мой будильник:

static void setNextSchedule(Context ctx, long interval){
        AlarmManager manager = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE);
        Intent nIntent = new Intent(ctx, DService.class);
        PendingIntent pIntent = PendingIntent.getActivity(ctx, 1, nIntent, PendingIntent.FLAG_UPDATE_CURRENT);

        manager.setRepeating(AlarmManager.ELAPSED_REALTIME, 
                SystemClock.elapsedRealtime() + interval, interval, pIntent);

        Log.i(ScheduleAlarm.class.getSimpleName(), "Next alarm set");
    }

И мой IntentService:

@Override
    protected void onHandleIntent(Intent intent) {
        Log.i(DService.class.getSimpleName(), "Service starting");

        ScheduleAlarm.setNextSchedule(getApplicationContext(), 15000);
    }

В настоящее время он просто содержит код для тестирования. Теперь этот код будет успешно работать без проблем после запуска приложения, но через 15 секунд в лог-каталоге будет указано, что служба запускается, но код не будет выполняться.

Как заставить службу Интернета выполнять код внутри onHandleIntent при каждом запуске?

Спасибо


person Wahtever    schedule 08.02.2014    source источник
comment
но код не выполняется - что это за код? Как вы определили, что он не будет выполняться? Почему вы используете getActivity() PendingIntent вместо Intent для класса с именем DService?   -  person CommonsWare    schedule 08.02.2014
comment
@CommonsWare - Вы правы, изменили на getService(), и теперь все работает нормально. Добавить как ответ, я приму. Спасибо   -  person Wahtever    schedule 08.02.2014


Ответы (1)


При использовании PendingIntent фабричный метод должен соответствовать типу компонента, для которого предназначен ваш Intent:

  • Если ваш Intent указывает на действие, используйте getActivity()

  • Если ваш Intent указывает на службу, используйте getService()

  • Если ваш Intent указывает на BroadcastReceiver, используйте getBroadcast()

  • Если ваши Intent не указывают ни на одно из вышеперечисленных, отправляйтесь сразу в тюрьму, не проходите Go!, не собирайте 200 долларов :-)

person CommonsWare    schedule 08.02.2014