12

Ich befolge Beispielcode zum Senden einer Update-Benachrichtigung alle 10 Sekunden. Der Code folgt und es ist in einem UpdateService für einen AppWidgetProvider. Wenn ich eine Thread.sleep(10*1000); setze, kann ich das erwartete Verhalten meiner Wartungsschleife sehen. Ich habe offensichtlich etwas grundsätzlich falsches, das sofort ausgelöst wird. Es soll ein PendingIntent eines Alarms sein, der ein Update an meinen Hörer sendet.Warum wird mein Android-Alarmmanager sofort ausgelöst?

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

Antwort

21

AlarmManager.setRepeating als public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) Das zweite Argument definiert ist, als es zuerst aufgerufen werden soll. Sie sagen es um SystemClock.elapsedRealtime() zu starten, was jetzt ist.

+0

Danke an beide +1 von mir für die schnelle und genaue Antwort. Auf zum nächsten Problem. Ziemlich ironisch versuchte ich, einen zweiten Kommentar zu früh zu geben (<15 Sekunden), also bekomme ich eine Timer-Pop-Benachrichtigung von SO. :)) – mobibob

+0

ich mache es so 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); noch ausstehende Absicht wird sofort ausgelöst ?? ' –

+0

@MuhammadBabar: Sie sollten wirklich eine neue Frage stellen. Aber um Ihre Frage trotzdem zu beantworten, übergeben Sie '120000' an triggerAtTime, was' Fr, 02.01.1970, 09:20:00 GMT' entspricht. – Falmarri

15

Sie sagen setRepeating(), dass der erste Alarm sofort ausgelöst werden soll (SystemClock.elapsedRealtime()). Wenn der erste Alarm zu einem anderen Zeitpunkt ausgelöst werden soll, fügen Sie einen Offset hinzu (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 für die gleiche Antwort wie ich =] – Falmarri

+0

Danke an beide +1 von mir für die schnelle und genaue Antwort. Auf zum nächsten Problem. – mobibob

3

Wenn Sie PendingIntent eines Alarms für vergangene Zeit erstellen, wird er sofort ausgelöst. Beispiel - Schedule Alarm für heute 8 Uhr, aber Ausführen von Code um 11 Uhr wird sofort ausgelöst.

Lösung:

cal.add(Calendar.DATE, 1); 

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

Dies wird die Veranstaltung am nächsten Tag zu einer bestimmten Uhrzeit Feuer (d 08.00 Uhr);