В настоящее время я работаю над приложением для установки напоминаний на ежемесячной основе. Я не могу указать правильный интервал повторения для своего диспетчера алармов. Пожалуйста, предоставьте информацию о том же. это мой код, но он не вызовет тревогу за февраль или месяцы, имеющие 30 дней. Также, пожалуйста, предоставьте код для установки ежегодного повторяющегося сигнала тревоги.

repeatTime=(AlarmManager.INTERVAL_DAY*31);
mAlarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, when.getTimeInMillis(), repeatTime, pi);

Спасибо, Шарат

6
sharath reddy 11 Сен 2014 в 13:26

5 ответов

Лучший ответ

Вот как вы рассчитываете интервал между сегодняшним днем ​​и примерно через месяц после этого, используйте эту логику для сброса сигнала тревоги каждый раз, когда он срабатывает. т.е. установите будильник на точку, когда вы хотите начать, укажите какое-то ожидающее намерение, как только триггеры будильника используют приведенный ниже код, чтобы получить следующее время запуска, и снова установите будильник для срабатывания в это время.

private long getDuration(){
    // get todays date
    Calendar cal = Calendar.getInstance();
    // get current month
    int currentMonth = cal.get(Calendar.MONTH);

    // move month ahead
    currentMonth++;
    // check if has not exceeded threshold of december

    if(currentMonth > Calendar.DECEMBER){
        // alright, reset month to jan and forward year by 1 e.g fro 2013 to 2014
        currentMonth = Calendar.JANUARY;
        // Move year ahead as well
        cal.set(Calendar.YEAR, cal.get(Calendar.YEAR)+1);
    }

    // reset calendar to next month
    cal.set(Calendar.MONTH, currentMonth);
    // get the maximum possible days in this month
    int maximumDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);

    // set the calendar to maximum day (e.g in case of fEB 28th, or leap 29th)
    cal.set(Calendar.DAY_OF_MONTH, maximumDay);
    long thenTime = cal.getTimeInMillis(); // this is time one month ahead



    return (thenTime); // this is what you set as trigger point time i.e one month after

}
9
Techfist 11 Сен 2014 в 09:43

Чтобы установить будильник, который будет повторяться ежемесячно,

        Calendar calender= Calendar.getInstance(TimeZone.getDefault());
        int cDay = calender.get(Calendar.DAY_OF_MONTH);

        calender.set(Calendar.HOUR_OF_DAY, hour); //hour you have selected
        calender.set(Calendar.MINUTE, min); //min you have selected
        calender.set(Calendar.SECOND, 0);
        calender.set(Calendar.MILLISECOND, 0);

        calender.set(Calendar.DATE, cDay);
        calender.get(Calendar.MONTH);

        Calendar now = Calendar.getInstance();
        now.set(Calendar.SECOND, 0);
        now.set(Calendar.MILLISECOND, 0);

        int days = now.getActualMaximum(Calendar.DAY_OF_MONTH);

        if (calender.before(now)) {  //this condition is used for future alarm only
            calender.add(Calendar.DATE, days);
        }

        final int _id = (int) System.currentTimeMillis();

        Intent i = new Intent(activity, YourServiceClass.class);
        i.putExtra("type", "month");

        PendingIntent displayIntent = PendingIntent.getBroadcast(
                activity, _id, i, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);

        alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calender.getTimeInMillis(), AlarmManager.INTERVAL_DAY * calender.getActualMaximum(Calendar.DAY_OF_MONTH), displayIntent);

Теперь в вашем классе обслуживания введите код ниже

if (intent.getExtras() != null) {

        type = intent.getStringExtra("type");
    }

    if (type != null) {

        if (type.equals("month")) {

            Long futureTimeDifference = intent.getLongExtra("futureTimeDifference", 0); // Receive the time difference in milliseconds from currenttime in milliseconds and the future set date milliseconds
            futureTimeDifference = futureTimeDifference + System.currentTimeMillis();// get the next schedule date time inmilliseconds
            String repeatType = intent.getStringExtra("getRepeatType");// Receive the repeat type


            Date todaysDate = new Date();// initialize a new date object
            Calendar getCurrentDate = Calendar.getInstance();// Initialize a new Calendar object
            getCurrentDate.setTime(todaysDate); //Set the calendar to todays date
            int currentMonth = getCurrentDate.get(Calendar.MONTH); // Assign the current month in integer

            if (currentMonth == Calendar.JANUARY || currentMonth == Calendar.MARCH || currentMonth == Calendar.MAY || currentMonth == Calendar.JULY || currentMonth == Calendar.AUGUST || currentMonth == Calendar.OCTOBER || currentMonth == Calendar.DECEMBER) {
                futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 31);
            }
            if (currentMonth == Calendar.APRIL || currentMonth == Calendar.JUNE || currentMonth == Calendar.SEPTEMBER || currentMonth == Calendar.NOVEMBER) {
                futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 30);
            }

            if (currentMonth == Calendar.FEBRUARY) {//for february month)
                GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
                if (cal.isLeapYear(cal.get(Calendar.YEAR))) {//for leap year february month
                    futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 29);
                } else { //for non leap year february month
                    futureTimeDifference = System.currentTimeMillis() + (AlarmManager.INTERVAL_DAY * 28);
                }
            }

            final int monthly_id = (int) System.currentTimeMillis();

            Log.e("MonthlyNotification", futureTimeDifference + "");

            PendingIntent displayIntent = PendingIntent.getBroadcast(
                    context, monthly_id, intent, PendingIntent.FLAG_UPDATE_CURRENT);

            AlarmManager alarmManager = (AlarmManager) context.getSystemService(ALARM_SERVICE);

            alarmManager.set(AlarmManager.RTC_WAKEUP, futureTimeDifference, displayIntent);

            //Toast.makeText(context, "Notification Set Monthly", Toast.LENGTH_SHORT).show();
        }
    }
