How to set an alarm for working days in android

I have a script

Set an alarm for (Monday to Friday)

Let's say I choose a time: hour = 9, minutes = 15, am_pm = "AM" .

Now I want to set Alarm for every Monday to Friday at 9:15 AM

The code below I tried, but did not get the desired result.

 if(choice.equals("Week Days (Mon-Fri)")) { for(int a = 2; a <= 5; a++) //here I am assuming a is from 2 to 5 (calendar DAY_OF_WEEK from Monday to Friday) { Calendar alarmCalendar = Calendar.getInstance(); alarmCalendar.set(Calendar.HOUR_OF_DAY, _hourOfDay); alarmCalendar.set(Calendar.MINUTE, _minute); alarmCalendar.set(Calendar.SECOND, 0); alarmCalendar.set(Calendar.MILLISECOND, 0); if(am_pm.equals("AM")) { alarmCalendar.set(Calendar.AM_PM, 0); } else { alarmCalendar.set(Calendar.AM_PM, 1); } alarmCalendar.set(Calendar.DAY_OF_WEEK, a); Long alarmTime = alarmCalendar.getTimeInMillis(); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, alarmTime, 24 * 60 * 60 * 1000 , pendingIntent); } Toast.makeText(ActivityReminder.this, "Meeting Reminder Set on Week Days (Mon-Fri)", Toast.LENGTH_LONG).show(); } 

I used BroadcastReceiver as:

 public class AlarmReceiver extends BroadcastReceiver { NotificationManager mNotificationManager; Context context; public static final String TAG = "Reminder..."; @Override public void onReceive(Context context, Intent intent) { this.context = context; String subject = "<h3>Meeting Reminder: </h3>" + intent.getStringExtra("subject"); Toast.makeText(context, Html.fromHtml(subject), Toast.LENGTH_LONG).show(); showNotification(subject); } @SuppressWarnings("deprecation") private void showNotification(String msg) { Intent notificationIntent = new Intent(context.getApplicationContext(), ActivityMainScreen.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(context); stackBuilder.addParentStack(ActivityMainGeofence.class); stackBuilder.addNextIntent(notificationIntent); String arrivalTime = TimeUtil.toString(Calendar.getInstance().getTime(), "dd-MM-yyyy hh:mm:ss a"); notificationIntent.putExtra("subject", msg) .putExtra("time", arrivalTime).putExtra("type", "Meetings/Reminder"); PendingIntent notificationPendingIntent = stackBuilder .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT); Notification notification = new Notification(); notification.icon = R.drawable.app_icon; notification.setLatestEventInfo(context.getApplicationContext(), "WFM Meeting Reminder", Html.fromHtml(msg), notificationPendingIntent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notification.defaults |= Notification.DEFAULT_SOUND; notification.defaults |= Notification.DEFAULT_VIBRATE; NotificationManager mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); mNotificationManager.notify(0, notification); } } 

Finally, in the manifest:

 <receiver android:name="com.my_package_name.AlarmReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver> 

Editorial: Here I want to say that One Time Alarm worked for me, but for the selection above Week Days (Mon-Fri) does not work correctly

Work code:

 if(choice.equals("One Time")) { alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); // here PERIOD is the time selected by me in milliseconds... Toast.makeText(ActivityReminder.this, "Meeting Reminder Set One Time", Toast.LENGTH_LONG).show(); } 

Where am I doing wrong. Any help would be appreciated.

+6
source share
4 answers

I would suggest that the alarm is set only on Friday at 9:15? This should be due to the following line in the AlarmManager docs:

If there is already an alarm scheduled for the same IntentSender, it will first be canceled. http://developer.android.com/reference/android/app/AlarmManager.html#setRepeating(int , long, long, android.app.PendingIntent)

To do what you want, you need either 5 PendingIntents, or just set an alarm for the first event, and when this signal is received, you set an alarm the next day and so on.

I would probably go with the second option, since in the first method you will need 5 different PendingIntents, which means that their requestCode or supporting Intent should be different (with a different type, action or category).

+5
source

Try using this code for me ...

  for (int k = 2; k < 5; k++) { int sday = k; Calendar today = Calendar.getInstance(); Calendar AlarmDate = Calendar.getInstance(); AlarmDate.set(Calendar.HOUR_OF_DAY, inputH); AlarmDate.set(Calendar.MINUTE, inputM); AlarmDate.set(Calendar.SECOND, 0); while (today.after(AlarmDate)) { AlarmDate.add(Calendar.DAY_OF_MONTH, 1); } while (AlarmDate.get(Calendar.DAY_OF_WEEK) != sday) { AlarmDate.add(Calendar.DAY_OF_MONTH, 1); } Intent i = new Intent(this, AlertPopUpActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); i.putExtra("uid", k + (alert.getId() * 1000)); //a unique id for alram i.putExtra("id", alert.getId()); i.putExtra("msg", alert.getEventName()); if (minute < 10) i.putExtra("time", hour + ":0" + minute); else i.putExtra("time", hour + ":" + minute); i.putExtra("ampm", inputAMPM); PendingIntent pi = PendingIntent.getActivity(this, k + (alert.getId() * 1000), i, //same unique id (used to update alram if canceled) PendingIntent.FLAG_UPDATE_CURRENT); am.set(AlarmManager.RTC_WAKEUP, AlarmDate.getTimeInMillis(), pi); System.out.println("Set Time :" + AlarmDate.getTime()); } 
+3
source

Go to the AlarmManager page and look at the note in setRepeating (). Starting with API 19, duplicate functions are inaccurate. To get the correct repetition, you must process the alarm every time and transfer it.

+2
source

) First of all, you cannot have for a loop for the same pending intent; it will undo previous instances.

) The solution is to set the alarm again through the broadcast receiver inside the onReceive method after the alarm ends.

) Here's an idea on how to achieve this, including the rest of the code, as per your requirement. I used the calendar to set an alarm, and on Friday skip 2 days in between.

 void setAlarm() { AlarmManager alarmManager = (AlarmManager) context .getSystemService(Context.ALARM_SERVICE); if (choice.equals("One Time")) { alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); Toast.makeText(context, "Meeting Reminder Set One Time", Toast.LENGTH_LONG).show(); } else if (choice.equals("Week Days (Mon-Fri)")) { Calendar calendar = Calendar.getInstance(); int day = calendar.get(Calendar.DAY_OF_WEEK); switch (day) { case Calendar.MONDAY: alarmManager .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); case Calendar.TUESDAY: alarmManager .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); case Calendar.WEDNESDAY: alarmManager .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); case Calendar.THURSDAY: alarmManager .set(AlarmManager.RTC_WAKEUP, PERIOD, pendingIntent); case Calendar.FRIDAY: alarmManager.set(AlarmManager.RTC_WAKEUP, PERIOD * 3, pendingIntent); } } } 

) To β€œselect” an if-else clause, you may need to store this value somewhere like SharedPreferences.

+2
source

Source: https://habr.com/ru/post/978013/


All Articles