12

Seguo il codice di esempio per l'invio di una notifica di aggiornamento ogni 10 secondi. Il codice segue ed è in un UpdateService per un AppWidgetProvider. Se metto un Thread.sleep(10*1000); riesco a vedere il comportamento previsto del mio ciclo di manutenzione. Ovviamente ho qualcosa di fondamentalmente sbagliato che si innesca immediatamente. Dovrebbe essere un PendingIntent di un allarme che trasmetterà l'aggiornamento al mio ascoltatore.Perché il gestore degli allarmi Android si attiva istantaneamente?

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

risposta

21

AlarmManager.setRepeating è definito come public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) Il secondo argomento è quando si dovrebbe essere chiamato prima. Stai dicendo che inizi a SystemClock.elapsedRealtime(), che è ora.

+0

Grazie a entrambi +1 da parte mia per la risposta rapida e accurata. Passiamo al prossimo problema. Abbastanza ironicamente, ho provato a mettere un secondo commento troppo presto (<15 secondi), quindi ricevo una notifica pop-pop da SO. :)) – mobibob

+0

in questo modo 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); l'intento ancora in sospeso viene attivato immediatamente? ' –

+0

@MuhammadBabar: dovresti pubblicare una nuova domanda. Ma per rispondere alla tua domanda comunque, stai passando a '120000' per triggerAtTime, che corrisponde a' Fri, 02 Jan 1970 09:20:00 GMT' – Falmarri

15

Stai dicendo a setRepeating() che il primo allarme si attiva immediatamente (SystemClock.elapsedRealtime()). Se si desidera che il primo allarme si spenga in un altro momento, aggiungere un offset (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 per avere la stessa risposta di me =] – Falmarri

+0

Grazie a entrambi +1 da me per la risposta rapida e accurata. Passiamo al prossimo problema. – mobibob

3

Se si sta creando PendingIntent di un allarme per il tempo passato, verrà generato immediatamente. Esempio: pianifica l'allarme per oggi 8AM ma l'esecuzione del codice intorno alle 11AM verrà avviata immediatamente.

Soluzione:

cal.add(Calendar.DATE, 1); 

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

Questa scatterà l'evento il giorno successivo a tempo specificato (cioè 08:00);

Problemi correlati