12

Estoy siguiendo el código de muestra para enviar una notificación de actualización cada 10'segundos. El código sigue y está en un UpdateService para un AppWidgetProvider. Si pongo un Thread.sleep(10*1000); puedo ver el comportamiento esperado de mi ciclo de servicio. Obviamente tengo algo fundamentalmente erróneo que se está disparando de inmediato. Se supone que es un PendingIntent de una alarma que transmitirá la actualización a mi oyente.¿Por qué mi administrador de alarmas android dispara instantáneamente?

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

Respuesta

21

AlarmManager.setRepeating se define como public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) El segundo argumento es cuando se debe llamar primero. Le está diciendo que comience en SystemClock.elapsedRealtime(), que es ahora.

+0

Gracias a ambos +1 de mi parte por la respuesta rápida y precisa. En al siguiente problema. Irónicamente, traté de hacer un segundo comentario demasiado pronto (<15 segundos), así que recibí una notificación de temporizador pop de SO. :)) – mobibob

+0

lo estoy haciendo así 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); todavía intento pendiente está disparando al instante ?? ' –

+0

@MuhammadBabar: Realmente deberías publicar una nueva pregunta. Pero para responder a su pregunta de todos modos, está pasando '120000' para desencadenarAtTime, que corresponde a' Vie, 02 Ene 1970 09:20:00 GMT' – Falmarri

15

Está diciendo setRepeating() que desea que la primera alarma se active de inmediato (SystemClock.elapsedRealtime()). Si desea que la primera alarma se active en otro momento, agregue un desplazamiento (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 por tener la misma respuesta que yo =] – Falmarri

+0

Gracias a los +1 de mí por la respuesta rápida y precisa. En al siguiente problema. – mobibob

3

Si está creando PendingIntent de una alarma para el tiempo pasado, se disparará inmediatamente. Ejemplo - Programe la alarma para hoy 8 AM, pero ejecutar el código alrededor de las 11:00 AM se disparará inmediatamente.

Solución:

cal.add(Calendar.DATE, 1); 

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

Esto se disparará el evento el día siguiente a una hora específica (es decir, de las 8);

Cuestiones relacionadas