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


72

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

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

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

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

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

  0

Серхио, вы правы, у меня была та же проблема с повторяющейся еженедельной сигнализацией, это не сработало. Я не смог заставить его работать. Эта новая тенденция убьет все интересные приложения на Android. Я надеюсь, что производители это осознают. 13 янв. 162016-01-13 20:40:53

+5

Производители обвиняют приложения в потреблении энергии, и они продолжают продавать Octa-сердечники, которые потребляют больше батареи по сравнению с процессором с меньшим количеством ядер. Думают ли они, что просто добавление ядра ускорит их телефоны? 19 янв. 162016-01-19 07:59:14

  0

Итак ... мы больше не можем использовать AlarmManager с надежностью? 19 янв. 162016-01-19 17:26:15

  0

Привет @SergioViudes вы пробовали GCM Network Manager? Я не уверен, что вы используете AM, но, пожалуйста, прочтите следующее: https://developers.google.com/cloud-messaging/network-manager Это ближайшая аппроксимация для backport API JobSchedulers. 19 янв. 162016-01-19 22:09:55

  0

Спасибо @AviLevinshtein. Я бы хотел обойтись без сервера. Мне нужно, чтобы будильник погас в точное время, каждый день. Использование GCM может привести к задержкам или у пользователя может не быть подключения к Интернету. 20 янв. 162016-01-20 07:52:51

  0

Привет @SergioViudes, просто любопытно, вы пытаетесь установить AM из привязки сервиса к приложению или с другим процессом? 20 янв. 162016-01-20 12:38:32

  0

@AviLevinshtein Я устанавливаю AM из Activity 20 янв. 162016-01-20 15:53:58

  0

@SergioViudes, так как активность разрушена или изменения конфигурации плохой практике, чтобы включить ее для длительной работы, например диспетчера аварийных сигналов. служба ориентирована на более длительные запущенные задачи, которые должны выполняться в фоновом режиме. попробуйте прочитать о хорошем IntentService с реализацией AM, который устанавливается сначала внутри действия. Если хотите, я всегда могу написать вам хороший пример ниже. Просто дай мне знать. 20 янв. 162016-01-20 21:13:40

+1

@AviLevinshtein Возможно, я неправильно понял ваш вопрос. Я создаю тревогу в своей деятельности. Затем, когда будильник отключается, выполняется широковещательный приемник и, наконец, выполняется WakeakeIntentService (класс из @commonsware). 21 янв. 162016-01-21 08:24:23

  0

От одного охранника к другому, пожалуйста, попробуйте мой новый ответ ниже, setAlarmClock(). 28 янв. 162016-01-28 08:01:04

  0

У меня такая же точная проблема. Вы, наконец, смогли его решить? Сейчас я отчаялся. Почему тогда они создают класс AlarmManager, если вы не можете использовать его надежно. 31 мар. 162016-03-31 07:58:32

+2

@JFValdes Я все еще ищу решение. AlarmManager отлично работает на устройствах с Vanilla Android. Проблема в том, что производители пытаются «улучшить» функции Android, и они сломали AlarmManager ... Производители не должны реализовывать свои собственные «батареи», если они используют стандартный режим Doz, тогда AlarmManager будет работать отлично ... Все еще ищете решение ... 31 мар. 162016-03-31 18:09:30

+1

Есть ли еще решение? Как другие приложения, такие как напоминания или что-то в этом роде? Должен быть другой вариант, чем setAlarm, который предназначен для аварийных сигналов, а не для напоминаний. 06 июн. 162016-06-06 20:15:17

  0

Эй, @Sergio Viudes, наконец, как вы решили свою проблему? В мире андроидов много людей, которые страдают от этой проблемы .... скажите, как вы получили какое-либо решение для этого или нет? 06 дек. 162016-12-06 12:01:32

+1

@SergioViudes Я также сталкиваюсь с той же проблемой с устройствами Xiomi для отслеживания. и если я оставлю свое приложение от ограничения экономии батареи, чем его правильно работает на 3 из 4 устройств, выполнив следующие настройки: -> Перейти к аккумулятору -> Питание -> Заставка аккумулятора -> ваше приложение Теперь выберите «Нет ограничений» (для настроек фона), затем «Разрешить» для «Фонового местоположения» 07 дек. 162016-12-07 12:15:06

  0

