setExactAndAllowWhileIdle - 与开发人员参考不一样

chr*_*ine 47 android alarmmanager android-6.0-marshmallow

API19上的AlarmManager具有setExact()方法来设置确切的警报.

确切意味着 - >如果我将闹钟设置为下午2:01,它将在下午2:01触发

API 23 - Marhsmwallow(6.0)上有一个新方法setExactAndAllowWhileIdle(),但是作为参考,它不是EXACT,因为它只会每15分钟触发一次和低功耗空闲模式.

确切!=每15分钟:-)

那么如何在6.0中使用AlarmManager 实现精确报警

如果用户添加一个提醒或日历约会,并希望在事件发生前10分钟通知应该显示报警前EXACT10分钟事件.使用setExactAndAllowWhileIdle()这似乎是不可能的.

参考链接:http: //developer.android.com/reference/android/app/AlarmManager.html#setExactAndAllowWhileIdle(int,long,android.app.PendingIntent)

Com*_*are 20

那么如何在6.0中使用AlarmManager实现精确报警?

欢迎您尝试setAlarmClock(),因为AFAIK不受打盹模式的影响.否则,AlarmManager对您来说不是一个可行的选择.即使您的应用程序使用电池优化白名单也无济于事,因为AlarmManager行为不会因白名单而改变.

欢迎您使用GCM,因为高优先级消息应该为您提供提醒用户的机会.当然,这需要网络连接.

我所知道的唯一离线解决方案 - 我目前正在测试 - 是让用户将您的应用添加到电池优化白名单,然后使用前台服务(尝试保持您的流程),a ScheduledExecutorService(用于定时)和部分WakeLock(保持CPU开启).这将对用户的电池造成相当大的破坏.

  • 哇..我不敢相信日历/提醒应用程序需要使用这种特殊方法,最终会在顶部显示不需要的图标 - 始终.也许"确切警报"应该变成用户需要明确授予的权限,例如直接拨打电话,这样我们就不必经历这一点. (9认同)
  • 哦谷歌这是一个糟糕的举动.创建一个新方法"setExactAndAllowWhileIdle()",但它不准确..对不起对我来说有点奇怪.并且所有日历应用程序都必须使用"setAlarmClock()"来显示有关即将到来的约会的正常通知?!?参考文献以setExactAndAllowWhileIdle()mehtod的日历命名为例?真令人困惑!?!? (7认同)
  • 在`setAlarmClock()`:( 1)当用于一小时内的警报时,它似乎阻止了打盹模式.(2)它只支持挂钟时间.要将其用于经过的间隔时间,请转换为墙上时间并在时钟或时区调整广播时重做它.(3)它在通知栏的右侧显示一个闹钟图标,锁屏显示闹钟的挂壁时间hh:mm.如果未在分钟边界上设置警报,则会出现错误/草率.(4)你给它一个PendingIntent,这样当用户点击图标时,操作系统可以打开你的Activity编辑闹钟. (2认同)

sec*_*_aw 8

即使在Doze空闲模式下,使用setExactAndAllowWhileIdle()进行一次性警报也会在给定时间内准确触发.所以这可能是要走的路.

如果你想以<15分钟的速度重复报警(或者在距离最后一个时间<15分钟的时间设置任何其他报警),问题就会开始,因为这在Doze空闲模式下不起作用,此类报警被强制执行到接下来的15分钟或在空转维护开始时执行,这在1小时后首先发生约10分钟,然后在2小时后再发生,然后又在4小时后发生,依此类推.

- 编辑 -

截至今天11月17日,Dianne Hackborn在本帖子的评论中写道:" 为了它的价值,空闲警报在相对较快的某个时间点变为9分钟之间的最短时间(即使在运行当前Marshmallow构建的设备上) . "

但这并没有从根本上改变任何事情.


chr*_*ine 6

以下是我在Google+上与Ian Lake的讨论!

setExactAndAllowWhileIdle()是准确的,应该可以工作.java doc中的15分钟时间框架是错误的.

在此输入图像描述

  • 我可以确认,就像在Android M预览决赛中一样,Android 6.0工厂的行为相同:setExactAndAllowWhileIdle()在Doze空闲时最多每15分钟触发一次,无论是"忽略优化"设置为开启还是关闭(以1分钟间隔测试).文档是正确的.如果您不使用间隔并且只使用RTC_WAKEUP设置setExactAndAllowWhileIdle()来触发一次,那么它可能是精确的.Doze模式存在很多误解...... (4认同)
  • @jmart:好的,所以每个"提醒"应用程序都不能在15分钟内多次提醒用户!! 对不起,电池寿命很好,但是这样一个坏主意.所有"提醒"应用程序现在都是糟糕的玩家.如果用户想要在下午2点和下午2:05进行提醒,则不再可能!出色的用户体验!! 谷歌你为什么这样做? (4认同)
  • 从我的测试来看,15分钟的限制仍然存在.这是确切的,因为警报没有因为setAndAllowWhileIdle的批处理而延迟,但文档对我来说似乎没问题. (3认同)
  • Ian Lake能够澄清这个问题会很棒.要么他错了,要么他知道我们没有. (3认同)
  • 另外:错误报告在哪里?我什么都没找到 (2认同)