2016-11-05 10 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.getInstance()はあまりにもあなたのためのことをやったので

また、calendar.setTimeInMillis(System.currentTimeMillis())は、冗長です。

同様に、抽出した月のcalendar.set(Calendar.MONTH, currentMonth)を呼び出すと、何も行われません。

月の最終日を検索するには、ifステートメントの代わりにgetActualMaximum(DAY_OF_MONTH)に電話してください。

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 
} 

だから、すべてのことCalendarコードが目標時間を過ぎているの修正を含め、これに沸きます出力:

Wed Nov 30 12:30:00 EST 2016 

注:午後12時30分ではなく午前12時30分を希望する場合は120に変更してset()に電話してください。

0

AlarmReceiverクラスに新しいアラームを追加することをお勧めします。

これで、1か月間だけ動作するアラームが1つだけトリガされます。

onReceive()メソッドではAlarmManagerを取得し、次の月の新しいアラームを設定します。

関連する問題