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