Android

Android AlarmManager not working on some devices when the app is closed

Android AlarmManager не работает на некоторых устройствах при закрытии приложения

Я пытаюсь запускаться IntentService как таковой из AlarmManager setRepeating() каждые полчаса. Я хочу отправить сообщение в широковещательную рассылку из службы broad cast в службу intent. В сервисе будут реализованы некоторые функциональные возможности.

Но изначально AlarmManager не запускается, пока приложение находится в закрытом состоянии.

Когда мое приложение запущено или находится в фоновом режиме, будильник работает нормально, а когда я закрываю приложение, будильник не работает на некоторых устройствах.

Что я должен сделать, чтобы запустить оповещение, даже если приложение закрыто?

Переведено автоматически
Ответ 1

Из документации setRepeating():


Начиная с API 19, все повторяющиеся сигналы тревоги являются неточными.


Более того, setRepeating() не работает с Doze.

Вы должны использовать точные сигналы тревоги (устанавливаются соответствующим AlarmManager методом в зависимости от уровня API устройства):

if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
triggerTime, pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
}

И перепланируйте их каждый раз, когда они запускаются.

Для изменения расписания вы могли бы добавить исходное время запуска в Intent:

intent.putExtra(KEY_TRIGGER_TIME, triggerTime);

Затем извлеките это дополнительное значение из onReceive(), добавьте к нему желаемый интервал и перенесите оповещение, используя новое значение:

@Override
public void onReceive(Context context, Intent intent) {
long triggerTime = intent
.getLongExtra(KEY_TRIGGER_TIME, System.currentTimeMillis());

// adding one day to the current trigger time
triggerTime += TimeUnit.DAYS.toMillis(1);

// set a new alarm using the new trigger time
// ...
}

ПРИМЕЧАНИЕ: Как упоминалось @Opiatefuchs в комментарии выше, некоторые производители (такие как Xiaomi или Huawei) могут реализовывать определенные функции экономии заряда батареи, которые могут предотвращать срабатывание аварийных сигналов и не могут быть обойдены программно.

Ответ 2

В настоящее время устройства поставляются с большей безопасностью в контексте энергопотребления аккумулятора. По умолчанию устройства поддерживают почти все приложения в режиме энергосбережения. Это означает, что на некоторых устройствах ваша фоновая работа (определение местоположения, диспетчер аварийных сигналов) не будет работать, как только вы выйдете из приложения. На других устройствах фоновые задачи не будут работать после превышения порога заряда батареи (например, 13%). Поэтому вам необходимо отключить ваше приложение от этого режима экономии заряда батареи, чтобы оно работало бесперебойно даже в фоновом режиме. Способ добиться такого поведения у этих двух производителей заключается в:

Xiaomi


  • Перейдите в раздел "Аккумулятор" => "Питание" => "Экономия заряда приложения" => выберите свое приложение и выберите "Без ограничений" (для настроек фона), затем разрешите параметр "Фоновое расположение".



  • Чтобы запустить приложение автоматически после загрузки: перейдите в приложение безопасности => Разрешения => Автоматический запуск и проверьте свое приложение.



Samsung

Приложение Samsung Smart Manager раньше останавливало всю фоновую работу через 3 дня, если вы не заходите в свое приложение. Итак, способ отключить эту функцию:


  • Перейдите в раздел "Батарея" в настройках => Неконтролируемые приложения => Добавьте свое приложение в белый список. В некоторых других версиях Samsung может отличаться место его отключения, например Battery => Detail => Выберите приложение и "Не оптимизировать".

Для других устройств должны быть те же параметры питания либо непосредственно в настройках, либо для этого предоставлено какое-либо приложение.

Ответ 3

Во-первых, в Android Studio обнаружена ошибка. Если вы запустите приложение из Android Studio, а затем смахнете его с последних сообщений, сигналы тревоги будут удалены. Итак, после этого перезапустите свое приложение, нажав на значок лаунчера, а затем, если вы смахнете его, сигнал тревоги все еще будет там.

Во-вторых, на некоторых устройствах с оптимизацией заряда батареи вам следует запустить службу переднего плана, и она работает совершенно нормально.

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

Ответ 4

Приведенное ниже поведение изменилось после полной зарядки. Ранее, после отключения энергосбережения для этого приложения, отображалось, что активирована функция экономии заряда батареи и т.д., Но только после полной зарядки (из-за очень низкого заряда батареи) устройство вело себя должным образом. Поэтому измените эти настройки для приложения, затем выполните полную перезарядку (возможно, только после того, как ранее был низкий заряд батареи). Это может исправить проблему.


ZTE Blade L110

Даже если функция экономии заряда батареи отключена (Настройки -> Батарея -> Параметры -> Экономия заряда батареи) и приложение помечено как важное для сообщений (Настройки -> Приглашение и уведомления -> Уведомления приложения -> имя_приложения -> Приоритет), кажется, что ни setExact, ни setAlarmClock не запускаются вовремя.

java android