在打盹模式下{set_larmClock()触发太晚

时间:2017-12-28 14:09:52

标签: android alarmmanager sleep doze setalarmclock

我让我的收音机闹钟正常工作太麻烦了,我在这里读了很多关于这个主题的帖子,但不幸的是没有人帮助我。

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);        
Intent intent = new Intent(this, AlarmReceiver.class);
PendingIntent penInt = PendingIntent.getBroadcast(this, intentId, intent, 0);

这种区分我在stackoverflow上找到的API级别并将其置于我的calcNextAlarm()函数内(加上一些用于调试的日志消息)以正确设置警报,无论设备上使用的是什么API :

// problems in doze mode api 23+
if (Build.VERSION.SDK_INT >= 23) {
    if (testMode) Log.d("Ben", "setAlarmClock() - API 23+");
    am.setAlarmClock(new AlarmManager.AlarmClockInfo(alarmTimeInMillis, penInt), penInt);
}

else if (Build.VERSION.SDK_INT >= 19) {
// Wakes up the device in Idle Mode
    if (testMode) Log.d("Ben", "setExact() - API >= 19 && API < 23");
    am.setExact(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt);
}
// Old APIs
else {
    if (testMode) Log.d("Ben", "set() - API < 19");
    am.set(AlarmManager.RTC_WAKEUP, alarmTimeInMillis, penInt);
}

根据Log.d消息我可以看到,在我的Android 7.1设备上,正在执行第一个方法setAlarmClock()以在接收器中设置警报。

经过3个星期的测试和编码失败后,我变得非常绝望 - 我的警报今天又迟到了4分钟 - 根据打瞌睡模式培训页面,这应该永远不会发生:

  

使用setAlarmClock()设置的警报继续正常启动 - 系统在警报触发前不久退出Doze。

在我的7.1手机上,当我将闹钟设置为&#34;现在为+5或6&#34;时,闹钟甚至会在20秒到1:40分钟之后。分钟。任何人都可以告诉我如何真正及时完美地关闭闹钟?

2 个答案:

答案 0 :(得分:3)

尝试使用:

setExactAndAllowWhileIdle()

这将确保闹钟按时触发。我已经在自己的应用程序中测试了它,它很可靠。

如果您的目标API低于23,请将其保留在if子句中,该子句检查设备中安装的当前API。仅在API级别23以上使用此选项,以便使用setExact

继续保持

可以回答你的评论:

1)我已经在没有插入电池的情况下在打盹模式下准确测试了它

2)不幸的是,在空闲型警报时,每9分钟限制一次警报。你有两种选择:

首先使用setExactAndAllowWhileIdle触发第一个警报。

a)对于暂停,你必须使用setAlarmClock方法

b)对于暂停,您可以安排JobScheduler作业,并将最短延迟时间设置为您的贪睡时间。这将确保作业至少安排在贪睡间隔的间隙。但这只会导致作业在间隔后随机调度,因此您还需要将覆盖截止时间设置为0,以便在最小延迟后立即调度作业。同时将网络要求保持为none和idle模式作为默认值或false。根据我的经验,这也像警报精确方法一样可靠,我个人也使用这种方法。

答案 1 :(得分:0)

documentation指出:

  • 如果您需要设置在打ze睡时触发的警报,请使用 setAndAllowWhileIdle()或setExactAndAllowWhileIdle()。

  • 使用setAlarmClock()设置的警报继续正常触发—系统 在这些警报响起之前不久,便退出打ze睡。

在“使您的应用适应打ze”部分中,它还表示:

注意:setAndAllowWhileIdle()和setExactAndAllowWhileIdle()都不 每个应用程序每9分钟可以发出一次以上的警报。

setExactAndAllowWhileIdle的文档说:

与其他警报不同,系统可以自由地重新安排此类警报 警报与其他任何警报(即使来自 相同的应用程序。当设备闲置时,显然会发生这种情况(因为 当应用程序发出其他任何警报时,此警报可以在闲置时发出 将保留到以后),但即使闲置也可能发生。 请注意,操作系统将为调度提供更大的灵活性 这些警报要比常规的精确警报好,因为应用程序具有 选择了这种行为。设备空闲时,甚至可能需要 通过调度来获得更多自由,以优化电池寿命。

因此,setExactAndAllowWhileIdle不能保证准确的执行,而setAlarmClock则更准确(根据文档)。