2012-01-06 34 views
1

閱讀大量的示例代碼到這件事情,我試圖找出最簡單的方法後,實現以下目標:的Android AlarmManager - 安排一個反覆出現的意圖,每天兩次,斷火

我希望能夠安排一個回撥給我的Alarm BroadcastReceiver的Intent,Intent會將我的服務關閉。但是,我希望設置爲每天兩次調用所述Intent,並且只在尚未設置警報的情況下才安排警報(同樣用於取消警報)。

但是,我不確定以下代碼是否是設置和取消警報的正確方法。

//Static function for setting the alarm 
//My midday calendar object (cal1) 

... 

//My evening calendar object (cal2) 
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE) 
Intent myIntent = new Intent(context, MyAlarmReceiver.class); 

    PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE); 
    PendingIntent secondCallIntent= PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, PendingIntent.FLAG_NO_CREATE); 
    if(firstCallIntent == null){ 
     if(DEBUG){ 
      Log.d(TAG, "Setting Midday Alarm"); 
     } 
     firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0); 
     alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), AlarmManager.INTERVAL_DAY, firstCallIntent); 
    } 
    if(secondCallIntent == null){ 
     if(DEBUG){ 
      Log.d(TAG, "Setting Evening Alarm"); 
     } 
     secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0); 
     alarms.setInexactRepeating(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), AlarmManager.INTERVAL_DAY, secondCallIntent); 
    } 


//Static call to cancel the alarm. 
AlarmManager alarms = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE) 
Intent myIntent = new Intent(context, MyAlarmReceiver.class); 
PendingIntent firstCallIntent = PendingIntent.getBroadcast(context, FIRST_CALL_ID, myIntent, 0); 
alarms.cancel(firstCallIntent); 
firstCallIntent.cancel(); 
PendingIntent secondCallIntent = PendingIntent.getBroadcast(context, SECOND_CALL_ID, myIntent, 0); 
alarms.cancel(secondCallIntent); 
secondCallIntent.cancel(); 

回答

1

這似乎不過的,而不是創建兩個日曆好了給我,對象,你可以只設置您的間隔

AlarmManager.INTERVAL_DAY/2 

,除非你的意圖都在做不同的事情。

此外,

alarms.cancel(firstCallIntent); 
alarms.cancel(secondCallIntent); 

應足以抵消這些類型的所有報警,無需:

firstCallIntent.cancel(); 

編輯:設置2個日曆對象

//midday 
Calendar cal1 = Calendar.getInstance(); 
cal1.set(Calendar.HOUR_OF_DAY, 12); 
cal1.set(Calendar.MINUTE, 00); 
cal1.set(Calendar.SECOND, 00); 

//7pm 
Calendar cal2 = Calendar.getInstance(); 
cal2.set(Calendar.HOUR_OF_DAY, 19); 
cal2.set(Calendar.MINUTE, 00); 
cal2.set(Calendar.SECOND, 00); 

日曆。 getInstance()將返回一個日曆對象並將其設置爲當前系統時間。每個.set方法都會更改該日曆對象的某個變量。所以現在如果是晚上8點,它會在當天設置12點和7點鬧鐘,這是沒有用的。所以如果你想在第二天設置它,你需要使用cal1.add(Calendar.DAY_OF_MONTH,01);添加額外的一天,第二天的時間設置。希望這可以幫助。

+0

那麼,根據這篇文章(http://stackoverflow.com/questions/4963271/android-alarmmanager-problem-with-setting-resetting-an-alarm),如果你不取消PI有一個問題取消警報後,在獲取PI時發現代碼未通過FLAG_CANCEL_CURRENT。簡而言之,爲了防止任務致命者破壞我的警報,我們的應用程序會在啓動應用程序時設置(重新設置)或取消警報。因爲我已經有一個Boot BroadcastReceiver來處理它,所以同上啓動。 – 2012-01-06 21:17:02

+0

是的,你可能是對的,你有沒有測試過,看它是否有效? – 2012-01-06 21:41:18

+0

我即將測試一下。希望它能工作。另外,如果我將時間間隔設置爲半天,是不是每12小時都會觸發警報?我想要的是它在中午之後稍微觸發第一次鬧鈴,在晚上7點之後稍後觸發第二次鬧鈴。 – 2012-01-06 22:12:41

相關問題