java – setExactAndAllowWhileIdle()for alarmmanager无法正常工作

我正在开发一个应用程序,需要对用户设置的确切时间执行特定操作.为此我使用setExactAndAllowWhileIdle()方法,因为this documentation表示具有android 6.0或更高版本的Android设备具有打盹模式概念,其中如果设备保持空闲一段时间,则它将进入打盹模式并且打盹模式限制警报.如果我想在设备进入打盹模式时触发警报,那么我有setExactAndAllowWhileIdle()方法,如文档所述.本文档还包含将设备输入打盹模式以进行测试的手动方式.所以,我正在使用这种方式进行测试但是当设备进入打盹模式时我的警报没有被触发,当我通过终端命令停止打盹模式时,我的过去警报将立即触发.

所以,我的问题是setExactAndAllowWhileIdle()这个方法在打盹模式下不起作用,但它必须像文档中所说的那样工作.我知道这种方法的限制,我每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);

这是一个方法问题还是我以错误的方式做到了?

解决方法:

我已经为我的问题找到了解决方案,所以我在这里发布了自己的答案,这对我有用.

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

>首先,我在当前时间5分钟后设置闹钟,然后尝试使用以下命令手动将设备置于打盹模式.

adb shell dumpsys deviceidle force-idle

表明

unable to enter into doze mode

>之后我在当前时间1小时1分钟后设置闹钟,然后我尝试将设备置于打盹模式,并成功进入打盹模式.然后我在我的设备上什么都没做,即使它处于打盹模式,它也准时准时发出警报.

因此,我得出结论,如果当前时间与您的闹钟时间之间存在少量时间戳,则setAlarmClock()方法会阻止您的设备进入打盹模式.否则,如果您的设备已经处于打盹模式,那么它会在您的闹钟响起之前退出打盹模式,因此您的闹钟正常工作.

更新的代码

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);

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...