Спасибо за ваш комментарий @ImranKhanSaifi, насколько я знаю, это единственное решение этой проблемы. 07 дек. 162016-12-07 15:26:02

  0

У меня такая же проблема на Huawei, она просто убивает мои запланированные тревоги. Я попытался поместить приложение в защищенное приложение, и это не поможет. Он не остановит приложение, но все равно убивает мою запланированную тревогу, которая не срабатывает.Я попробовал установить много приложений, которые, например, используют аварийные сигналы для виджета обновления, а некоторые из них работают правильно, также когда я не устанавливаю их как защищенные. Поэтому должна быть причина, по которой Huwei убивает мои тревоги, но нет для других приложений. 29 янв. 172017-01-29 23:10:44

0

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

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

  0

Должен быть другой способ сделать это ... Пользователи не будут читать отказ от ответственности. Я не могу думать, что телефоны Samsung не позволяют приложениям использовать AlarmManager ... 18 янв. 162016-01-18 14:16:07

  0

Сигналы тревоги не будут срабатывать «вовремя», но они будут в конечном итоге 19 янв. 162016-01-19 20:42:51

  0

Это (к сожалению) самый полезный ответ, я бы сказал , Я бы хотел, чтобы было лучшее решение, но производители аппаратных средств повреждают отлично работающий ванильный Android. 04 мар. 162016-03-04 01:33:24


0

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

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

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

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

+1

Спасибо за ваш ответ. Но, если нет, то почему приложение работает отлично, когда «оптимизация батареи» отключена в Smart Manager? 20 янв. 162016-01-20 08:02:11

  0

вы используете приложение на корневом устройстве. Если менеджер приложений может отключить приложение тоже. 20 янв. 162016-01-20 19:12:55

  0

Нет, я не запускаю его на корневом устройстве. 20 янв. 162016-01-20 19:19:19


1

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

  1. создание службы
  2. зарегистрировать BroadcastReceiver для BOOT_COMPLETED
  3. огня вашей службы от приемника
  4. старта новый обработчик внутри вашего сервиса, который зацикливается сам за каждые X минут (Android - running a method periodically using postDelayed() call)
  5. проверить, пришло ли время выполнения задачи: сейчас - время выполнения> 0 (0123))
  6. если так .. выполнить задание и остановить обработчик

да .. это не будет pain..but работы сделано не важно, что

+3

Спасибо за ваше предложение, но я хотел бы избежать этого подхода, потому что использование AlarmManager не будет потреблять ОЗУ или какой-либо ресурс. И, если ваше приложение будет убито, служба остановится, не так ли? 20 янв. 162016-01-20 07:57:12

  0

Я не сказал, что этот подход BOOLETPROOF, но по крайней мере он состоит из разных версий api :) 20 янв. 162016-01-20 18:27:18

  0

Чтобы работать надежно, это решение, вероятно, понадобилось бы также и для использования блокировок от бодрствования, и это могло бы потреблять огромное количество батареи. 29 авг. 162016-08-29 13:09:49

  0

