警报管理器的setExactAndAllowWhileIdle()无法正常工作

Jay*_*ani 7 java android alarmmanager

我正在开发一个需要在用户设置的确切时间执行特定操作的应用程序。为此,我正在使用setExactAndAllowWhileIdle()方法,因为此文档说具有android 6.0或更高版本的android设备具有休眠模式概念,如果设备闲置一段时间,它将进入休眠模式,并且休眠模式会限制警报。如果我想在设备进入打ze模式时发出警报,那么我有setExactAndAllowWhileIdle()文档所述的方法。本文档还包含手动方式,使设备进入打ze模式以进行测试。因此,我正在使用这种方式进行测试,但是当设备进入打ze模式时,并且当我通过终端命令停止打ze模式时,我的警报不会触发,过去的警报会立即触发。

因此,我的问题是setExactAndAllowWhileIdle()此方法无法在打ze模式下工作,但它必须按照文档中所述工作。我知道此方法的局限性,我每9分钟只能发出一个警报,并且我遵守此规则。所以,我不明白问题出在哪里。

我的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC, d.getTime(), pendingIntent);
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    alarmManager.setExact(AlarmManager.RTC, d.getTime(), pendingIntent);
else
    alarmManager.set(AlarmManager.RTC, d.getTime(), pendingIntent);
Run Code Online (Sandbox Code Playgroud)

这是方法问题还是我做错方法了?

Jay*_*ani 9

我已经找到了解决我问题的方法,因此,我在这里发布了自己的答案,对我有用。

使用setAlarmClock()方法解决了我的问题。如果使用setAlarmClock()方法设置警报,则将不允许系统在警报时间的1小时之前进入打ze模式。我通过设置警报后手动强制设备进入打ze模式进行了测试。让我解释完整的情况。

  1. 首先,我在当前时间5分钟后设置了警报,然后尝试使用以下命令将设备手动设置为打do模式。

亚行shell dumpsys deviceidle force-idle

表明

无法进入打ze模式

  1. 之后,我从当前时间开始1小时零1分钟后设置了警报,然后我尝试将设备置于打ze模式,并且设备成功进入了打ze模式。然后,我在设备上什么也没做,即使它处于打ze模式,它也会准时发出警报。

因此,我得出结论,如果当前时间和您的警报时间之间的时间戳很短,则setAlarmClock()方法会阻止您的设备进入休眠模式。否则,如果您的设备已经处于打ze模式,那么它将在打some时间之前退出打mode模式,因此,您的闹钟可以正常工作。

更新的代码:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M)
    alarmManager.setAlarmClock(new AlarmManager.AlarmClockInfo(d.getTime(),pendingIntent),pendingIntent);
else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)
    alarmManager.setExact(AlarmManager.RTC, d.getTime(), pendingIntent);
else
    alarmManager.set(AlarmManager.RTC, d.getTime(), pendingIntent);
Run Code Online (Sandbox Code Playgroud)