I don't understand what's wrong but my alarm runs every single day even if I hardcode the day number, I have no idea whats going on...
Intent notificationIntent = new Intent(AddTask.this,CustomBroadcastReceiver.class);
notificationIntent.putExtra(Intent.EXTRA_UID,newTaskId);
PendingIntent pendingIntent = PendingIntent.getBroadcast(AddTask.this, newTaskId, notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(getApplicationContext().ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
calendar.set(Calendar.DAY_OF_WEEK,2);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY * 7, pendingIntent);
today is sunday so the day number is 1 and i wrote calendar.set(Calendar.DAY_OF_WEEK,2); and the alarm just got trigered since i used the time and minute of this moment... it doesnot matter if i set the day number 1 2 3 4 5 or 6 or even if i make several alarm managers with same ID and each contains other day it triggers every day
Why is this line necessary?
calendar.setTimeInMillis(System.currentTimeMillis());
Also, the android development documentation recommends using
setInexactRepeating(int type, long triggerAtMillis, long intervalMillis, PendingIntent operation);
EDIT:
I suspect the intent isn't set for creating alarms so it's not creating the alarms correctly.
Maybe this would work:
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0,
intent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
//set repeating alarm here
I hope that answers the question.
So okay i have solved this , for everyone who want to create an alarm application like this > you set the time and hour and the days of week to trigger the alarm, it works like this : if today is the day which you choosed you just set the alarm with this :
calendar.set(Calendar.HOUR_OF_DAY, hour);
calendar.set(Calendar.MINUTE, minute);
but IF the day you picked is not the day which is today you have to the the date of the nearest day you picked and then just set the additional hour and minute as above.
this is the only way to make it work
Related
I am creating a alarm clock application for android. I am facing certain issue Such as :-0
After searching entire internet. I didn't get any good solution.
How to set repeat alarm for user selected days? For example if user selected to set an alarm at Sunday and Monday on 9:00 AM. I tried certain solution from the internet but nothing works for me. This is my code
calendar = Calendar.getInstance();
Intent intent = new Intent(context,BROADCAST_RECEIVER.class);
calendar.set(Calendar.DAY_OF_WEEK, WEEK_DAY);
calendar.set(Calendar.HOUR_OF_DAY,HOURS);
calendar.set(Calendar.MINUTE, MIN);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
PendingIntent pendingIntent = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
pendingIntent = PendingIntent.getBroadcast(context, sharedPref.GET_ALARM_CODE(), intent, PendingIntent.FLAG_MUTABLE);
}
else {
pendingIntent = PendingIntent.getBroadcast(context, sharedPref.GET_ALARM_CODE(), intent, PendingIntent.FLAG_UPDATE_CURRENT);
}
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), (DateUtils.DAY_IN_MILLIS)*7 , pendingIntent);
dbHelper.alarmDao().AddAlarm(new AlarmDatabase(calendar.getTimeInMillis(),AM_PM,DAYS,sharedPref.GET_ALARM_CODE(),"ON",notes,alarm_time,need_to_show));
}
How to calculate specific time in milliseconds for the user selected days ? I used this code.
calendar = Calendar.getInstance();
calendar.set(Calendar.DAY_OF_WEEK, WEEK_DAY);
calendar.set(Calendar.HOUR_OF_DAY,calender_hours);
calendar.set(Calendar.MINUTE, calender_minutes);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
By the time in am writing this question it's Friday here. I to calculate time from Friday 6:31 to Saturday 6:31 in milliseconds but get 1660933800000 this much milliseconds. Which is equivalent to 461370.5 in hours.
How to know that user selected past time ? So we can set alarm for the next day according to user selected hour and minutes.
I am thinking about one approach to solve 1 problem. I don't know is this good or not. What if on broadcast receiver I took current alarm schedule from local database and set alarm for next day using setexact() ? For example user selected Monday and Wednesday. And when alarm trigger on Monday then in receiver I check next alarm schedule which is Wednesday and set alarm for Wednesday. And this cycle repeats. Is this good ?
Thanks in advance for help.
I know that this topic is explained fairly well and there are a lot of tutorials. But maybe I'm too new in android to understand what I'm doing wrong.
I need to implement support of set of reminders. And notification should be shown exactly every Monday at 15 pm. I checked a lot of tutorials and similar questions on this site but anyway notification shows, somehow, randomly.
How do I test implementation:
Current time is 14:55
I set reminder on Monday at 15:00
And right after SAVE notification is shown.
Because of (just for example) I set repeat period in 20 sec, this notification is shown again and again with delay of 20 sec. But current time is still between 14:55 and 15:00.
And my task is to run notification at 15:00 or a liitle later. But not before.
set repeating notification
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, NotifyService.class);
PendingIntent pendingIntent = PendingIntent.getService(context, (int) reminder.id, intent, 0);
final Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.DAY_OF_WEEK, 2);
calendar.set(Calendar.HOUR_OF_DAY, reminder.time.hour);
calendar.set(Calendar.MINUTE, reminder.time.minute);
calendar.set(Calendar.SECOND, 0);
calendar.set(Calendar.MILLISECOND, 0);
am.setRepeating(AlarmManager.RTC_WAKEUP,
Calendar.getInstance().getTimeInMillis(), 20000, pendingIntent);
BTW
my min SDK version is 7, so I cannot use methods like setExact()
android version on tested device is 4.4.2
Thanks
When you set the alarm you set it with Calendar.getInstance().getTimeInMillis() instead of calendar.getTimeInMillis(). Simple bug ;).
Basically setting the alarm to 'now' every time, ignoring your calendar object.
This is a code that i'm using for running a service once a day .
the problem is this , after 24h , the service keeps calling every 10 to 15 min .
Intent myIntent = new Intent(this, MyService.class);
pendingIntent = PendingIntent.getService(this, 0, myIntent, 0);
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.add(Calendar.HOUR, 24);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(), 86400, pendingIntent);
I think I'm using a bad code .Could you give me a better code for runnig a service once or twice a day
thanks you
The interval parameter to setRepeating represents millis. It should be 86400000 to get it right.
You are now programming an alarm to start first execution 24h past the current time, but with a period of 86400 millis (less than two minutes).
Morale of the story:
Always read the docs before using an API.
Use AlarmManager.INTERVAL_DAY instead of your own magic numbers
I want the AlarmManager to repeat a task at scheduled time (weekly)
I used the following code:
for (Integer day : daysList) {
Calendar c = Calendar.getInstance();
c.set(Calendar.DAY_OF_WEEK, PersonalUtils.getDigitalWeek(day));
c.set(Calendar.HOUR_OF_DAY, task.getHour());
c.set(Calendar.MINUTE, task.getMinute());
c.set(Calendar.SECOND, 0);
c.set(Calendar.MILLISECOND, 0);
intent.putExtra("id", task.getId());
PendingIntent operation = PendingIntent.getService(
getApplicationContext(), requestCode, intent, 0);
alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(),
AlarmManager.INTERVAL_DAY * 7, operation);
}
However the alarm it triggered prematurely.
For example: Assuming that it is 18:30 Wed now. I setup a task which should be triggered at 17:30 Tue next week but instead the alarm is triggered immediately
Can anybody tell me why?
You are trying to do an inexact alarm, which only allows for a few specific constants, INTERVAL_DAY, INTERVAL_FIFTEEN_MINUTES, etc. See Android Docs for more. Those constants are only supposed to be used for InexactRepeatingAlarms, but I see your doing a RepeatingAlarm.
You have a couple of choices, you can either set the alarm to trigger in exactly 1 week, or you can set it to trigger every day inexactly and only pay attention to it if the alarm occurs during the 7th day. To trigger exactly every 7 days from now, try this:
final long WEEK_IN_MILLIS= 604800000;
alarm.setRepeating(AlarmManager.RTC_WAKEUP, c.getTimeInMillis()+WEEK_IN_MILLIS,
WEEK_IN_MILLIS, operation);
Note that I set it to first trigger in 1 week, then repeat every week after that. That should work for you.
I want to set notifications/alarms everyday at specific times. Please note that these times could be different for everyday. For example I have a Database from which I get 5 different entries/times for a day e.g 6am, 1.30pm, 4.30pm, 7.30pm, 10.00 pm. I want to set an alarm for these times. For the next day these times could be different. They could be off by 2-5 minutes or more.
Basically I cannot set a recurring alarm for the same time everyday. I need to check the entry in my Database to know what time I should schedule it.
What is a good and efficient way of doing this. I looked at some stack overflow questions for setting multiple alarms. But here how do I do it? Should I just read the whole weeks database entries i.e 5 times/day for 7 days..And set around 35 alarms together? Or should I just set one alarm at a time. And when that alarm is fired just read the next entry from the Database and schedule an alarm for that time?
Write a service which will pick up the 5 values from the database everyday at a particular time.
Then add multiple entries in the AlarmManger with different unique ID.
Adding alarm at particular time:
Calendar calendar = Calendar.getInstance();
//9 AM
calendar.set(Calendar.HOUR_OF_DAY, 9);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
PendingIntent pi = PendingIntent.getService(context, 0, new Intent(context, YourClass.class), PendingIntent.FLAG_UPDATE_CURRENT);
am.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pi);
Setting Multiple alarm:
AlarmManager[] alarmManager=new AlarmManager[24];
intentArray = new ArrayList<PendingIntent>();
for(f=0;f<arr2.length;f++){
Intent intent = new Intent(AlarmR.this, Riciving.class);
pi=PendingIntent.getBroadcast(AlarmR.this, f,intent, 0);
alarmManager[f] = (AlarmManager) getSystemService(ALARM_SERVICE);
alarmManager[f].set(AlarmManager.RTC_WAKEUP,arr2[f] ,pi);
intentArray.add(pi);
}
Hope this should work.