Я думаю, что вы правы на этом. Единственный вопрос: что было бы хуже - ненадежный код или плохая производительность? во всяком случае, я лично считаю, что есть ** альтернативные способы блокировки **, которые могут быть подходящими в некоторых случаях (например: http://stackoverflow.com/questions/5346694/how-to-implement-a-lock-in -javascript) 29 авг. 162016-08-29 19:29:45


1

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

  0

Да. Как я уже сказал, с 2012 года до сих пор действуют тревожные сигналы. Когда устройство перезагружается, я переписываю сигналы тревоги в широковещательном приемнике BOOT_COMPLETED. 20 янв. 162016-01-20 07:53:54

+1

Требуется перезагрузка для вашего приложения, чтобы работать снова, даже не половина решения 24 фев. 162016-02-24 13:20:30

+1

@TimCastelijns, что совсем не то, что я говорю. ЕСЛИ устройство перезагружено, все аварийные сигналы, установленные с диспетчером аварийных сигналов, должны быть установлены снова. 25 фев. 162016-02-25 20:33:52

  0

@TylerPfaff да, но перезагрузка устройства не связана с проблемой в этом вопросе 25 фев. 162016-02-25 21:19:00


8

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

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

  0

Я схожу с ума, потому что у меня нет устройства Samsung для его проверки. Я знаю только то, что говорят пользователи моего приложения. Вы знаете, проблема в том, что AlarmManager не работает, потому что приложение убито? Или проблема в том, что устройство не может проснуться, когда будильник отключается из-за этого менеджера? 20 янв. 162016-01-20 07:59:10

  0

@SergioViudes В последнее время многие компании реализуют свои собственные. Например, у LG есть тот, который работает аналогично samsung, может быть, у вашего телефона есть один? Проблема заключается не в сигнале тревоги, приложение для будильника переводится в состояние, в котором оно полностью неактивно. Smart Manager думает, что это просто случайное приложение, которое вам не нужно. Я заметил, что некоторые приложения могут пройти мимо него, возможно, некоторые приложения принимаются смарт-менеджером. 20 янв. 162016-01-20 11:58:47

+1

@SergioViudes У меня есть тест для samsung, и я могу сказать вам, что вы не можете получить от него много. Когда умный менеджер оптимизирует ваше приложение, нет никакой ошибки или чего-то еще, он просто умирает, как и принудительная остановка. Он по-прежнему находится в списке последних приложений, хотя 24 фев. 162016-02-24 13:24:16

  0

Спасибо Тиму. Было бы здорово решить эту проблему, не исключая приложения из «Smart» Manager. 24 фев. 162016-02-24 16:34:15

  0

такие устройства, как xiaomi (miui), vivo и htc, по умолчанию устанавливают всю совокупность разрешений как ложных, если только это приложение не входит в список «доверенных» приложений, которые, по их мнению, сами определяют (whatsapp, truecaller и т. Д. Доверяют по умолчанию). Это становится кошмаром кодеров 14 авг. 172017-08-14 15:54:04


0

Какая версия Android работает на этих устройствах?

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

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

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

  0

Устройства Samsung с Smart Manager работают с Lollipop. Я уже использую setExactAndAllowWhileIdle для устройств Marshmallow. Я посмотрю на JobScheduler и GCM. Во всяком случае, я не знаю, является ли проблема в том, что тревога не исчезнет, ​​или если это устройство не пробуждается, когда срабатывает сигнализация. 21 янв. 162016-01-21 08:20:07


1

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

  0

Спасибо за ваш ответ. Есть ли способ удалить значок будильника? 28 янв. 162016-01-28 08:47:52

  0

Я так не думаю :( 28 янв. 162016-01-28 08:48:49


1

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

+2

К сожалению, в отличие от класса AlarmManager, время при использовании JobScheduler не является точным. В моем приложении время должно быть точным :( 17 июн. 162016-06-17 10:19:59

  0

Я дал ему попробовать и некоторые оптимизаторы (по крайней мере, у samsung) убить все ожидающие задачи в JobScheduler, когда экран погас, поэтому он также сломан. Это происходит в версии 5.0. После обновления до 6.0 он отлично работает, я думаю, они исправили это. Я еще не смог протестировать его с другими производителями. 29 сен. 162016-09-29 07:52:06


0

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


9

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

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

  0

То же, что и я, я также пробовал, но не смог решить эту проблему на некоторых брендах Xiaomi, Oppo, Huawei. Они иногда убивают фоновый процесс и тревогу, чтобы сэкономить аккумулятор. 15 мар. 172017-03-15 14:01:52

+1

У меня есть huawei телефон, меняя название пакета на будильник/календарь ничего не делает. Единственный способ обойти это добавить ваше приложение в список защищенных приложений от менеджера телефонов 24 авг. 172017-08-24 07:15:20

  0

не имеет значения, есть ли будильник или часы или календарь или козырь Donald 07 мар. 182018-03-07 11:40:41


0

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

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

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


0

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

https://stackoverflow.com/a/35220476/3174791

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