AlarmManager设置为PM在AM时间触发。

3

问题

我正在使用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
    )
}

我还使用Material Dialogs library来调用时间对话框,如下所示:

MaterialDialog(this).show {
    // time here is a Calendar instance
    timePicker { _, time ->
        setDailyAlarm(time, ALARM_ID)
    }
}

屏幕如下所示:

Settings Screen

警报本身正在触发,但发生了奇怪的错误。 假设现在是晚上9点,我将闹钟设定为早上10点。我认为预期行为是在第二天的早上10点触发闹钟,但是一旦时钟到达晚上10点,有时会出现“误报”(我所说的“有时”是这种行为甚至不一致。我设法复制了几次,我的客户也抱怨了)。请注意:应用程序的最低API级别为21。 我到目前为止尝试过的: 起初,我认为可能是日历对象获取了错误的AM / PM标志,或者Calendar.HOUR_OF_DAY属性可能是错误的,但是当我在调试器中检查这些值时,一切似乎都很好。因此,我现在对问题可能是什么毫无头绪。 这里有什么我忽略的东西吗?
1个回答

2

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

在进行一些测试后,我发现只有当我将时间设置为当前小时之前的时间时才会出现问题。然后我想到可能是 AlarmManager 自动触发“旧闹钟”,这可能是我收到错误信息的原因。

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

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
    )
}

TL;DR:我正在检查所选时间是否在当前时间之前,如果是这种情况,我会在创建PendingIntent之前向Calendar实例添加一天。这似乎已经解决了问题,因为闹钟不再在错误的时间触发。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接