Android AlarmManager设置为在AM时间触发PM 问题

Android AlarmManager设置为在AM时间触发PM 问题,android,alarmmanager,android-alarms,repeatingalarm,Android,Alarmmanager,Android Alarms,Repeatingalarm,我正在使用Android的AlarmManager根据用户在设置屏幕上设置的时间定期在我的应用程序上触发通知。我一直遵循这一点来实现这一点。按照下面的代码片段完成: fun setDailyAlarm(time: Calendar, id: Int) { val cal = Calendar.getInstance().apply { timeInMillis = System.currentTimeMillis() set(Calendar.HOUR_O

我正在使用Android的
AlarmManager
根据用户在设置屏幕上设置的时间定期在我的应用程序上触发通知。我一直遵循这一点来实现这一点。按照下面的代码片段完成:

fun setDailyAlarm(time: Calendar, id: Int) {
    val cal = Calendar.getInstance().apply {
        timeInMillis = System.currentTimeMillis()
        set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY))
        set(Calendar.MINUTE, time.get(Calendar.MINUTE))
    }
    val pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT)

    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        cal.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        pi
    )
}
fun setDailyAlarm(time: Calendar, id: Int) {
    val now = Calendar.getInstance()

    val cal = Calendar.getInstance().apply {
        timeInMillis = System.currentTimeMillis()
        set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY))
        set(Calendar.MINUTE, time.get(Calendar.MINUTE))
    }

    if (time.get(Calendar.HOUR_OF_DAY) <= now.get(Calendar.HOUR_OF_DAY)) {
        cal.add(Calendar.DATE, 1)
    }

    val pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT)

    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        cal.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        pi
    )
}
我还使用调用时间对话框,如下所示:

MaterialDialog(this).show {
    // time here is a Calendar instance
    timePicker { _, time ->
        setDailyAlarm(time, ALARM_ID)
    }
}
屏幕如下图所示:

警报本身正在启动,但出现了一个奇怪的错误

假设现在是晚上9点,我把闹钟调到上午10点。我相信预期的行为应该是在第二天上午10点启动闹钟,但一旦闹钟响到晚上10点,有时我会得到一个“假阳性”。(有时我的意思是,这种行为甚至不一致。我成功地复制了几次,我的客户也对此表示不满)

注意:该应用程序的最低API级别为21

到目前为止我都试过了 起初,我认为calendar对象可能获取了错误的AM/PM标志,或者calendar.HOUR\u OF_DAY属性可能错误,但当我在调试器中检查这些值时,一切似乎都正常。所以现在我不知道问题是什么


这里有我遗漏的东西吗?

我找到了解决这个问题的方法

在做了一些测试之后,我注意到只有当我将时间设置为当前小时之前的某个时间时,问题才会发生。然后,我突然想到,
AlarmManager
可能会自动触发“旧警报”,这可能就是我得到误报的原因

然后我将我的
setDailyAlarm()
函数更改为以下代码段:

fun setDailyAlarm(time: Calendar, id: Int) {
    val cal = Calendar.getInstance().apply {
        timeInMillis = System.currentTimeMillis()
        set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY))
        set(Calendar.MINUTE, time.get(Calendar.MINUTE))
    }
    val pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT)

    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        cal.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        pi
    )
}
fun setDailyAlarm(time: Calendar, id: Int) {
    val now = Calendar.getInstance()

    val cal = Calendar.getInstance().apply {
        timeInMillis = System.currentTimeMillis()
        set(Calendar.HOUR_OF_DAY, time.get(Calendar.HOUR_OF_DAY))
        set(Calendar.MINUTE, time.get(Calendar.MINUTE))
    }

    if (time.get(Calendar.HOUR_OF_DAY) <= now.get(Calendar.HOUR_OF_DAY)) {
        cal.add(Calendar.DATE, 1)
    }

    val pi = PendingIntent.getBroadcast(context, id, intent, PendingIntent.FLAG_UPDATE_CURRENT)

    alarmManager.setRepeating(
        AlarmManager.RTC_WAKEUP,
        cal.timeInMillis,
        AlarmManager.INTERVAL_DAY,
        pi
    )
}
fun setDailyAlarm(时间:日历,id:Int){
val now=Calendar.getInstance()
val cal=Calendar.getInstance().apply{
timeInMillis=System.currentTimeMillis()
设置(Calendar.HOUR\u OF_DAY,time.get(Calendar.HOUR\u OF_DAY))
设置(Calendar.MINUTE,time.get(Calendar.MINUTE))
}
if(time.get(日历小时)