I have an application which I want to send notifications in odd days (like 1,3,5 days of month). After research, I understood that I need a service. But I can't figure out how to get the new date every day, or how to notice the service that the day has changed... Something like a listener on day changed... I searched a lot, and only found references on how to schedule a notification at a certain date, but that's not what I need, as I want to verify date every day. Thank you very much for any help !
You can do this with the help of Android Alarms.
The steps that you need to do :
Start an Alarm for the date and time at which you need to show the notification.
Subscribe for Reboot Broadcast receiver and set the same alarm again (since the alarm that you set will be gone once the device is restarted)
Once the alarm is ticked, you can show the notification from the Alarm Broadcast receiver and then set for the new alarm.
To schedule an ALarm :
AlarmManager mgr=
(AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
Intent i=new Intent(ctxt, ScheduledService.class);
PendingIntent pi=PendingIntent.getService(ctxt, 0, i, 0);
mgr.setRepeating(AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + DIFF_PERIOD, PERIOD, pi);
Where PERIOD : 48hours in millisecond
DIFF_PERIOD : time to your nearest tick. That is if you are in day 2 and you need to trigger the alarm in day 3, then this value will be : 24hrs in millisecond
To answer your comment.
To find the day of the month, you can use the follwing :
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
Related
i have a general question to set an alarm in android.
at the moment, the user can chose a date and time with a date picker (which is a date in the future).
then i will set the the delay time for the alarm.
I convert the chosen date & time in milliseconds and subtract System.currentTimeMillis() = this difference I set for the delay of my alarm.
my question is, if this the best way to calculate the delay or is there a better solution?
this calculation i use for update an alarm, too
Look at the Android Alarm Manager class. You can use it to set alarms at specific times, without calculating the delay.
final AlarmManager am = (AlarmManager) App.instance.getSystemService(Context.ALARM_SERVICE);
Calendar c = GregorianCalendar.getInstance();
c.set(2015, 12, 20, 10, 30);
am.set(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), operation);
where operation is a PendingIntent of the action you want to do when the alarm triggers.
My solution for you here:
You should convert normal datetime to timestemp formart
You can calculate by subtract future timestemp (which is set by alarm time) with current timestemp of phone to get return value then convert it to hour, munite and day number.
If after calculate get result is zezo then you notify alarm to user.
else nothing to do
I need to set on repeating alarm for my below cases,
Week Days[Day(8AM -8PM), Night(8PM -8AM)]
Week End
My Application mode changes during each period of time.
I have used the below code to set an alarm for particular day[Monday].
//Setting Alarm on Monday 8AM
Calendar alarmCalendar= Calendar.getInstance();
alarmCalendar.set(Calendar.DAY_OF_WEEK, 2);
alarmCalendar.set(Calendar.HOUR, 8);
alarmCalendar.set(Calendar.MINUTE, 0);
alarmCalendar.set(Calendar.SECOND, 0);
alarmCalendar.set(Calendar.AM_PM, am);
Above code will set the alarm for Monday. How to Set separate alarm for Week days for 8AM and 8PM. How to set Alarm for Week end also. Whether I have to replicate the same above code to set on alarm for each and every day.
Or else any option to set the alarm in simple manner?
Please help me on this.
You can setup the alarm to the Monday with a repetition of every 7 days, and make it for the rest of the work days by the same way.
I made a comparison between two calendars:
Year, Month and day are the current year, month and day: but the result is not as expected if the time of the first calendar is after the current time the calendar waits till that time and starts ringing but if it's before the current time the calendar starts ringing directly so it's always accessing the second condition:
public void scheduleAlarm()
{
//to initialize the time variable not a real value:
Long time=Long.parseLong("0");
int hour=calendar.get(Calendar.HOUR);
int minute=calendar.get(Calendar.MINUTE);
Calendar cal_now = new GregorianCalendar(Year,Month,Day, hour, minute,Calendar.SECOND);
Calendar cal_alarm_first=new GregorianCalendar(Year,Month,Day,21,14,0);
//if the first calendar is in the past increment its day by one:
if(cal_alarm_first.before(cal_now)){
Notif_Body=getResources().getString(R.string.remembrance_body_first);
//here if the first alarm is already gone I should add a day and it should ring after a day from now with the specified hour and minute...
cal_alarm_first.add(Calendar.DATE, 1);
time=cal_alarm_first.getTimeInMillis();
}
else if(cal_alarm_first.after(cal_now)){
//the problem is here it always access this condition even if the first calendar time is before the current time for example same date but the first calendar is 9:14 and current time is 9:17 it always access this condition and the alarm starts ringing...
Notif_Body=getResources().getString(R.string.remembrance_body_first);
time=cal_alarm_first.getTimeInMillis();
}
//to send this alarm to be retrieved by the broadcast receiver class:
Intent intentAlarm = new Intent(this, TimeAlarm.class);
//add the notification body to the intent:
intentAlarm.putExtra("Notif_body", Notif_Body);
// create the object
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
//set the alarm for particular time
alarmManager.set(AlarmManager.RTC_WAKEUP,time, PendingIntent.getBroadcast(this,1,intentAlarm, PendingIntent.FLAG_UPDATE_CURRENT));
}
I really can't figure out what the problem is!! thanks.
Edit:
so the cause of this unexpected result was because of the 24hours format I am adding the time of the first calendar in 24hours format and the current time is getting its time placed as 12 hours format so need to get both of them in 24 hours format;
Edit2:
So I changed the
int hour=calendar.get(Calendar.HOUR);//12 hours
to
int hour=calendar.get(Calendar.HOUROFDAY);//24 hours
and basically worked will add it as an answer if it really worked...
the cause of this unexpected result was because of the 24hours format I am adding the time of the first calendar in 24hours format and the current time is getting its time placed as 12 hours format so need to get both of them in 24 hours format;
So I changed the:
int hour=calendar.get(Calendar.HOUR);//12 hours
to
int hour=calendar.get(Calendar.HOUROFDAY);//24 hours
and it worked!!
I want to popup an alarm on selected day i.e. Monday ,Tuesday and so on. And at selected time on every week. I've an idea about interval but I don't know how to get the next day and popup alarm ?
You need to use the AlarmManager and get a WakeClock while processing the Intent in Service (make sure to release it and chose the right kind).
Here is a great example :
https://stackoverflow.com/a/8801990/220710
To get the day current day of the week, look at this question :
Android: how to get the current day of the week (Monday, etc...) in the user's language?
Then you would use :
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation)
Schedule a repeating alarm
that has inexact trigger time requirements; for example, an alarm that
repeats every hour, but not necessarily at the top of every hour.
Then you would need to set :
type = RTC_WAKEUP
intervalMillis = ms in a week
triggerAtMillis = System.currentTimeMillis() + ms to the next Monday, Tuesday or
whatever
intent = the intent you want to fire to a Service that
will process it.
Here i am trying to set the alarm by using AlarmManger class. It is working fine with me but when i set the alarm time after Hours or mins from time picker,It will start the instantly when i save that alarm. the alarm. I need to alarm go off until i set the time.
Below is my code is working but starts the alarm immediately when i save.
I am setting time only with the time picker.
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,Calendar.MONTH,Calendar.DAY_OF_MONTH,mHour,mMinute);
PendingIntent sender = PendingIntent.getBroadcast(AddAlarm.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
If i take below code alarm is not working..
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR, mHour);
calendar.set(Calendar.MINUTE, mMinute);
PendingIntent sender = PendingIntent.getBroadcast(AddAlarm.this, REQUEST_CODE, intent, 0);
AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), sender);
Help me should i change in the to work properly.Thanks in advance...
The second code should normally work for dated alarms.
Keep in mind:
If you set the HOUR and MINUTE you set them for the current day eg HOUR = 1 and MINUTE = 30 means you set an alarm for 01:30 AM.
If it is over, you might get the alarm right now.
When you like to create an alarm in the future with 1:30 to go, then use the calendar.add(..,..) method.
I'm not sure what you're trying to do with this line:
calendar.set(Calendar.YEAR,Calendar.MONTH,Calendar.DAY_OF_MONTH,mHour,mMinute);
but I'm pretty certain it doesn't do what you want. This will set the calendar to be the hour & minute you have chosen on the 5th of March of the year 1 AD. When you convert this to milliseconds, you'll get 0 out, because that's before the earliest date that can be represented in milliseconds.
You also have a different Calendar API related problem in this line:
calendar.set(Calendar.HOUR, mHour);
Here, your problem is that the Calendar.HOUR field refers to the hour in 12-hour notation, whereas your mHour is presumably using 24-hour notation (otherwise you'd also need an AM/PM field to hold a full day's worth of times). You want Calendar.HOUR_OF_DAY instead.