2016-11-05 39 views
0

我想在每月月底發出火警。目前,代碼運行良好,按照指定的時間,月份和日期 - 但它只適用於第一個月 - 在接下來的幾個月它不起作用。如何在每月的最後一天實施月度重複報警

AlarmManager manager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); 

Intent alarmIntent = new Intent(MainActivity.this, AlarmReceiver.class); 

pendingIntent = PendingIntent.getBroadcast(MainActivity.this, 0, alarmIntent, 0); 

manager.cancel(pendingIntent); 

Calendar calendar = Calendar.getInstance(); 
calendar.setTimeInMillis(System.currentTimeMillis()); 

int currentMonth = calendar.get(Calendar.MONTH); 
int currentYear = calendar.get(Calendar.YEAR); 
calendar.set(Calendar.MONTH, currentMonth); 



if (currentMonth == Calendar.JANUARY || currentMonth == Calendar.MARCH || currentMonth == Calendar.MAY || currentMonth == Calendar.JULY 
    || currentMonth == Calendar.AUGUST || currentMonth == Calendar.OCTOBER || currentMonth == Calendar.DECEMBER) { 
    // calendar.add(Calendar.DAY_OF_MONTH,31); 
    calendar.set(Calendar.HOUR_OF_DAY, 12); 
    calendar.set(Calendar.MINUTE, 30); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    calendar.set(Calendar.DAY_OF_MONTH, 31); 

    manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
} 

if (currentMonth == Calendar.APRIL || currentMonth == Calendar.JUNE || currentMonth == Calendar.SEPTEMBER 
    || currentMonth == Calendar.NOVEMBER) { 
    // calendar.add(Calendar.DAY_OF_MONTH,30); 
    calendar.set(Calendar.HOUR_OF_DAY, 12); 
    calendar.set(Calendar.MINUTE, 30); 
    calendar.set(Calendar.SECOND, 0); 
    calendar.set(Calendar.MILLISECOND, 0); 
    calendar.set(Calendar.DAY_OF_MONTH, 30); 

    manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

} 

if (currentMonth == Calendar.FEBRUARY) {//for feburary month) 
    GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance(); 
    if (cal.isLeapYear(currentYear)) {//for leap year feburary month 
     //calendar.add(Calendar.DAY_OF_MONTH,29); 
     calendar.set(Calendar.HOUR_OF_DAY, 12); 
     calendar.set(Calendar.MINUTE, 30); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.DAY_OF_MONTH, 29); 
     manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 

    } else { //for non leap year feburary month 
     // calendar.add(Calendar.DAY_OF_MONTH,28); 
     calendar.set(Calendar.HOUR_OF_DAY, 12); 
     calendar.set(Calendar.MINUTE, 30); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 
     calendar.set(Calendar.DAY_OF_MONTH, 28); 
     manager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent); 
    } 
} 

Toast.makeText(this, "will start at 12:30am", Toast.LENGTH_SHORT).show(); 
+0

你在後臺服務中運行這個類嗎? –

回答

0

免責聲明:我不知道AlarmManager,所以這可能不是一個很好的答案,但我也想顯示的代碼是如何得以改善。

看來你想在12:30 PM運行代碼(不像上一條語句說的那樣AM),但是如果你已經超過了這個時間,例如,在下午1點15分,您最終將鬧鐘設置爲過去的某個時間,此時您確實需要將時間設置爲下個月的個月。

此外,calendar.setTimeInMillis(System.currentTimeMillis())是多餘的,因爲Calendar.getInstance()只是這樣做對你太:

返回的日曆是基於與默認語言環境的時區當前時間

同樣,調用calendar.set(Calendar.MONTH, currentMonth)與你剛剛提取的月份將不會做任何事情。

要找到月份的最後一天,請撥打getActualMaximum(DAY_OF_MONTH),而不是所有這些if陳述。

所以,所有Calendar代碼歸結到這一點,包括修復的是過去的目標時間:

System.out.println(cal.getTime()); 

它給我這個:

Calendar cal = Calendar.getInstance(); 
int currentYear = cal.get(Calendar.YEAR); 
int currentMonth = cal.get(Calendar.MONTH); 
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
cal.clear(); 
cal.set(currentYear, currentMonth, lastDay, 12, 30); 
if (cal.getTimeInMillis() <= System.currentTimeMillis()) { 
    cal.add(Calendar.DAY_OF_MONTH, 1); // First of next month 
    lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH); 
    cal.set(Calendar.DAY_OF_MONTH, lastDay); // Last of next month 
} 

如果您在使用打印結果輸出:

Wed Nov 30 12:30:00 EST 2016 

注:如果您想要12:30 AM,而不是12:30 PM,只需將12更改爲0,致電set()即可。

0

我建議您在AlarmReceiver課程中添加新的鬧鐘。

現在你只觸發一個鬧鐘,這就是爲什麼它可以工作一個月。

在您的onReceive()方法中獲取AlarmManager並設置下個月的新警報。

相關問題