12

Her 10 saniyede bir güncelleme bildirimi göndermek için örnek kod takip ediyorum. Kod aşağıdaki gibidir ve AppWidgetProvider için UpdateService'dadır. Bir Thread.sleep(10*1000); koyarsam, hizmet döngüsümün beklenen davranışını görebilirim. Açıkçası, temelde yanlış olan, hemen tetikleyen bir şey var. Güncellememi dinleyicime yayınlayacak bir alarmın PendingIntent olması gerekiyordu.Neden android alarm yöneticim anında ateş ediyor?

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

cevap

21

AlarmManager.setRepeating ilk aranmalıdır zaman 2. argümandır public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) olarak tanımlanır. Şimdi SystemClock.elapsedRealtime() adresinden başladığını söylüyorsun.

+0

Hızlı ve doğru yanıt için her iki + 1'e de teşekkürler. Bir sonraki probleme. İronik olarak, çok yakında ikinci bir yorum yapmaya çalıştım (<15 saniye), bu yüzden SO'dan bir zamanlayıcı pop notu aldım. :)) – mobibob

+0

bunu böyle yapıyorum 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); hala bekleyen niyet anında ateş ediyor? ' –

+0

@MuhammadBabar: Gerçekten yeni bir soru göndermelisin. Ama yine de sorunuzu yanıtlamak için, bu yeni bilgi için (120000 sadece test için) "Fri, 02 Ocak 1970 09:20:00 GMT" – Falmarri

15

setRepeating()'a ilk alarmın hemen kesilmesini istediğinizi söylüyorsunuz (SystemClock.elapsedRealtime()). İlk alarmın başka bir zamanda sönmesini istiyorsanız, bir ofset ekleyin (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 benim gibi aynı cevaba sahip olmak için =] – Falmarri

+0

Hızlı ve doğru cevap için her iki + 1'den de teşekkürler. Bir sonraki probleme. – mobibob

3

Geçmişte bir alarmın PendingIntent'i oluşturuyorsanız hemen tetiklenir. Örnek - Bugün 8AM için zamanlama alarmı ancak 11AM civarında kod çalıştırmak hemen tetiklenecektir.

Çözüm: Bu belirtilen süre (yani 08:00) ertesi günü olay ateş edeceği

cal.add(Calendar.DATE, 1); 

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

;

İlgili konular