web-dev-qa-db-fra.com

Dois-je utiliser PendingIntent.getService () ou getBroadcast avec AlarmManager?

Mon application doit récupérer des données sur le Web à une heure précise chaque jour. J'utilise donc un AlarmManager pour planifier la tâche et cela fonctionne bien.

Mais quand on regarde divers exemples, il semble y avoir deux façons de gérer AlarmManager en ce qui concerne l'intention en attente.

On utilise PendingIntent.getBroadcast() pour appeler un récepteur de diffusion lorsque l'alarme se déclenche et à l'intérieur de ce récepteur le service pour faire le vrai travail est démarré.

Une autre approche consiste à utiliser PendingIntent.getService() et à appeler le service directement lorsque cette alarme se déclenche.

Quelqu'un peut-il m'expliquer la différence entre les deux approches afin que je puisse décider sur laquelle s'appuyer?

EDIT: Une autre question est de savoir où acquérir le verrou de réveil lors de l'utilisation de getService ()?

Par exemple, lorsque j'utilise un BroadcastReceiver, j'ai la ligne suivante dans onReceive ():

WakeReminderIntentService.acquireStaticLock(context);

Comment dois-je acquérir le verrouillage de réveil si j'appelle directement le service comme:

PendingIntent pi = PendingIntent.getService(this, 0, new Intent(this, OnAlarmReceiver.class), PendingIntent.FLAG_UPDATE_CURRENT);

Dois-je simplement l'acquérir à l'intérieur du service?

43
marlar

On utilise PendingIntent.getBroadcast() pour appeler un broadcast receiver Lorsque l'alarme se déclenche et à l'intérieur de ce récepteur le service pour faire le vrai travail est démarré.

il a une étape de plus pour démarrer le service que

Une autre approche consiste à utiliser PendingIntent.getService() et à appeler le service directement lorsque cette alarme se déclenche.

alors vous devez utiliser la deuxième approche car elle réduit votre étape d'exécution.

19
Vineet Shukla

En lisant votre montage, je suppose que vous vous êtes découvert: Si vous voulez vous assurer que votre service est démarré lorsque vous utilisez AlarmManager, vous feriez mieux de prendre le détour de l'envoi initial à un destinataire et y acquérir un verrou de réveil. Sinon, il est possible que le téléphone se mette en veille avant le lancement du service demandé. C'est ce que dit le javadoc de AlarmManager et je l'ai également lu en post par ingénieur Google .

Alors maintenant pour votre montage: quand acquérir le verrou? L'intérêt de l'utilisation du récepteur est d'acquérir le verrou dans la méthode onReceive() du récepteur, car Android ne s'endormira pas pendant l'exécution de cette méthode.

Pour un exemple, voyez ceci question .

13
schnatterer