警报管理器立即启动,而不是 15 分钟后启动

Alarm manager starts immediately instead of after 15 minutes from now

我写了下面的代码:

var alarmMgr: AlarmManager? = null
lateinit var alarmIntent: PendingIntent

class MainActivity : AppCompatActivity() {
alarmMgr = this.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmIntent = Intent(this, MyAlarm::class.java).let { intent ->
                PendingIntent.getBroadcast(this, 0, intent, 0)
            }
alarmMgr?.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME, AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent)
}

MyAlarmclass为:

class MyAlarm : BroadcastReceiver() {
    override fun onReceive(context: Context, intent: Intent) {
        Toast.makeText(context, "Alarm Triggered", Toast.LENGTH_SHORT).show()
    }
}

我的意图是在 15 分钟后收到警报 运行,但实际情况是,我在应用程序启动后立即收到 toast,我犯了什么错误,以及如何解决?

setExactAndAllowWhileIdle()的第二个参数是报警发生的时间,以第一个参数的时基表示。

您的第一个参数是 ELAPSED_REALTIME,因此第二个参数需要 SystemClock.elapsedRealtime() 加上一些数量,以便在未来的那个时间安排警报。

现在,您只有 INTERVAL_FIFTEEN_MINUTES 作为第二个参数。该常量的值恰好是 15 分钟(以毫秒为单位)。但是,这会安排闹钟在您 phone 上次重新启动后 15 分钟响起,这可能是过去的某个时间。

所以,替换:

alarmMgr?.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME,
  AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent)

与:

alarmMgr?.setExactAndAllowWhileIdle(AlarmManager.ELAPSED_REALTIME,
  SystemClock.elapsedRealtime()+AlarmManager.INTERVAL_FIFTEEN_MINUTES, alarmIntent)