Менеджер тревог отправляет два уведомления вместо одногоAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Менеджер тревог отправляет два уведомления вместо одного

Сообщение Anonymous »

У меня проблема с менеджером сигналов тревоги. Мое приложение отправляет уведомления о приемах пищи, у меня есть 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»