【问题标题】:AlarmManager not set or not firing on Marshmallow after certain time一段时间后,Marshmallow 上的 AlarmManager 未设置或未触发
【发布时间】:2016-06-03 06:27:09
【问题描述】:

我已经成功地使用以下构造在我的一些应用程序中启动了一个 AlarmManager,直到 Android 5:

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

但是从 Marshmallow 开始,AlarmManager 要么未设置,要么在一段时间空闲后不再触发。似乎当前正在运行的警报会再触发一次,但不会设置新的警报。

我阅读了一些文档,很可能是关于 Marshmallow Doze 的。所以我实现了以下内容(并检查了它是否实际正在执行):

    Intent serviceIntent = new Intent(context, MyService.class);
    PendingIntent pi = PendingIntent.getService(context, alarmId, serviceIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);

    DateTime inMinutes = (new DateTime()).plusMinutes(minutes);


    AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);

    if(Build.VERSION.SDK_INT >= 23)
        am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
    else {
        if(Build.VERSION.SDK_INT >= 19) {
            am.setExact(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
        } else {
            am.set(AlarmManager.RTC_WAKEUP, inMinutes.getMillis(), pi);
        }
    }

它不会改变任何东西。

有没有可靠的方法在 Marshmallow 闲置一段时间后设置和触发警报?

【问题讨论】:

    标签: android alarmmanager android-6.0-marshmallow android-alarms android-doze


    【解决方案1】:

    当然,试试:

           setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)
    

    如果你以这种方式设置闹钟,打盹模式不会启动。我在控制台上测试过。

    别忘了闹钟信息有一个不同的PendingIntentsetAlarmclock

    更新

    如果你想做一个简单的闹钟(不是闹钟)。

    这必须工作

        setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)
    

    但我现在没有。所以我开始寻找和谷歌,我发现了这个。一种将应用程序添加到打瞌睡白名单的可能方法。也许setExactAndAllowWhileIdle 有效。

    https://developer.android.com/training/monitoring-device-state/doze-standby.html?hl=es

    用户可以在设置 > 电池 > 电池优化中手动配置白名单。或者,系统为应用提供了要求用户将其列入白名单的方法。

    应用可以触发 ACTION_IGNORE_BATTERY_OPTIMIZATION_SETTINGS Intent 将用户直接带到电池优化,在那里他们可以添加应用。 拥有 REQUEST_IGNORE_BATTERY_OPTIMIZATIONS 权限的应用可以触发系统对话框,让用户直接将应用添加到白名单,而无需进入设置。该应用程序触发 ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS Intent 以触发对话框。 用户可以根据需要手动将应用从白名单中移除。 在要求用户将您的应用添加到白名单之前,请确保该应用符合可接受的白名单用例。

    【讨论】:

    • +1 因为它似乎正在工作......但是,我不喜欢这样一个事实,即这将永远保持顶部状态栏中的闹钟符号,即使正常的“唤醒” -up" 闹钟未设置 :-(
    • 尽管我不是很喜欢它,但它似乎是正确的答案。我注意到一个缺陷(至少在我的 LG G5 Android 6.0.1 上):我的应用正确识别 PowerManager#isIgnoringBatteryOptimizations,但 android doze 优化异常设置未显示正确的状态。我必须切换两次才能再次关闭异常
    • 好的,我注意到的缺陷实际上是一个已知问题code.google.com/p/android/issues/detail?id=191195
    猜你喜欢
    • 2011-04-07
    • 2020-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-20
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    相关资源
    最近更新 更多