AlarmManager - Как настроить уведомление, чтобы оно появлялось ежегодно

Я хочу, чтобы уведомление появлялось каждый год в зависимости от введенной даты (дня рождения). У меня все остальное работает бар, как настраивать уведомления ежегодно. Как вы можете видеть ниже, я изменил код, чтобы сказать "ЗДЕСЬ", где интервалы идут. Есть интервалы в днях, и я знаю, что могу умножить это на 365. Но что произойдет, если это високосный год?

int REQUEST_CODE = 7;
Intent intent = new Intent(Activity2.this, Receiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(Activity2.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
am.setRepeating(am.RTC_WAKEUP, System.currentTimeMillis(), HERE, pendingIntent);

2 ответа

Решение

Вы можете заменить "ЗДЕСЬ" на метод, который определяет, будет ли следующий февраль с сегодняшнего дня високосным, а затем возвращает значение 365 или 366 дней (в форме миллисекунд) на основе этих проверок.

private long millisUntilNextYear(){

    //Set days in a year for Leap and Regular
    final int daysInLeapYear = 366;
    final int daysInYear = 365;

    //Get calendar instance
    GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();

    //Get this year and next year
    int thisYear = cal.get(GregorianCalendar.YEAR);
    int nextYear = thisYear + 1;

    //Get today's month
    int thisMonth = cal.get(GregorianCalendar.MONTH);

    //Get today's date
    int dayOfMonth = cal.get(GregorianCalendar.DAY_OF_MONTH);

    //Is today before February? If so then the following February is in THIS year
    if (thisMonth < GregorianCalendar.FEBRUARY){

        //Check if THIS year is leapYear, and return correct days (converted to millis)
        return cal.isLeapYear(thisYear) ? daysToMillis(daysInLeapYear) : daysToMillis(daysInYear);
    }

    //Is today after February? If so then the following February is NEXT year
    else if (thisMonth > GregorianCalendar.FEBRUARY) {
        //Check if NEXT year is leapYear, and return correct days (converted to millis)
        return cal.isLeapYear(nextYear) ? daysToMillis(daysInLeapYear) : daysToMillis(daysInYear);
    }

    //Then today must be February.
    else {
        //Special case: today is February 29
        if (dayOfMonth == 29){
            return daysToMillis(daysInYear);
        } else {
            //Check if THIS year is leapYear, and return correct days (converted to millis)
            return cal.isLeapYear(thisYear) ? daysToMillis(daysInLeapYear) : daysToMillis(daysInYear);
        }
    }
}

1) сохранять даты в форматах MM/DD/YY.

2) читать эти даты, когда вы открываете свое приложение (или в разное время)

3) установить оповещения на один день / сегодня сам.

Кроме того, вы также можете показывать дни рождения в ближайшие неделю / месяц и т. Д.

Другие вопросы по тегам