引导接收器
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
的第二个参数时哭泣不是很正常吗?为什么手机一开机,所有的闹钟都会立刻响起?setExactAndAllowWhileIdle
setExact
[编辑]
下图是设置闹钟在02:22响铃后手机关机再开机的情况。系统时间是2020/11/02 02:21
,但我设置响铃的触发时间是2020/11/02 02:22
。换句话说,一旦时间用完,警报就会响起。我想记录日志并显示它,但是当我关闭手机的那一刻,应用程序就死了,所以我看不到日志。