Alarma de repetición para días específicos de la semana en Android
En mi aplicación tengo una funcionalidad para activar alarma en 4 senerios:
- Sólo una vez para una fecha y hora elegidas por el usuario
- Diariamente para el tiempo elegido
- Semanal según fecha y hora elegida
- Días personalizados personalizados de la semana
Implementar con éxito los primeros 3 senerios usando el siguiente:
- ¿Alarma de ubicación para Android?
- AlarmManager.RTC_WAKEUP no funciona para algunos dispositivos
- ¿Tengo fugas de contexto?
- Mostrar diálogo utilizando PendingIntent
- Ejecución periódica de la tarea (una vez al día / una vez a la semana)
Sólo una vez:
Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.YEAR, Integer.parseInt(date[0])); calendar.set(Calendar.MONTH, (Integer.parseInt(date[1])) - 1); calendar.set(Calendar.DAY_OF_MONTH, Integer.parseInt(date[2])); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); calendar.set(Calendar.SECOND, 0); alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Para la programación diaria:
Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); calendar.set(Calendar.SECOND, 0); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, pendingIntent);
Para la programación semanal (según la fecha del sistema):
Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0])); calendar.set(Calendar.MINUTE, Integer.parseInt(time[1])); calendar.set(Calendar.SECOND, 0); //long interval = calendar.getTimeInMillis() + 604800000L; alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, pendingIntent);
Para los días de semana personalizados elegidos por el usuario (por ejemplo, sólo para el lunes y el viernes, se repite semanalmente) estoy usando el mismo código que he utilizado para la programación semanal por iteración. Pero no funciona para el lunes (que se establece antes de viernes) y el trabajo para el viernes. Además, no activa la alarma de hoy si hoy (fecha del sistema) es un lunes o un viernes.
Entonces, ¿cómo puedo implementar la programación de alarma semanal para los días personalizados de la semana?
- Cómo iniciar un diálogo (como dimiss de alarma / snooze) que se puede hacer clic sin desbloquear la pantalla
- Firebase disparando demasiadas alarmas
- Android: Inicio de múltiples intentos pendientes a la misma hora con el Administrador de alarmas
- Android Studio establece una alarma exacta con Icono
- Android establece varias alarmas
- Parte-1 persistente foreGround servicio androide que comienza por la interfaz de usuario, funciona en modo de suspensión también, también comienza en el reinicio del teléfono
- Administrador de alarmas no funciona en segundo plano en Android 6.0
- AlarmManager cuando el teléfono está apagado - ANDROID
No hay una manera de decirle al Administrador de alarmas cuáles días quieres que se dispare.
Una solución sería tener una alarma para cada día de la semana que desea que se dispare repitiendo semanalmente.
Así que para su escenario de lunes y viernes, establecería un recordatorio semanal de repetición el lunes y un recordatorio semanal de repetición el viernes.
Ejemplo de código:
private void scheduleAlarm(int dayOfWeek) { Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.DAY_OF_WEEK, dayOfWeek); // Check we aren't setting it in the past which would trigger it to fire instantly if(calendar.getTimeInMillis() < System.currentTimeMillis()) { calendar.add(Calendar.DAY_OF_YEAR, 7); } // Set this to whatever you were planning to do at the given time PendingIntent yourIntent; AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE); alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY * 7, yourIntent); } private void setUpAlarms() { scheduleAlarm(Calendar.MONDAY); scheduleAlarm(Calendar.FRIDAY); }
Usted ha dicho que usó el mismo código de su programación semanal, "por iteración". Si entiendo que está intentando establecer una alarma múltiple (dos en su ejemplo) con la misma PendingIntent
.
El problema es que como dice la documentación
Cuando configura una segunda alarma que utiliza la misma intención pendiente, reemplaza la alarma original.
De esta manera sólo se activa la segunda alarma.
Así que para resolver su problema simplemente necesita usar un PendingIntent
diferente para cada programación.