Android 具有多个未决意图的警报管理器
Android alarm manager with multiple pending intents
所以我有这样的应用程序,您可以在其中创建多个日记,我想为每个日记设置提醒。例如,在其中一本日记中,我将提醒设置为每周在周二和周五重复,然后在另一本日记中,我想在同一天设置不同的提醒,我该怎么做才能使提醒不会相互取消?因为我无法将一个警报管理器设置为在不同的日子重复,所以我为每个选定的日期设置了多个具有不同请求代码的警报管理器,但是如果我为其他具有相同请求代码的日志警报管理器设置它们会取消以前的提醒。我该如何解决这个问题? (用户可以添加多个日志,因此不能选择不同的广播接收器)
fun setJournalReminder(context: Context, cls: Class<*>, hour: Int, minute: Int, day: Int){
val calendar = Calendar.getInstance()
val setCalendar = Calendar.getInstance().apply {
timeInMillis = System.currentTimeMillis()
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
}
when (day) {
1 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
2 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY)
3 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY)
4 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY)
5 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)
6 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY)
7 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}
if (setCalendar.before(calendar))
setCalendar.add(Calendar.DATE, 1)
val receiver = ComponentName(context, cls)
val pm = context.packageManager
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
val intent = Intent(context, cls)
val pendingIntent = PendingIntent.getBroadcast(context, day, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setCalendar.timeInMillis, AlarmManager.INTERVAL_DAY * 7, pendingIntent)
}
您将这一天用作请求代码,因此将在同一天更新待定意图。我认为您应该结合使用日期和 journalId 来创建您的 RequestCode(对于 Journal 和 Day,请求代码必须是唯一的)
我们可以将请求代码添加到 Intent 操作中,使 Intent.filterEquals 始终为 false...
所以我有这样的应用程序,您可以在其中创建多个日记,我想为每个日记设置提醒。例如,在其中一本日记中,我将提醒设置为每周在周二和周五重复,然后在另一本日记中,我想在同一天设置不同的提醒,我该怎么做才能使提醒不会相互取消?因为我无法将一个警报管理器设置为在不同的日子重复,所以我为每个选定的日期设置了多个具有不同请求代码的警报管理器,但是如果我为其他具有相同请求代码的日志警报管理器设置它们会取消以前的提醒。我该如何解决这个问题? (用户可以添加多个日志,因此不能选择不同的广播接收器)
fun setJournalReminder(context: Context, cls: Class<*>, hour: Int, minute: Int, day: Int){
val calendar = Calendar.getInstance()
val setCalendar = Calendar.getInstance().apply {
timeInMillis = System.currentTimeMillis()
set(Calendar.HOUR_OF_DAY, hour)
set(Calendar.MINUTE, minute)
set(Calendar.SECOND, 0)
}
when (day) {
1 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY)
2 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.TUESDAY)
3 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.WEDNESDAY)
4 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.THURSDAY)
5 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.FRIDAY)
6 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.SATURDAY)
7 -> setCalendar.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY)
}
if (setCalendar.before(calendar))
setCalendar.add(Calendar.DATE, 1)
val receiver = ComponentName(context, cls)
val pm = context.packageManager
pm.setComponentEnabledSetting(receiver, PackageManager.COMPONENT_ENABLED_STATE_ENABLED, PackageManager.DONT_KILL_APP)
val intent = Intent(context, cls)
val pendingIntent = PendingIntent.getBroadcast(context, day, intent, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, setCalendar.timeInMillis, AlarmManager.INTERVAL_DAY * 7, pendingIntent)
}
您将这一天用作请求代码,因此将在同一天更新待定意图。我认为您应该结合使用日期和 journalId 来创建您的 RequestCode(对于 Journal 和 Day,请求代码必须是唯一的)
我们可以将请求代码添加到 Intent 操作中,使 Intent.filterEquals 始终为 false...