set the time in Alarm manager Android - alarm fired instantly - android

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.

Related

How to send a notification on specific dates by checking the date

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

Repeating alarm for one /two weeks?

I am developing an android application that trigger alarm for one/ two weeks or for long life. Also, this alarm will be repeated per day according to the number of pills. For example,
if the user has to take the pill for only two weeks and on every day he needs to take three pills. So, the alarm will be repeated for only Two weeks. and on every day will be repeated after 8 hours, suppose he takes the pill on the noon 12pm then the second pill should be at 8pm,4am and so on. (I want the alarm to trigger on these period of time)
This is my code, I used Spinner as dropdown list to select the duration time for the pill
if(deuTime.equals("Two week")) {
calendar.set(Calendar.DAY_OF_WEEK_IN_MONTH, 14);
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek);
long alarm_time = calendar.getTimeInMillis();
if (calendar.before(Calendar.getInstance()))
alarm_time += AlarmManager.INTERVAL_DAY * 7;
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarm_time,
1000*60*60*8, alarmIntent);
}
thank you for your help :)

android best way to set an alarm in android

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

AlarmManager Android trigger alarm every day at 10 AM

I would like to run automatically, each day at predefined time (for. example at 10 AM) some code in my app.
I trying to do using the:
am.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 1000 * 120 , pi);
But setRepeating accepts only time in miliseconds.
I would like to ask, is possible to set something like 10:00, REPEAT_DAILY ?
Thanks for any advice.
What about
am.setRepeating(AlarmManager.RTC_WAKEUP, tenOclockToday,
AlarmManager.INTERVAL_DAY, pi);
You'll need to set long tenOclockToday equal to the millisecond value of 10:00 today (unless it is past 10:00, then you can set it to 10:00 tomorrow). You'll need to use a Calendar instance and set the time to 10:00, then get the milliseconds from the Calendar using calendar.getTimeInMillis()

How to set an AlarmManager for preselected days?

I'm creating an alarm widget, and it works, however, I'm currently using it for a single day, I'd like to know how to define it for predefined days, let's say for example I want to setup the alarman for monday, wednesday and friday, how can I accomplish that?
Calendar cal = Calendar.getInstance();
cal.set(Calendar.YEAR, dPicker.getYear());
cal.set(Calendar.MONTH, dPicker.getMonth());
cal.set(Calendar.HOUR_OF_DAY, tPicker.getCurrentHour());
cal.set(Calendar.MINUTE, tPicker.getCurrentMinute());
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
alarmMgr = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), testThis(this));
I'm currently using a TimePicker and a DatePicker, but I will change the design to use checkboxes, each per day, but I'm not sure how to define the alarm for the selected days, any help? thank you so much.
Defining them at once i don't know if this can be achieved, but i have another scenario to use.
Say that you adjusted the Alarm to fire on Monday, Tuesday , Thursday. you will adjust the AlarmManager just for Monday and on Monday it should fire and checks for the next alarm ( which will be on Tuesday ) and so on. Save all you alarms in a database and take them out one be one and in each alarm check for the next one ( if exists )
You can use the Calendar.DAY_OF_WEEK api like this:
cal1.set(Calendar.DAY_OF_WEEK,2); //monday
cal2.set(Calendar.DAY_OF_WEEK,4); //wednesday
cal3.set(Calendar.DAY_OF_WEEK,6); //friday
and sets 3 alarmMgr like this:
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal1.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, testThis(this)); // every monday
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal2.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, testThis(this)); // every wednesday
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal3.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, testThis(this)); // every friday

Categories

Resources