1

我已经成功地使用以下构造在我的一些应用程序中启动了一个 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 闲置一段时间后设置和触发警报?

4

1 回答 1

3

当然,尝试:

       setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)

如果您以这种方式设置闹钟,则打盹模式不会启动。我在控制台上对此进行了测试。

不要忘记 AlarmClock Info 有一个不同的PendingIntent那个setAlarmclock

更新

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

这必须工作

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

于 2016-06-03T10:19:27.153 回答