AlarmManager не работает на нескольких устройствах

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

Я уверен, что код прав (я использую WakefulBroadcastReceiver и setExactAndAllowWhileIdle для устройств с Doze), потому что он отлично работает на устройствах Nexus, но он не работает на устройствах некоторых производителей (Huawei, Xiaomi...).

У устройств Huawei, например, есть своего рода менеджер батарей, который убивает приложения, а когда приложение убито, запланированные аварийные сигналы отменены. Поэтому настройка приложения как "защищенного" в диспетчере аккумуляторов Huawei решает проблему.

Но недавно я заметил, что он не работает с большим количеством устройств: Xiaomi, Samsung (может быть, он связан с новым "Smart Manager"?)... Кажется, что это поведение становится стандартом: убивать фоновые приложения.

Кто-нибудь знает что-нибудь об этом? Любой способ обеспечить срабатывание сигнализации?

Ответ 1

Проблема заключается в Smart Manager. У Samsung есть менеджер батарей, который порой отключает определенные приложения от работы в фоновом режиме. Он пытался "возобновить" при возврате в приложение, но полностью отключает приложение или может возобновляться каждые 5 минут или около того (в зависимости от того, как у него Samsung).

Это будет работать с версиями Android, поскольку нет Samsung Manager. Вы также можете установить собственную версию андроида, которая имеет некоторые функции для включения SM (в зависимости от rom).

Ответ 2

Я пытаюсь решить это несколько недель. Я ничего не нашел. Huawei просто убивает все тревоги через некоторое время. Если я поместил приложение в защищенное приложение в свою батарею, это не поможет. Но если я изменяю имя пакета своего приложения, чтобы содержать такие слова, как будильник, часы или календарь, он работает абсолютно нормально, как на любых других устройствах. Я не понимаю, как Google может дать сертификацию для этого дерьма. Я думаю, что OEM не должен модифицировать базовую платформу таким образом. Я понимаю, что у них есть собственная заставка, которая убивает приложение через некоторое время, когда пользователь не использует его. Но это убийство также предупреждает о защищенных приложениях.

Также устанавливается setAlarmClock() для точных сигналов синхронизации. Но использовать это невозможно, поскольку это похоже на обновление виджета.

Ответ 3

я прекратил использовать AlarmManager некоторое время назад... более стабильная альтернатива

да.. это боль.. но работа сделана НЕ МАТЕРИ ЧТО

Ответ 4

Вы слушаете BOOT_COMPLETED? Вам нужно снова установить аварийные сигналы при перезагрузке устройства.

Ответ 5

У меня также есть приложение, которое устанавливает alarms.The решение заключается в использовании AlarmManager.setAlarmClock() на api >= 21. Это не затронуто от doze afaik и имеет дополнительный бонус помещать значок будильника в системный лоток.

Ответ 6

Использовать AlarmManager для < 5.0 устройств и JobScheduler для устройств с более высокой степенью защиты. Я не могу точно сказать, что JobScheduler не будет затронут производителями shenanigans, но для меня это будет гораздо менее вероятным, учитывая, что Android пытается отодвинуть людей от AlarmManager и на JobScheduler.

Ответ 7

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

Я думаю, что вам нужно указать отказ или faq в своем списке магазинов приложений/игр, в котором говорится, что это приложение должно быть исключено из приложения вашего менеджера батарей для правильной работы.

Ответ 8

Я не думаю, что убийство приложения предотвратит пробуждение вашего диспетчера аварийных сообщений.

Только когда вы "принудительно остановите" или отключите приложение, вы не получите обратные вызовы от диспетчера аварийных сообщений.

Коренной причиной может быть что-то еще.

Также на M... setExactAndAllowWhileIdle делает дросселирование... то есть, если вы планируете будильник каждые 2 минуты, он не будет запущен... Должно быть 15 минут окна..

Ответ 9

В какой версии Android работают эти устройства?

Как и в случае API 23, сама ОС переходит в режим ожидания в режиме низкой мощности, когда она не используется какое-то время, и в этом режиме тревоги не будут доставлены. Для приложений есть возможность явно сказать: "Мне нужна эта тревога, чтобы уйти в это время, независимо от использования батареи"; новые методы AlarmManager, называемые setAndAllowWhileIdle() и setExactAndAllowWhileIdle().

Из вашего описания это звучит так, что это может быть не особая причина ваших проблем на некоторых устройствах OEM-производителей, но это то, о чем должны знать все разработчики, использующие Alarm Manager.

Наконец, многие способы использования диспетчера аварийных сигналов лучше адресованы с использованием механизмов планировщика заданий. Для обратной совместимости функциональные возможности Служб Службы "GCM Network Manager" на самом деле очень близки к планировщику заданий - он использует Планировщик заданий внутри на новых версиях Android и не обязательно связан с сетью, несмотря на название класса.

Ответ 10

Для Xiaomi вам может потребоваться включить AutoStart для вашего приложения. Я пытаюсь сделать список изменений Android (обычно от производителя телефонов), которые могут повлиять на фоновый процесс. Если у вас есть что-то новое, добавьте здесь ответ Список убийц задач Android

Ответ 11

Нам нужно включить наше приложение в менеджер автозагрузки в диспетчере приложений, некоторые телефоны, такие как vivo v5,

In vivo v5, мы можем узнать это меню в iManager → App Manager → Auto Start Manager. Включите наше приложение здесь.

Затем ваш будильник/будильник вызовет тревогу, если приложение будет убито или закрыто.

Ответ 12

Я искал ответ, и через несколько часов я нашел это:

fooobar.com/info/24251/...

В резюме есть способ узнать, было ли ваше приложение убито "Защищенными приложениями", и это работает только на устройствах Huawei. сообщите мне, есть ли какое-либо решение для других устройств (Samsung, Sony, Xiaomi и т.д.).