AlarmManager не установлен или не стреляет в Зефир после определенного времени

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

Но начиная с Зефира, AlarmManager либо не установлен, либо не срабатывает после некоторого простоя. Кажется, что текущая сигнализация срабатывает еще раз, но тогда новый сигнал тревоги не будет установлен.

Я прочитал некоторую документацию, и это, скорее всего, о зефире доза. Поэтому я реализовал следующее (и проверил, что оно на самом деле выполняется):

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

Это ничего не меняет.

Есть ли надежный способ установить и включить сигнализацию даже на Зефире после некоторого простоя?

1 ответ

Решение

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

       setAlarmClock(AlarmManager.AlarmClockInfo info, PendingIntent operation)

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

Не забывайте, что AlarmClock Info имеют разные PendingIntentтот setAlarmclock,

ОБНОВИТЬ

Если вы хотите сделать простой будильник (не будильник).

это должно работать

    setExactAndAllowWhileIdle(int type, long triggerAtMillis, PendingIntent operation)

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

Другие вопросы по тегам