2012-12-01 110 views
2

我需要我的服務每天晚上02:00執行任務,如果任務失敗,然後安排自己在30分鐘後重新開始,但是如果成功,然後自行停止,並在另一晚02 :00。我設法在02:00開始,但在它被觸發後,它不斷地觸發它。AlarmManager一直重複觸發

我的代碼是在Service,這裏是代碼本身:

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     //doTasks(); 

     MediaPlayer player = MediaPlayer.create(this, 
       Settings.System.DEFAULT_NOTIFICATION_URI); 
     player.start(); 

     AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
     alarmManager.cancel(pendingIntent); 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(Calendar.HOUR_OF_DAY, 2); 
     calendar.set(Calendar.MINUTE, 0); 
     calendar.set(Calendar.SECOND, 0); 
     alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY, pendingIntent); 
    } 

doTasks()是我需要運行的任務,而是因爲他們是緩慢的我用於測試目的的通知聲音。而pendingIntent是這個Service本身。

任何想法是什麼讓我的AlarmManager不斷觸發?

+0

那麼如果你的'pendingIntent'設置爲啓動'Service',那麼基本上你每次都在'onStart(...)'方法中創建一個警報。在別的地方創建鬧鐘(例如在一個'Activity'或者一個擴展了'Application'的類中)。 – Squonk

+0

但它不應該只在02:00觸發,無論它在哪裏創建? –

+0

是的,沒有。 'AlarmManager'有一個機制,如果設備在應該觸發時睡着了,它會觸發一個「延遲」警報。在你的情況下,因爲你經常重新創建鬧鐘,所以'AlarmManager'不斷認爲它應該立即被觸發,即使時間已過02:00:00 – Squonk

回答

2

如果你的pendingIntent設置爲啓動Service那麼基本上你每次都在onStart(...)方法中重複創建一個新的報警。

AlarmManager有一個機制,如果設備在應該觸發時睡着了,它會觸發「延遲」警報。在你的情況下,因爲你不斷地重新創建鬧鐘,AlarmManager不斷認爲它應該立即觸發,即使時間已過02:00:00。

在其他位置創建警報以防止每次啓動Service時不斷重新創建它。