AlarmManager не установлен или не срабатывает на Marshmallow через определенное время

Я успешно использовал следующую конструкцию для запуска 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 после некоторого простоя?


person devnull69    schedule 03.06.2016    source источник


Ответы (1)


Конечно, попробуйте с:

       setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)

Режим сна не запускается, если вы установили будильник таким образом. Я проверил это на консоли.

Не забывайте, что информация о будильнике отличается 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, чтобы вызвать диалог. При необходимости пользователь может вручную удалить приложения из белого списка. Прежде чем просить пользователя добавить ваше приложение в белый список, убедитесь, что приложение соответствует допустимым вариантам использования для внесения в белый список.

person jose    schedule 03.06.2016
comment
+1, потому что это, кажется, работает ... тем не менее, мне не нравится тот факт, что это будет поддерживать символ будильника в верхней строке состояния навсегда, даже если обычный будильник для пробуждения не установлен :- ( - person devnull69; 03.06.2016
comment
Хотя мне это не очень нравится, это кажется правильным ответом. Я заметил недостаток (по крайней мере, на моем LG G5 Android 6.0.1): мое приложение правильно распознает PowerManager#isIgnoringBatteryOptimizations, но настройки исключений оптимизации дремоты Android не показывают правильное состояние. Мне нужно дважды переключиться, чтобы снова отключить исключение - person devnull69; 06.06.2016
comment
Хорошо, недостаток, который я заметил, на самом деле является известной проблемой code.google.com. /p/android/issues/detail?id=191195 - person devnull69; 06.06.2016