12

Je suis un exemple de code pour envoyer une notification de mise à jour toutes les 10 secondes. Le code suit et il est dans un UpdateService pour un AppWidgetProvider. Si je mets un Thread.sleep(10*1000); je peux voir le comportement attendu de ma boucle d'entretien. J'ai évidemment quelque chose de fondamentalement faux qui déclenche immédiatement. Il est censé être un PendingIntent d'une alarme qui diffusera la mise à jour à mon auditeur.Pourquoi mon gestionnaire d'alarme android se déclenche-t-il instantanément?

long nextUpdate = 10*1000; 
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec."); 

Intent updateIntent = new Intent(ACTION_UPDATE_ALL); 
updateIntent.setClass(this, UpdateService.class); 

PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0); 

// Schedule alarm, and force the device awake for this update 
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 
    nextUpdate, pendingIntent); 

Répondre

21

AlarmManager.setRepeating est défini comme public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) Le 2ème argument est alors qu'il devrait être d'abord appelé. Vous lui dites de commencer à SystemClock.elapsedRealtime(), ce qui est maintenant.

+0

Merci à la fois +1 de moi pour la réponse rapide et précise. Sur le prochain problème. Assez ironiquement, j'ai essayé de mettre un deuxième commentaire trop tôt (<15 secondes), donc je reçois une notification de la part de SO. :)) – mobibob

+0

im faire comme ceci 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); l'intention toujours en suspens est tirant immédiatement ?? ' –

+0

@MuhammadBabar: Vous devriez vraiment poster une nouvelle question. Mais pour répondre à votre question de toute façon, vous passez '120000' à triggerAtTime, ce qui correspond à' ven, Jan 1970 09:20:00 02 GMT' – Falmarri

15

Vous dites setRepeating() que vous voulez que la première alarme se déclenche immédiatement (SystemClock.elapsedRealtime()). Si vous voulez que la première alarme se déclenche à un autre moment, ajoutez un décalage (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 pour avoir la même réponse que moi =] – Falmarri

+0

Merci aux deux +1 de ma part pour la réponse rapide et précise. Sur le prochain problème. – mobibob

3

Si vous créez PendingIntent d'une alarme pour le temps passé, il sera tiré immédiatement. Exemple - Programmer une alarme pour aujourd'hui 8 heures mais l'exécution du code vers 11 heures se déclenchera immédiatement.

Solution:

cal.add(Calendar.DATE, 1); 

long delay = 24 * 60 * 60 * 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 

Cela déclenche l'événement le lendemain à l'heure spécifiée (i.e. 8 heures);