Android alarmmanager повторяется каждый месяц в указанную дату

Я разрабатываю приложение, которое может отправлять SMS в указанное время, я добавил к нему некоторую функцию, но я запутался, пока добавляю функцию, которая может отправлять смс каждый месяц 14-го числа, как я могу сделать эту функцию?

я попробовал код ответа по этой ссылке, но не работал.

Я предполагаю, что проблема заключается в параметре интервала в функции setRepeating класса AlarmManager.

mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), interval , pendingIntent);

какое правильное значение переменной interval?


person Foro Testo    schedule 17.07.2013    source источник


Ответы (2)


здесь интервал — это время в миллисекундах между двумя сигналами тревоги.

 //e.g
long interval=5*60*1000;

mAlarmManager.setRepeating(AlarmManager.RTC_WAKEUP, mCalendar.getTimeInMillis(), interval , pendingIntent);

тогда мой будильник будет повторяться каждые 5 минут.

ИЗМЕНИТЬ

 int days=GetTotalDays(current_month);
    interval=(days)*24*60*60*1000;

    public int GetTotalDays(int current_month)
    {
    //here u can fetch current months total days
    //suppose current month is 6(means july as it starts from 0)
    //& u want to set alarm to next month(august)
    //so get remaining days from calender of current month  +  day of next month
    //e.g(14-7 to 14-8)  so 
    //remaining days from calender of current month = 18(14-7 to 31-7)
    //day of next month =14.
    //so return would be (18+14-2=30).(-2.as it takes currentdate and nextdate also in   calculation)
int currentdate=14;
int nextdate=14;
int totalDays=getDaysInMonthInPresentYear(6);
int myDays=(totalDays-currentdate)+nextdate;
return myDays-2;

    }


public static int getDaysInMonthInPresentYear(int monthNumber)
 {
 int days=0;
 if(monthNumber>=0 && monthNumber<12){
 try
 {
 Calendar calendar = Calendar.getInstance();
 int date = 1;
 int year = calendar.get(Calendar.YEAR);
 calendar.set(year, monthNumber, date);
 days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
 } catch (Exception e)
 {
 if(e!=null)
 e.printStackTrace();
 }
 }
 return days;
 }
person Bhoomika Brahmbhatt    schedule 17.07.2013
comment
спасибо за ответ, но я это знаю. интервал 5 минут является статическим, но интервал каждый месяц может быть другим. например, период с 14 июня по 14 июля может отличаться от периода с 14 июля по 14 августа. любое другое решение? - person Foro Testo; 17.07.2013
comment
просто попробуйте установить интервал = 30 * 24 * 60 * 60 ... я не пробовал ... но каждый месяц имеет разные дни, такие как 28, 30, 31 ... так что вы можете получить время в миллисекундах, используя (новая дата () ).& затем установите интервал. - person Bhoomika Brahmbhatt; 17.07.2013
comment
Прошу прощения за поздний ответ, я попробую ваш отредактированный ответ и сообщу вам результат - person Foro Testo; 18.07.2013
comment
ваш ответ работает, но «возврат myDays-2» должен быть «возврат myDays» и «интервал = (дни) * 24 * 60 * 60 * 1000;' должен быть «длинный интервал = (длинный) (дни) * 24 * 60 * 60 * 1000;' этот код работает только один раз и не работает во второй раз в следующем месяце. - person Foro Testo; 18.07.2013
comment
я думаю, что эту проблему невозможно решить с помощью setRepeat(), потому что интервал всегда статичен и всегда имеет фиксированное значение, в то время как количество дней в каждом месяце может варьироваться - person Foro Testo; 18.07.2013
comment
Да, но вы можете установить интервал как общедоступный статический или взять его в sharedPreference.. и вы можете изменить его в pendingIntent.so, когда будет вызываться диспетчер тревог, он устанавливает интервал. - person Bhoomika Brahmbhatt; 18.07.2013
comment
спасибо за помощь, ваш ответ вдохновил меня на решение проблемы. Я не использую setrepeat(), а использую метод set() как обычно. Этот метод не будет включать интервал. и я бы вызывал метод каждый раз, когда срабатывает будильник, конечно, с новым временем срабатывания. так что еще раз спасибо за помощь, я отмечу ваш ответ как полезный ответ - person Foro Testo; 19.07.2013

alarmManager .setInexactRepeating(AlarmManager.RTC_WAKEUP,
                    calendar1.getTimeInMillis() + AlarmManager.INTERVAL_DAY*30,
                    AlarmManager.INTERVAL_DAY*30, pendingIntent);

Вы можете попробовать так

person Karthick M    schedule 29.11.2013
comment
А как насчет месяцев, в которых не ровно 30 дней? - person robert.little; 21.01.2019