Я хочу реализовать функцию расписания в моем проекте. Так что я гуглил для программы Alarm Manager, но не могу найти никаких примеров.
Может кто-нибудь помочь мне с базовой программой диспетчера тревоги?
java
android
kotlin
alarmmanager
Раджамохан Сугумаран
источник
источник
Ответы:
Это рабочий код. Процессор включается каждые 10 минут, пока телефон не выключится.
Добавить в Manifest.xml:
Код в вашем классе:
Установить сигнал тревоги от службы:
Если вы хотите установить повтор будильника во время загрузки телефона:
Добавьте разрешение и сервис в Manifest.xml:
И создайте новый класс:
источник
am.setInexactRepeating(...)
чтобы телефон не проснулся из-за сервиса. Другие программисты должны принять к сведению этот факт. 2. Вместо того , чтобы создавать новыйAlarm
вAutoStart
после приемаRECEIVE_BOOT_COMPLETED
намерение, это может сделать больше смысла , чтобы начатьYourService
сAutoStart
, как показано здесь: stackoverflow.com/a/5439320/198348WakefulBroadcastReceiver
изгнан изAndroid O
Я попробовал решение из ХХХ, и хотя изначально оно работало, в какой-то момент оно перестало работать.
onReceive
Никогда не был призван снова. Я часами пытался понять, что это может быть. Я понял, чтоIntent
по какой-то таинственной причине больше не вызывали. Чтобы обойти это, я обнаружил, что вам действительно нужно указать действие для получателя в манифесте. Пример:Обратите внимание, что имя
".Alarm"
с точкой. ВsetAlarm
методе XXX создайтеIntent
следующее:START_ALARM
Сообщение может быть все , что вы хотите быть. Я просто дал ему это имя в демонстрационных целях.Я не видел получателей, определенных в манифесте, без фильтра намерений, который определяет действие. Создание их способом, указанным XXX, кажется фальшивым. Указав имя действия, Android будет вынужден создать экземпляр
BroadcastReceiver
класса, который соответствует действию. Если вы полагаетесь на контекст, помните, что в Android есть несколько разных объектов, которые ВСЕ называют контекстом и могут не привести к получениюBroadcastReceiver
созданного вами . Заставить Android создавать экземпляр вашего класса, используя только сообщение действия, гораздо лучше, чем полагаться на какой-то сомнительный контекст, который может никогда не сработать.источник
PendingIntent.getBroadcast
документации,For security reasons, the Intent you supply here should almost always be an explicit intent, that is specify an explicit component to be delivered to through Intent.setClass
.android:exported="true"
нужно для того , чтобы работать?Вот довольно самостоятельный пример. Через 5 секунд кнопка становится красной.
Помните, что AlarmManager срабатывает, даже если ваше приложение не запущено. Если вы вызываете эту функцию и нажимаете кнопку «Домой», подождите 5 секунд, а затем вернитесь в свое приложение, кнопка станет красной.
Я не знаю, какое поведение вы будете вести, если ваше приложение вообще не будет в памяти, поэтому будьте осторожны с тем, какое состояние вы пытаетесь сохранить.
источник
RTC_WAKEUP
вместоELAPSED_REALTIME_WAKEUP
) не запускает приемник в приложении, которое, очевидно, было выгружено системой для энергосбережения, хотя оно работает вскоре после того, как домашний экран выведен на передний план.MainActivity.java
MyBroadcastReceiver.java
AndroidManifest.xml
источник
•
AlarmManager
в сочетании сIntentService
Я думаю, что лучшим вариантом для использования
AlarmManager
является его сотрудничество сIntentService
.IntentService
ЗапускаетсяAlarmManager
и обрабатывает необходимые действия через принимающую намерения. Эта структура не влияет на производительность, как использованиеBroadcastReceiver
. Я разработал пример кода для этой идеи вКотлин который доступен здесь:MyAlarmManager.kt
MyIntentService.kt
manifest.xml
Использование:
Если вы хотите отменить запланированный будильник, попробуйте это:
источник
Этот код поможет вам сделать повторяющуюся тревогу. Время повторения может быть установлено вами.
activity_main.xml
MainActivity.java
Если вам нужна тревога только один раз, замените
с участием
источник
Я сделал свою собственную реализацию, чтобы сделать это максимально простым способом.
Единственный следующий шаг, реализовать его.
Мне нравится работать с этой реализацией, но другой возможный хороший способ - не делать
AbstractSystemServiceTask
класс абстрактным, а собирать его через Builder.Я надеюсь, что это поможет вам.
ОБНОВЛЕНО Улучшено, чтобы разрешить несколько
BackgroundTaskListener
на одномBroadCastReceiver
.источник
Диспетчер тревог:
Добавить в XML-макет (* инициировать эти представления при создании в основной деятельности)
Добавить в манифест (тег внутри приложения && внешняя активность)
Создать класс AlarmBroadcastManager (наследовать его от BroadcastReceiver)
В основной деятельности (добавить эти функции):
источник
Вот пример использования Alarm Manager с использованием Kotlin:
источник