有一个代码可以使用AlarmManager
(第二天上午7:00)在指定的精确时间触发操作:
val manager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, FooIntentService::class.java)
val pendingIntent = PendingIntent.getService(this, 0, intent, 0)
// Set alarm
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.set(Calendar.HOUR_OF_DAY, 7)
calendar.set(Calendar.MINUTE, 0)
// Set tomorrow
calendar.add(Calendar.DATE, 1)
manager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
我已经测试了此代码,从现在开始最多5分钟内触发事件,关闭应用程序(关闭所有应用程序)并将其置于睡眠状态(按下“保持”按钮) - 它可以正常工作。然而,当我将明天的时间设置为早上7点(从现在起超过5分钟)时 - 它永远不会触发,直到我解锁它(手动唤醒)。此刻我把它弄醒了 - 这个动作马上就被触发了。
问题:是我提供的示例代码,在我的情况下设置计划事件是正确的吗?
答案 0 :(得分:2)
注意:从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前在请求时准确传递所有警报的行为。
基本上,警报并非精确,以尽量减少唤醒和电池使用。您可以将set
替换为setExact
,然后它可以按您的要求运行。
manager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent);