Android studio alarmmanager не срабатывает

Обновлено: 16.05.2024

и активность MyActivity появляется в указанное время. Только когда устройство подключено. Он также работает, когда он находится в кармане, или когда задержка составляет несколько минут. Но когда я устанавливаю alarmManager перед ночью, он не будет работать утром. Тем не менее, он будет работать, как только я возьму телефон или разблокировать экран.

Итак, я полагаю, это из-за сна режим устройства, но как это решить ?

1) я добавил журнал во всех методах myActivity, и я уверен, что никто не вызывается, прежде чем я вручную разбужу устройство. 2) я попробовал блокировку пробуждения PowerManagement (с разрешением WAKE_LOCK в манифесте), но ничего не изменилось :

пожалуйста, помогите ! Я уверена, что я так близко.

редактировать Dec 04'16 : Благодаря Нику Фрискелу и Викраму РАО, я изменил свой первоначальный код, чтобы вызвать broadcastReceiver и получить свой wakeLock в в onReceive. К сожалению, это не работает. Он отлично работает, когда телефон подключен или когда будильник планируется через 35 минут, но в течение полной ночи onReceive даже не вызывается. Я попытался в ту ночь, с сигнализацией, запланированной на 9:00, но onReceive был выполнен только в 9:46, что означает момент, когда я разблокировал устройство. Вот мой новый код :

что сказал, мой журнал пишет "начало onReceive" не в начале слушатель почему-то. Мне просто удалось поставить его в реальное начало, поэтому я посмотрю, вызван ли слушатель или нет.

редактировать Dec 05'16 : Итак, я изменил запись журнала в верхней части onReceive, и произошла та же проблема : запуск onReceive вызывается, как только я вручную разбужу устройство. Я могу реализовать wakefulBroadcastReceiver, но я боюсь, что это ничего не решит. Если я правильно понял, wakefulBroadcastReceiver полезен для предотвращения спящий режим между onReceive и запуском действия или службы. Но что, если onReceive даже не позвонил ? Я в отчаянии. Может быть, мне стоит напрямую спросить Sony. Кроме того, мой телефон имеет режим выносливости, но он не активирован.

EDIT Dec 11'16: Итак, с новыми тестами я теперь уверен, что ничего не понимаю. Я установил broadcastReceiver, который активируется каждые 5 минут (onReceive сбрасывает alarmManager через 5 минут), и я вижу, что это отлично рабочий. иногда. Он может длиться несколько часов и спать в течение двух часов, затем ОК в течение 30 минут, а затем снова спать. (все это, когда мой телефон включен, отключен и простаивает). Я собираюсь удалить весь код, но то, что нас интересует. Это будет легче понять, и я смогу написать здесь все активные код.

Почему AlarmManager иногда не исполняется ровно через 5 минут, как ему полагается? Может, например, иногда не сработать - зато в следующий промежуток времени целых 2 (или 3) раза, или же отстает на 1 минуту с периодичностью в полчаса. В общем, какие-то непонятки с его работой на реальном устройстве.

API 17, если что (Android 4.2.1, который). Т.е. setRepeating должен выдавать точный интервал.

Вся проблема в том, что Alarm Manager не гарантирует срабатывание в заданное время. На данном сайте написано следующее:

Note: Beginning with API 19 (KITKAT) alarm delivery is inexact: the OS will shift alarms in order to minimize wakeups and battery use. There are new APIs to support applications which need strict delivery guarantees; see setWindow(int, long, long, PendingIntent) and setExact(int, long, PendingIntent). Applications whose targetSdkVersion is earlier than API 19 will continue to see the previous behavior in which all alarms are delivered exactly when requested.

Что переводится (вкратце):

Начиная с API 19 срабатывание неточное. Операционная система передвигает\изменяет время срабатывания для сохранения батареи и минимизации количества пробуждений. Используйте setWindow(), если Вам нужно точное срабатывание.

Исходя из этого, Вам требуется использовать данный метод, чтобы все срабатывало именно тогда, когда нужно — setWindow.

UPD_0: в силу того, что Вы используете API 17, но у Вас все равно возникают проблемы с правильностью вызова в заданное время, следует последовать следующему совету, который написан в описании метода .setRepeating():

Schedule a repeating alarm. Note: for timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler. If there is already an alarm scheduled for the same IntentSender, it will first be canceled.

То есть, вручную переписывать вызов кода повторения через интервал на основе Handler.

У меня есть некоторые уведомления в приложении, чтобы показать пользователям в определенное время, но ничего не отображается, когда приложение закрыто.

Поэтому, когда дело доходит до scTime, даже если приложение закрыто, я хотел бы вызвать уведомление. Поэтому я вызываю службу по PendingIntent следующим образом:

Часть в манифесте, касающаяся этого:

Но ничего не обнаруживается. Что я делаю не так?

2 ответа

У меня есть этот код в моем приложении Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 11); calendar.set(Calendar.MINUTE, 30); calendar.set(Calendar.SECOND, 0); calendar.set(Calendar.AM_PM,Calendar.AM); //Debug. //calendar.set(Calendar.SECOND, Calendar.SECOND+5);.

У меня есть действие, которое использует AlarmManager для создания сигнала тревоги, который SUPPOSED срабатывает каждые 3 минуты. Это происходит, когда приложение закрыто, но когда вы открываете приложение и начинаете переходить к различным аспектам приложения, метод alarm onReceive() вызывается.

Ваш AndroidManifest.xml должен быть таким:

Диспетчер аварийных сигналов не запускает службы Intent на определенных телефонах. Я тестировал приложение на Oneplus 3T весь день, прежде чем понял, что с кодом все в порядке. Только что протестировал то же приложение на Moto G, и оно работает так, как ожидалось.

Похожие вопросы:

У меня есть куча пользовательских элементов управления в моем приложении. Когда я закрываю свое приложение,я хочу запустить некоторые конкретные функции в каждом из этих пользовательских элементов.

Привет всем, я пытаюсь научиться использовать AlarmManager и BroadcastReceiver в Android. У меня возникли некоторые проблемы с AlarmManager : Я устанавливаю два будильника на расстоянии 1 минуты, но.

Для пользовательского приложения напоминания я использую AlarmManager и PendingIntent , чтобы установить определенное время для моего Notification всплывающего окна. У меня есть мой.

У меня есть этот код в моем приложении Calendar calendar = Calendar.getInstance(); calendar.set(Calendar.HOUR_OF_DAY, 11); calendar.set(Calendar.MINUTE, 30); calendar.set(Calendar.SECOND, 0);.

У меня есть действие, которое использует AlarmManager для создания сигнала тревоги, который SUPPOSED срабатывает каждые 3 минуты. Это происходит, когда приложение закрыто, но когда вы открываете.

Я пытаюсь вызвать действие каждый день в 00:00:00 AM с помощью AlarmManager , но проблема в том, что в первый раз действие срабатывает быстро, а затем работает так, как ожидалось. В первый раз.

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

Я пытаюсь создать пример приложения сигнализации с помощью AlarmManager. Однако сигнал тревоги срабатывает в разное время, хотя я установил определенное время для его срабатывания. Установка.

При использовании AlarmManager в Android 7.1 (леденец на палочке) и ниже и закрытии приложения выполняются PendingIntent с Service С, а также с BroadcastReceiver с. В Android 8 (Oreo) и более.

Можно было бы подумать, что componentWillUnmount() в react сработает при закрытии приложения. Согласно документам, componentWillUnmount() срабатывает при его размонтировании или при уничтожении его.

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

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

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

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

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

Производители винят приложения в энергопотреблении и продолжают продавать восьмиядерные процессоры, которые потребляют больше батареи по сравнению с процессорами с меньшим количеством ядер. Думают ли они, что простое добавление ядра ускорит работу их телефонов? @AviLevinshtein Может, я неправильно понял ваш вопрос. Я создаю будильники в своей деятельности. Затем, когда срабатывает сигнал тревоги, запускается широковещательный приемник и, наконец, выполняется WakefulIntentService (класс из @commonsware). @JFValdes Я все еще ищу решение. AlarmManager отлично работает на устройствах с Vanilla Android. Проблема в том, что производители пытаются «улучшить» функции Android, и они сломали AlarmManager . Производители не должны внедрять свои собственные «средства экономии заряда батареи», если они используют стандартный режим Doze, то AlarmManager будет работать отлично . для решения . Есть ли решение? Как другие приложения, такие как напоминания или что-то в этом роде, делают это? Должен быть другой вариант, кроме setAlarm, который предназначен для сигналов тревоги, а не для напоминаний @SergioViudes Я также столкнулся с той же проблемой с устройствами Xiomi для отслеживания. и если я не позволю своему приложению ограничить экономию заряда батареи, то оно будет правильно работать на 3 из 4 устройств, выполнив следующие настройки - -> Перейти к батарее -> Питание -> Экономия заряда батареи -> ваше приложение Теперь выберите Без ограничений (для фоновых настроек), затем Разрешить вариант для фонового местоположения

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

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

Обновление: защита по ключевым словам имени пакета уже не работает на текущих устройствах Huawei, это было верно в 2017 году.

Так же, как и я, я тоже пробую, но не могу решить эту проблему на некоторых брендах Xiaomi, Oppo, Huawei. Иногда они убивают фоновый процесс и тревогу для экономии заряда батареи. У меня телефон huawei, изменение имени пакета на будильник / календарь ничего не дает. Единственный способ обойти это - добавить свое приложение в список защищенных приложений из диспетчера телефона

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

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

Я схожу с ума, потому что у меня нет устройства Samsung, чтобы проверить это. Я знаю только то, что мне говорят пользователи моего приложения. Знаете ли вы, что проблема в том, что AlarmManager не работает из-за того, что приложение было убито? Или проблема в том, что устройство не может проснуться при срабатывании будильника из-за этого менеджера? @SergioViudes В последнее время многие компании внедряют свои собственные. Например, у LG есть тот, который работает аналогично Samsung, может быть, у вашего телефона он есть? Проблема не в будильнике, приложение будильника переведено в состояние, когда оно полностью неактивно. Smart Manager считает, что это просто случайное приложение, которое вам не нужно. Я заметил, что некоторые приложения могут пройти через это, возможно, некоторые приложения принимаются умным менеджером. @SergioViudes У меня есть самсунг, который нужно протестировать, и я могу сказать, что от него мало что можно получить. Когда умный менеджер оптимизирует ваше приложение, не возникает никаких ошибок или чего-то еще, оно просто умирает, как при принудительной остановке. Тем не менее, оно все еще в списке последних приложений Спасибо, Тим. Было бы здорово решить эту проблему, не исключая приложения из «Умного» Менеджера. такие устройства, как xiaomi (miui), vivo и htc, по умолчанию устанавливают целый ряд разрешений как false, если только это не приложение в списке "доверенных" приложений, которое они сами определяют (whatsapp, truecaller и т. д. по умолчанию доверяют) ). Это становится кошмаром для программистов

Большинство современных Android-устройств поставляются с приложением или механизмом, который автоматически пытается выяснить, как сэкономить заряд батареи, и в результате может убить некоторые сторонние приложения. Это может привести к удалению запланированных задач и заданий (например, не срабатывают будильники, не работают push-уведомления и т. Д.). Во многих случаях это происходит совершенно независимо от механизмов экономии заряда батареи Android, в моем случае я не мог больше оптимизировать батарею, когда обнаруживаю какую-то модель устройства, я перенаправляю пользователя в менеджер запуска, чтобы внести мое приложение в белый список

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

РЕДАКТИРОВАТЬ: Google представил собственное решение этой проблемы под названием WorkManager . Он абстрагирует несколько структур планирования и использует наиболее подходящую для устройства.

К сожалению, в отличие от класса AlarmManager, время использования JobScheduler не является точным. В моем приложении время должно быть точным :( Я попробовал, и некоторые оптимизаторы (по крайней мере, Samsung) убивают все ожидающие задачи в JobScheduler, когда экран гаснет. Так что это тоже сломано. Это происходит на 5.0. После обновления до 6.0 он работает нормально, я думаю, они это исправили. У других производителей пока не смог протестировать. Для точного определения времени вы не можете использовать фоновую службу или запланированную службу. Вы можете попробовать использовать службу переднего плана, но это создаст для пользователя постоянное уведомление (что, вероятно, нежелательно), а в некоторых телефонах есть встроенные средства устранения задач, которые автоматически уничтожат службу переднего плана. WorkManager - лучшее решение, но, к сожалению, не даст вам точного времени.

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

Спасибо за Ваш ответ. Есть ли способ убрать иконку будильника? К сожалению, setAlarmClock иногда не работает. Я тестировал его на устройстве Oreo с малым объемом памяти.

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

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

Должен быть другой способ сделать это . Пользователи не будут читать отказ от ответственности. Я не могу думать, что телефоны Samsung не позволяют приложениям использовать AlarmManager . Сигнализация не сработает «вовремя», но в конечном итоге сработает Я бы сказал (к сожалению) самый полезный ответ. Хотелось бы найти лучшее решение, но производители оборудования портят отлично работающий ванильный Android.

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

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

да .. это боль .. но работа сделана НЕ ВАЖНО ЧТО

Спасибо за ваше предложение, но я бы хотел избежать этого подхода, потому что использование AlarmManager не потребляет оперативную память или какие-либо ресурсы. И если ваше приложение будет убито, служба остановится, верно? я не сказал, что этот подход БУЛЕТЗАЩИЩЕН, но, по крайней мере, он состоит из разных версий api :) Для надежной работы этому решению, вероятно, также потребуется использовать блокировки пробуждения, а это потребляет огромное количество заряда батареи.

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

Да. Как я уже сказал, сигнализация работала с 2012 года по настоящее время. Когда устройство перезагружается, я переназначаю будильники в широковещательном приемнике BOOT_COMPLETED. Требование перезагрузки для того, чтобы ваше приложение снова работало, - это даже не половина решения, @TimCastelijns, я совсем не это говорю. ЕСЛИ устройство перезагружается, все тревоги, установленные с помощью диспетчера тревог, должны быть установлены заново. @TylerPfaff: да, но перезапуск устройства не имеет отношения к проблеме, рассматриваемой в этом вопросе,

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

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

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

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

На устройствах Samsung с Smart Manager работает Lollipop. Я уже использую setExactAndAllowWhileIdle для устройств Marshmallow. Я посмотрю на JobScheduler и GCM. В любом случае, я не знаю, проблема в том, что будильник не срабатывает, или это устройство не просыпается при срабатывании будильника.

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

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

Основная причина может быть в другом.

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

Читайте также: