[英]AlarmManager set as PM firing at AM time
我正在使用 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 庫來調用時間對話框,如下所示:
MaterialDialog(this).show {
// time here is a Calendar instance
timePicker { _, time ->
setDailyAlarm(time, ALARM_ID)
}
}
屏幕看起來像下面的例子:
警報本身正在觸發,但發生了一個奇怪的錯誤。
假設現在是晚上 9 點,我將鬧鍾設置為上午 10 點。 我相信預期的行為應該是在第二天上午 10 點發出警報,但是一旦時鍾到達晚上 10 點,有時我會得到“誤報”。 (有時我的意思是這種行為甚至不一致。我設法復制了幾次,我的客戶也抱怨它)。
注意:該應用的最低 API 級別為 21。
起初,我認為日歷對象可能獲取了錯誤的 AM/PM 標志,或者Calendar.HOUR_OF_DAY
屬性可能出錯,但是當我在調試器中檢查這些值時,一切似乎都很好。 所以現在我對問題可能是什么一無所知。
有什么我在這里想念的嗎?
我找到了解決這個問題的方法。
在做了一些測試之后,我注意到只有當我將時間設置為當前小時之前的時間時才會出現問題。 然后我想到,也許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
實例添加一天。 它似乎已經解決了這個問題,因為警報不再在錯誤的時間觸發。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.