2
Bhoomika Chauhan 30 Июл 2018 в 06:11

Для ежегодного повторяющегося будильника

GregorianCalendar cal = (GregorianCalendar) GregorianCalendar.getInstance();
    if(cal.isLeapYear(year)){
      alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 366, alarmIntent);
    }else{
          alarmMgr.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 365, alarmIntent);
    }
0
mushahid 30 Окт 2014 в 06:11

Спасибо, Techfist .. ex: dateValue = "30/01/2017 11:02" ... получить идентификатор и дату из базы данных ...

private void getMonthlyDuration(Context context,int id,String dateValue) {
    SharedPreferences sharedPreferences = context.getSharedPreferences("ModernDiary", Context.MODE_PRIVATE);
    String dateOfMonth = sharedPreferences.getString("day"+id,DateFormat.format("dd", Calendar.getInstance()).toString());
    Calendar calendar = Calendar.getInstance();
    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm", Locale.getDefault());
    try {
        Date dateMain = simpleDateFormat.parse(dateValue);
        calendar.setTime(dateMain);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    Boolean isSetDate = false;
     if (sharedPreferences.getInt("monthInc"+id,-1) != -1) {
         calendar.set(Calendar.MONTH,sharedPreferences.getInt("monthInc"+id,calendar.get(Calendar.MONTH)));
         calendar.set(Calendar.YEAR,sharedPreferences.getInt("yearInc"+id,calendar.get(Calendar.YEAR)));
         if (calendar.getActualMaximum(Calendar.DAY_OF_MONTH) < Integer.parseInt(dateOfMonth)) {
             calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
             Log.i("timeDay",dateOfMonth+" "+calendar.getTime()+" max");
         } else {
             calendar.set(Calendar.DATE,Integer.parseInt(dateOfMonth));
             Log.i("timeDay",dateOfMonth+" "+calendar.getTime()+"min");
         }
         if (sharedPreferences.getInt("monthInc"+id,calendar.get(Calendar.MONTH)) < calendar.get(Calendar.MONTH)){
             calendar.add(Calendar.MONTH, -1);
             isSetDate = true;
             Log.i("timeMonth","Increment "+calendar.getTime());
         } else {
             isSetDate = false;
             Log.i("timeMonth","No Change");
         }
     }
    calendar.add(Calendar.MONTH, 1);
     if (isSetDate){
         if (calendar.getActualMaximum(Calendar.DAY_OF_MONTH) < Integer.parseInt(dateOfMonth)) {
             calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
         } else {
             calendar.set(Calendar.DATE,Integer.parseInt(dateOfMonth));
         }
     }
    Log.i("timeAf",calendar.getTime()+"");

    sharedPreferences.edit().putInt("monthInc"+id, calendar.get(Calendar.MONTH)).apply();
    sharedPreferences.edit().putInt("yearInc"+id, calendar.get(Calendar.YEAR)).apply();
    Intent notificationIntent = new Intent(context,AlarmBroadcastReceiver.class);
    Bundle bundle = new Bundle();
    bundle.putSerializable("alarm", id);
    notificationIntent.putExtra("bundle", bundle);
    alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    broadcast = PendingIntent.getBroadcast(context, id, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
    alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), broadcast);
}

Время срабатывания сигнализации: Вт, 28 февраля, 11:02:00 GMT + 05: 30 2017 Чт, 30 марта, 11:02:00 GMT + 05: 30 2017 Вс, 30 апр, 11:02:00 GMT + 05: 30 2017 Вт 30 мая, 11:02:00 GMT + 05: 30 2017 Пт, 30 июня, 11:02:00 GMT + 05: 30 2017 Вс, 30 июля, 11:02:00 GMT + 05: 30 2017 Ср, 30 августа, 11:02:00 GMT + 05: 30 2017 Сб, 30 сентября, 11:02:00 GMT + 05: 30 2017 Пн, 30 октября, 11:02:00 GMT + 05: 30 2017 Чт, 30 ноября, 11:02:00 GMT + 05: 30 2017 Сб, 30 декабря, 11:02:00 GMT + 05: 30 2017 Вт, 30 января, 11:02:00 GMT + 05: 30 2018 Среда, 28 февраля, 11:02:00 GMT + 05: 30 2018 ...

0
Rathiga Jesika 8 Фев 2018 в 05:38

Вы можете использовать set, а затем сбросить тревогу в широковещательном приемнике

В приемнике просто:

        val c = Calendar.getInstance().apply { add(Calendar.MONTH, 1) }
        // reset alarm here
        val intent = Intent(context, AlarmReceiver::class.java)
        val pendingIntent = PendingIntent.getBroadcast(
            context, 123, intent, 0
        )
        val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager?
        alarmManager!!.set(
            AlarmManager.RTC,
            c.timeInMillis,
            pendingIntent
        )
0
Fajar Ulin Nuha 8 Мар 2021 в 01:43