У меня проблема с менеджером сигналов тревоги. Мое приложение отправляет уведомления о приемах пищи, у меня есть 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
Менеджер тревог отправляет два уведомления вместо одного ⇐ Android
Форум для тех, кто программирует под Android
-
Anonymous
1719006429
Anonymous
У меня проблема с менеджером сигналов тревоги. Мое приложение отправляет уведомления о приемах пищи, у меня есть 4 приема пищи (завтрак, обед, ужин, перекус) и выбор времени для них. Если я установлю время для 1 приема пищи, оно отправит уведомление для него, но если я установлю уведомления для более чем 1 приема пищи, оно отправит уведомления для всех из них.
[b]Например [/b] я установил уведомление о завтраке в 8:00, оно отправит мне уведомление о завтраке, но если я установлю еще одно уведомление о обеде в 8:05, оно отправит мне уведомление о завтраке и обеде в 8:05.
[b]Хорошо, что я пробовал.[/b] Я пробовал много вещей: пытался изменить флаги в диспетчере сигналов тревоги только на НЕИЗМЕННЫЕ, пытался отменить сигнал тревоги перед его запуском (комментарий строка в коде), пытался отменить сопрограмму после того, как все было сделано, пытался добавить день в календарь, если время в 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)
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78654529/alarm-manager-send-two-notifications-instead-of-one[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия