Android Alarm Manager setExactAndAllowHileidle()在睡眠模式下无法在Android 7.0牛轧糖中工作

Android Alarm Manager setExactAndAllowHileidle()在睡眠模式下无法在Android 7.0牛轧糖中工作,android,android-intent,android-alarms,android-7.0-nougat,android-doze,Android,Android Intent,Android Alarms,Android 7.0 Nougat,Android Doze,我正在尝试使用alarm Manager的设置ExactAndAllowHileidle每隔30分钟在我的应用程序中触发一次警报,但它不起作用 我通过在收到报警信号时发出推送通知来测试功能 问题是:当设备闲置一段时间后进入睡眠模式时,我不再收到警报。然而,只要我打开屏幕,我就会收到一个通知。我的应用程序需要准确的警报,需要每30分钟准时发送一次!由于设备处于睡眠模式,它无法接收延迟报警或丢失的报警 我在代码中使用了以下内容: 我在打开应用程序时设置了闹钟 我使用WakefulBroadcasti

我正在尝试使用alarm Manager的
设置ExactAndAllowHileidle
每隔30分钟在我的应用程序中触发一次警报,但它不起作用

我通过在收到报警信号时发出推送通知来测试功能

问题是:当设备闲置一段时间后进入睡眠模式时,我不再收到警报。然而,只要我打开屏幕,我就会收到一个通知。我的应用程序需要准确的警报,需要每30分钟准时发送一次!由于设备处于睡眠模式,它无法接收延迟报警或丢失的报警

我在代码中使用了以下内容:

  • 我在打开应用程序时设置了闹钟
  • 我使用WakefulBroadcasting接收器接收报警信号。在其
    onReceive()
    方法我设置下一个报警。我也开始 仅发出推送通知的startWakefulService,然后停止 本身
  • 我在onReceive()的末尾调用completeWakefulIntent
  • 我尝试了两种测试:RTC_唤醒和已用_实时_唤醒
  • 注意事项:

    • wakefulbroadcastReceiver类已在清单中注册
    • 我添加了以下权限:
      android.permission.WAKE\u LOCK
    • 我尝试将我的应用程序列为白名单,但结果是一样的
    • 我试着使用
      setAlarmClock()
      ,即使在打瞌睡的时候,它也能一直工作 模式,每50个报警就有一个下降/延迟报警。所以也不是 完美的我不希望用户一直看到报警图标 在那里
    • 不仅SetExactAndAllowHileIDLE()在打瞌睡时不起作用,而且 当它工作时,具有可怕的准确性。我通常会收到很多报警信号
      1-3分钟后或1-3分钟前
    • 我正在使用华为Mate 8和安卓7.0牛轧糖进行测试
    p.S: 在回答之前,请确保您了解启动Android 6.0 M和打盹模式的限制

    链接1:

    总之,它说:

    • 如果您需要设置打盹时发出的警报,请使用 setAndAllowHileId()或setExactAndAllowHileId()
    • 使用setAlarmClock()设置的警报将继续正常触发-警报 在警报响起前不久,系统退出
    现在,为什么我不使用
    setExactAndAllowHileIDLE()
    ?,每30分钟获取一次准确的报警信号呢?!
    还有,为什么
    setAlarmClock()
    100%不可靠

    我遇到了和你一样的问题,我花了很长时间寻找解决方案。但我没有找到一个通用的解决方案

    三星设备的解决方案如下:


    第一个答案不起作用,但是第二个答案:)

    你可能会得到准确的警报,但是

    系统忽略尾流锁

    因此,如果你真的需要每30分钟触发一次,这似乎是唯一可以接受的解决方案。这可能会抵消所有打瞌睡模式的节能效果

    顺便说一句:您似乎可以看到带有
    adb shell dumpsys alarm
    的报警


    可能性:使用

    Firebase JobDispatcher是一个用于在Android应用程序中调度后台作业的库。它提供了一个与JobScheduler兼容的API,可在所有安装了Google Play服务的Android最新版本(API级别14+)上运行


    您是否尝试将应用程序添加到电池优化白名单?正如一些新闻所指出的(),华为有一些特殊的电池管理。

    如果你想在每次定时器启动时显示通知,那么你可以使用后端服务器向Android用户发送数据通知

    您需要将Android客户端的FCM令牌保存在后端服务器中,服务器将负责将通知推送到这些客户端


    我知道仅仅显示一个通知有点复杂,但这就是安卓系统的工作原理

    也许我也有同样的问题,看到了相似的观察结果。我希望谷歌的人能站出来解决这个问题。@Mena你找到解决方案了吗,我也有同样的问题。@caucukien仍然没有解决方案。@Mena你找到解决方案了吗?是的,我一直在使用adb外壳设置设备打瞌睡和监控警报,然而,通过密集测试,平均准确率为49/50,其中1个警报下降/延迟。。。。。我会处理警报图标一直可见的问题,但是发出警报是灾难性的。我不知道人们是否注意到了这样的问题,或者只是我的设备有点怪异。你考虑过使用吗?它使用谷歌游戏,被认为是准时的。不,我没有。但是它不是建立在JobScheduler之上吗?哪个AlarmManager是它的一部分?它实现了相同的接口。某处有人说,它允许用户准确地安排警报,因为谷歌可以阻止邪恶的东西。看见