Android AlarmManager未设置或在特定时间后未对棉花糖开火
我已成功使用以下构造在Android 5之前的一些应用程序中启动AlarmManager:Android AlarmManager未设置或在特定时间后未对棉花糖开火,android,alarmmanager,android-6.0-marshmallow,android-alarms,android-doze,Android,Alarmmanager,Android 6.0 Marshmallow,Android Alarms,Android Doze,我已成功使用以下构造在Android 5之前的一些应用程序中启动AlarmManager: Intent serviceIntent = new Intent(context, MyService.class); PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent, PendingIntent.FLAG_UPDATE_CURRENT); DateT
Intent serviceIntent = new Intent(context, MyService.class);
PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
DateTime inMinutes = (new DateTime()).plusMinutes(60);
AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
但由于棉花糖,AlarmManager要么没有设置,要么在一段空闲时间后不再启动。似乎当前运行的报警会再次触发,但不会设置新的报警
我读了一些文档,很可能是关于棉花糖打瞌睡的。因此,我实现了以下内容(并检查它是否正在实际执行):
这不会改变任何事情
即使在棉花糖闲置一段时间后,是否有可靠的方法设置和触发警报?当然,可以尝试以下方法:
setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)
如果你这样设置闹钟,打瞌睡模式不会启动。我在控制台上测试了这个
别忘了AlarmClock信息有一个与设置AlarmClock不同的PendingEvent
更新
如果你想制作一个简单的闹钟(不是闹钟)
这一定行得通
setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
但我现在知道它不是。所以我开始搜索谷歌,我发现了这个。将应用程序添加到doze白名单的可能方法。也许setExactAndAllowHileidle
可以工作
用户可以在设置>电池>电池优化中手动配置白名单。或者,该系统为应用程序提供方法,要求用户将其列入白名单
应用程序可以启动操作\u忽略\u电池\u优化\u设置,目的是让用户直接进入电池优化,在那里他们可以添加应用程序。
持有REQUEST\u IGNORE\u BATTERY\u OPTIMIZATIONS权限的应用程序可以触发一个系统对话框,允许用户直接将应用程序添加到白名单,而无需进入设置。该应用程序触发一个动作请求、忽略、电池优化,以触发该对话框。
用户可以根据需要手动从白名单中删除应用。
在要求用户将您的应用程序添加到白名单之前,请确保该应用程序与白名单的可接受用例相匹配
+1因为它似乎在起作用。。。然而,我不喜欢这样一个事实,即即使没有设置正常的“唤醒”闹钟,它也会永远保持顶部状态栏中的闹钟符号:-(尽管我不太喜欢它,但它似乎是正确的答案。我注意到一个缺陷(至少在我的LG G5安卓6.0.1上):我的应用程序正确识别
PowerManager\isIgnoringBatteryOptimizations
,但是android doze优化异常设置没有显示正确的状态。我必须切换两次才能再次关闭异常OK,我注意到的缺陷实际上是一个已知问题
setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)