68707

how to set alarm to repeat monthly

Question:

Currently I am working on an application to set reminders on monthly basis. I am not able to provide the correct repeating interval for my alarmmanager. Pls provide info about the same. this is my code, but this will not raise alarm for Feb or months having 30 days. Also pls provide code to set yearly repeating alaram.

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

Thanks, Sharath

Answer1:

this is how you calculate interval between today in extacly one month after, use this logic to reset alarm everytime once it triggers. i.e set alarm to the point when you want to start, supply some pending intent, once alarm triggers use below code to get next trigger time, and set alarm again to trigger at that time.

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 }

Answer2:

To set alarm which repeat monthly,

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);

Now in your service class , put below code

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(); } }

Answer3:

for yearly repeating alarm

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); }

Answer4:

Thanks Techfist .. ex: dateValue = "30/01/2017 11:02" ... get id and date from database ...

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); }

Alarm triggering times: Tue Feb 28 11:02:00 GMT+05:30 2017 Thu Mar 30 11:02:00 GMT+05:30 2017 Sun Apr 30 11:02:00 GMT+05:30 2017 Tue May 30 11:02:00 GMT+05:30 2017 Fri Jun 30 11:02:00 GMT+05:30 2017 Sun Jul 30 11:02:00 GMT+05:30 2017 Wed Aug 30 11:02:00 GMT+05:30 2017 Sat Sep 30 11:02:00 GMT+05:30 2017 Mon Oct 30 11:02:00 GMT+05:30 2017 Thu Nov 30 11:02:00 GMT+05:30 2017 Sat Dec 30 11:02:00 GMT+05:30 2017 Tue Jan 30 11:02:00 GMT+05:30 2018 Wed Feb 28 11:02:00 GMT+05:30 2018 ...

Recommend

  • Java How to get time printed in IST
  • Building a Datetime Object for SQL database insert
  • Datepicker dialog box does not open on click
  • Perl Script to remove files older than a year
  • How should I chain viewcontrollers in xcode storyboard?
  • Create a pl/sql function & find leap years [closed]
  • How to finish activity when date picker dialog on cancel button is clicked
  • A simple leap year logic trouble
  • multiple colors on beanplot in R
  • Trying to find the last non-empty cell in a specific row/range over multiple sheets
  • AWS Elastic Beanstalk - changing owner of webapp folder
  • How to generate Date Series in HIVE? (Creating table)
  • Timer once a minute on the minute
  • 1º Day of Daylight Saving Time Java and JS showing a different behavior
  • MySql - get days remaining
  • Returning this from a constructor function in JS
  • MultiLevel ExpandableListView not highlighting properly
  • How can I reset dropdown data if modal closed on vue component?
  • What is the use of a session store?
  • How to get the date of next specified day of week
  • Put value at centre of bins for histogram
  • Activation Function choice for Neural network
  • Is there a package like bigmemory in R that can deal with large list objects?
  • How can I restyle a word when rendering a pdf with pdf.js?
  • Image map in Flex
  • Floated image with variable width and heading with background image
  • Who propagate bugfixes across branches (corporate development)?
  • MySQL Order by column = x, column asc?
  • Change multiple background-images with jQuery
  • Align navbar back button on right side
  • Sending data from AppleScript to FileMaker records
  • How to make Safari send if-modified-since header?
  • How to pass list parameters for each object using Spring MVC?
  • Setting background image for body element in xhtml (for different monitors and resolutions)
  • JaxB to read class hierarchy
  • Django query for large number of relationships
  • Why is Django giving me: 'first_name' is an invalid keyword argument for this function?
  • How can I use `wmic` in a Windows PE script?
  • Converting MP3 duration time
  • How to push additional view controllers onto NavigationController but keep the TabBar?