0

引导接收器

override fun onReceive(context: Context, intent: Intent) {
    if (intent.action == Intent.ACTION_BOOT_COMPLETED) {
        val array = MyDatabase(context).getAllAlarm()

        val receiver = Intent(context, BootReceiver::class.java)
        receiver.action = "ALARM_SETTING"

        val trigger = Calendar.getInstance()
        for (i in array) {
            trigger.time = SimpleDateFormat("yyyy/MM/dd hh:mm", Locale.getDefault()).parse(i.time)!!
            receiver.putExtra("trigger", trigger.timeInMillis)
            AlarmUtil.setAlarm(context, receiver, i.id, trigger.timeInMillis)
        }
    } else (intent.action == "ALARM_SETTING") {
        val trigger = intent.getLongExtra("trigger", 0)
        NotificationUtil.sendNotification(context, name, id, trigger)
    }
}

警报工具

class AlarmUtil {
    companion object {
        fun setAlarm(context: Context, intent: Intent, id: Int, calendar: Long) {
            val alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
            val pendingIntent = PendingIntent.getBroadcast(context.applicationContext, id, intent, PendingIntent.FLAG_UPDATE_CURRENT)


            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
                alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calendar, pendingIntent)
            } else {
                alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar, pendingIntent)
            }
        }
    }
}

可以看到,当手机重启时,这段代码会带上存储在SQLiteDatabase中的报警数组,并发出报警声。如果你看一下 AlarmUtil 中的 setAlarm(),我写了一段代码,让它在 AlarmManager 中指定的时间哭泣。问题是无论警报数组中指定的时间如何,存储在数组中的所有警报都会立即清除(我将其实现为通知)。当您输入orcalendar的第二个参数时哭泣不是很正常吗?为什么手机一开机,所有的闹钟都会立刻响起?setExactAndAllowWhileIdlesetExact

[编辑]

在此处输入图像描述

下图是设置闹钟在02:22响铃后手机关机再开机的情况。系统时间是2020/11/02 02:21,但我设置响铃的触发时间是2020/11/02 02:22。换句话说,一旦时间用完,警报就会响起。我想记录日志并显示它,但是当我关闭手机的那一刻,应用程序就死了,所以我看不到日志。

4

1 回答 1

0

嗨,您正在通过较旧的时间作为触发时间。你应该在未来消磨时间。检查 db 时间是否小于 now() 而不是增加一天

于 2020-11-02T03:40:57.197 回答