web-dev-qa-db-fra.com

Démarrage de JobIntentService à partir de PendingIntent (bouton Notification)?

Dans mon application, j'ai un bouton de notification qui déclenche une courte demande de réseau en arrière-plan à l'aide d'un IntentService. Il n'est pas logique d'afficher une interface graphique ici, c'est pourquoi j'utilise le service au lieu d'une activité. Voir le code ci-dessous.

// 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);

Cela fonctionne de manière fiable mais avec les nouvelles restrictions d'arrière-plan de Android 8.0 m'a donné envie de passer à un JobIntentService à la place. La mise à jour du code de service lui-même semble très simple mais je ne sais pas comment le lancer via un PendingIntent, qui est requis par les actions de notification.

Comment pourrais-je accomplir cela?

Serait-il préférable de passer à un service normal et d'utiliser PendingIntent.getForegroundService (...) sur les niveaux d'API 26+ et le code actuel sur les niveaux d'API 25 et inférieurs? Cela m'obligerait à gérer manuellement les wakelocks, les threads et entraîner une notification laide sur Android 8.0+.

EDIT: ci-dessous est le code avec lequel je me suis retrouvé en plus de la conversion directe de IntentService en JobIntentService.

Le BroadcastReceiver qui change juste la classe d'intention en mon JobIntentService et exécute sa méthode enqueueWork:

public class NotifiActionReceiver extends BroadcastReceiver {

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

Version modifiée du code d'origine:

// 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);
15
blunden

Comment pourrais-je accomplir cela?

Utilisez un BroadcastReceiver et un getBroadcast()PendingIntent, puis demandez au destinataire d'appeler la méthode JobIntentServiceenqueueWork() à partir de sa fonction onReceive() méthode. J'avoue que je n'ai pas essayé ça, mais AFAIK ça devrait marcher.

24
CommonsWare