var intentAlarm = Intent(applicationContext, MySound::class.java)
var pendingintent: PendingIntent = PendingIntent.getBroadcast(applicationContext, 111, intentAlarm, 0)
var alarm: AlarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
// alarm
var calender: Calendar = Calendar.getInstance().apply {
set(Calendar.HOUR_OF_DAY, 16)
set(Calendar.MINUTE, 3)
set(Calendar.SECOND, 0)
}
alarm.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, calender.timeInMillis, pendingintent)`
来自文档:
与其他警报不同,系统可以自由地重新安排这种类型的警报,使其与任何其他警报一起无序发生,即使是来自同一应用程序的警报。这显然会在设备空闲时发生(因为此警报可以在空闲时响起,当应用程序的任何其他警报将被保留到稍后),但即使在非空闲时也可能发生。请注意,由于应用程序选择了这种行为,操作系统将允许自己在调度这些警报时比常规的精确警报更具灵活性。
所以即使你设置了setExactAndAllowWhileIdle,系统也不能保证在你设置的确切时间使闹钟响起。