Je devrais utiliser PendingIntent.getService () ou getBroadcast avec AlarmManager?

mon application doit récupérer des données du web à un moment précis chaque jour. Donc j'utilise un AlarmManager pour programmer la tâche et ça marche bien.

mais en regardant divers exemples, il semble y avoir deux façons de traiter L'AlarmManager quand il s'agit de l'intention en attente.

on utilise PendingIntent.getBroadcast() pour appeler un récepteur de radiodiffusion lorsque l'alarme se déclenche et à l'intérieur de ce récepteur le service pour faire le travail réel est commencé.

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

quelqu'un Peut-il m'expliquer la différence entre les deux approches, ainsi je peux décider sur lequel s'appuyer?

EDIT: une autre question Est de savoir où se procurer le verrou de veille en utilisant getService()?

par exemple, lorsque j'utilise un récepteur de radiodiffusion j'ai la ligne suivante dans onReceive():

WakeReminderIntentService.acquireStaticLock(context);

Comment dois-je acquérir la serrure de sillage si j'appelle le service directement comme:

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

est-ce que je devrais simplement l'acquérir de l'intérieur du service à la place?

37
demandé sur marlar 2011-09-05 16:45:46

2 réponses

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 commencé.

il a une étape de plus dans la mise en service que

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

alors vous devriez utiliser la deuxième approche car elle réduit Votre une étape dans l'exécution..

19
répondu Vineet Shukla 2012-05-13 05:54:33

en lisant votre edit je suppose que vous avez vous-même découvert: si vous voulez vous assurer que votre service est commencé en utilisant AlarmManager , vous feriez mieux de prendre le détour de premier envoi à un récepteur et l'acquisition d'un wake lock là. Sinon, il est possible que le téléphone de sommeil avant le service demandé est lancé. C'est ce que dit le javadoc de AlarmManager et je l'ai aussi lu en post par Google engineer .

alors maintenant pour votre édition: quand acquérir la serrure? Le but de l'utilisation du récepteur est d'acquérir la serrure dans la méthode onReceive() du récepteur, parce que Android ne s'endormira pas pendant l'exécution de cette méthode.

pour un exemple, voir cette question .

12
répondu schnatterer 2017-05-23 12:34:14