Запуск JobIntentService из PendingIntent (кнопка уведомления)?


В моем приложении есть кнопка уведомления, которая запускает короткий сетевой запрос в фоновом режиме с помощью IntentService. Здесь нет смысла показывать графический интерфейс, поэтому я использую сервис вместо действия. Смотрите код ниже.

// Build the Intent used to start the NotifActionService
Intent buttonActionIntent = new Intent(this, NotifActionService.class);
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM);
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId);
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId);

// Build the PendingIntent used to trigger the action
PendingIntent pendingIntentConfirm = PendingIntent.getService(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);

Это работает надежно, но с новыми фоновыми ограничениями в Android 8.0 я захотел перейти на JobIntentService вместо этого. Обновление кода службы само по себе кажется очень простым, но я не знаю, как запустить его через PendingIntent, то есть то, что требуется для действий уведомления.

Как мне это сделать?

Не лучше ли перейти на обычный сервис и использовать PendingIntent.getForegroundService(...) на уровнях API 26+ и текущий код на уровне API 25 и ниже? Это потребовало бы от меня вручную обрабатывать wakelocks, потоки и привести к уродливому уведомлению на Android 8.0+.

EDIT: Ниже приведен код, который я получил, помимо прямого преобразования IntentService в JobIntentService.

BroadcastReceiver, который просто изменяет класс intent на мой JobIntentService и запускает свой метод enqueueWork:

public class NotifiActionReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        intent.setClass(context, NotifActionService.class);
        NotifActionService.enqueueWork(context, intent);
    }
}

Измененная версия исходного кода:

// Build the Intent used to start the NotifActionReceiver
Intent buttonActionIntent = new Intent(this, NotifActionReceiver.class);
buttonActionIntent.setAction(NotifActionService.ACTION_SEND_CONFIRM);
buttonActionIntent.putExtra(NotifActionService.EXTRA_CONFIRM_ID, confirmId);
buttonActionIntent.putExtra(NotifActionService.EXTRA_NOTIF_ID, notifId);

// Build the PendingIntent used to trigger the action
PendingIntent pendingIntentConfirm = PendingIntent.getBroadcast(this, 0, buttonActionIntent, PendingIntent.FLAG_UPDATE_CURRENT);
1 8

1 ответ:

Как мне это сделать?

Используйте a BroadcastReceiver и a getBroadcast() PendingIntent, тогда пусть приемник вызовет JobIntentService enqueueWork() метод из его метода onReceive(). Я признаю, что не пробовал этого, но AFAIK это должно сработать.