警报管理器立即启动,而不是 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)
}
与MyAlarm
class为:
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)
我写了下面的代码:
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)
}
与MyAlarm
class为:
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)