AlarmManager不会唤醒手机

时间:2017-07-07 06:34:13

标签: android alarmmanager

有一个代码可以使用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分钟)时 - 它永远不会触发,直到我解锁它(手动唤醒)。此刻我把它弄醒了 - 这个动作马上就被触发了。

问题:是我提供的示例代码,在我的情况下设置计划事件是正确的吗?

1 个答案:

答案 0 :(得分:2)

  

注意:从API 19(KITKAT)开始,警报传递不准确:操作系统将移动警报以最小化唤醒和电池使用。有新的API支持需要严格交付保证的应用程序;请参阅setWindow(int,long,long,PendingIntent)和setExact(int,long,PendingIntent)。 targetSdkVersion早于API 19的应用程序将继续查看之前在请求时准确传递所有警报的行为。

来自documentation

基本上,警报并非精确,以尽量减少唤醒和电池使用。您可以将set替换为setExact,然后它可以按您的要求运行。

manager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent);