У меня проблема с менеджером сигналов тревоги. Мое приложение отправляет уведомления о приемах пищи, у меня есть 4 приема пищи (завтрак, обед, ужин, перекус) и выбор времени для них. Если я установлю время для 1 приема пищи, оно отправит уведомление для него, но если я установлю уведомления для более чем 1 приема пищи, оно отправит уведомления для всех из них.
Например я установил уведомление о завтраке в 8:00, оно отправит мне уведомление о завтраке, но если я установлю еще одно уведомление о обеде в 8:05, оно отправит мне уведомление о завтраке и обеде в 8:05.
Хорошо, что я пробовал. Я пробовал много вещей: пытался изменить флаги в диспетчере сигналов тревоги только на НЕИЗМЕННЫЕ, пытался отменить сигнал тревоги перед его запуском (комментарий строка в коде), пытался отменить сопрограмму после того, как все было сделано, пытался добавить день в календарь, если время в timePicker меньше, чем currentTime на телефоне. Заранее спасибо)
Код AlarmManager:
class CCAlarmManager @Inject constructor(
private val alarmManager: AlarmManager,
private val mealTimeScreenRepositoryImpl: MealTimeScreenRepositoryImpl,
private val context: Context
) {
private val coroutineScope = CoroutineScope(Dispatchers.IO + SupervisorJob())
fun scheduleMealAlarm(name: String) {
coroutineScope.launch {
mealTimeScreenRepositoryImpl.getMealTimeByName(name).collect { meal ->
val intent = Intent(context, CCAlarmReceiver::class.java).apply {
putExtra("mealName", meal.name)
}
val pendingIntent = PendingIntent.getBroadcast(
context,
meal.id,
intent,
PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT
)
//Cancel alarm if it exists, doesn't work
alarmManager.cancel(pendingIntent)
val hours = meal.time.split(":")[0].take(2).toInt()
val minutes = meal.time.split(":")[1].take(2).toInt()
val calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, hours)
set(Calendar.MINUTE, minutes)
set(Calendar.SECOND, 0)
set(Calendar.MILLISECOND, 0)
}
alarmManager.setRepeating(
AlarmManager.RTC_WAKEUP,
calendar.timeInMillis,
AlarmManager.INTERVAL_DAY,
pendingIntent,
)
}
}
}
fun cancelMealAlarm(name: String) {
coroutineScope.launch {
mealTimeScreenRepositoryImpl.getMealTimeByName(name).collect { meal ->
val pendingIntent = PendingIntent.getBroadcast(
context,
meal.id,
Intent(context, CCAlarmReceiver::class.java),
PendingIntent.FLAG_IMMUTABLE
)
alarmManager.cancel(pendingIntent)
}
}
}
}
Код приемника вещания:
class CCAlarmReceiver: BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent?) {
val mealName = intent?.getStringExtra("mealName")
val notification = NotificationCompat.Builder(context, "cc_notifications")
.setSmallIcon(R.drawable.logo)
.setContentTitle("Eating time")
.setContentText("Time to eat $mealName")
.setPriority(NotificationCompat.PRIORITY_DEFAULT)
.build()
val notificationManager = context.getSystemService(Service.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.notify(mealName.hashCode(), notification)
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... ead-of-one