Некоторое время назад я интересовался разработкой приложения для Android. Я не опытный разработчик. Я новичок, который создал свое первое приложение для Android с помощью Google, Stackoverflow и Youtube. Так что, возможно, было бы несправедливо с моей стороны разглагольствовать об ужасном опыте, который я испытал, когда использовал класс Alarmmanager в своем приложении, но здесь я все равно разглагольствую.

Во-первых, проблема в приложении.
Мое приложение должно точно планировать уведомления на каждый день.

Решение.
Класс диспетчера аварийных сигналов в библиотеке Android предоставляет разработчику доступ к службе аварийных сигналов, которую разработчик может использовать для планирования любой задачи за один раз в рамках приложения или за его пределами. . Это было идеальное решение моей проблемы. Я мог выполнить задачу (в моем случае - уведомление) за раз, используя диспетчер тревог. Мне нужно было выполнять задачу каждый день в одно и то же время, и я мог использовать две функции из диспетчера тревог.

setRepeating () - который можно использовать для выполнения задачи ровно каждый день при условии времени.

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

Мне нужно, чтобы мое приложение выполняло задачу в точное время, поэтому я использовал функцию setRepeating. Но уведомление не было запущено точно. Он отключился от нескольких секунд до нескольких минут. После некоторого поиска я обнаружил, что Google изменил функцию setRepeating, чтобы она работала как функция setInexactRepeating после API 19. Мне было неприятно и странно, что две функции работали одинаково.

Затем, после непродолжительных поисков, я нашел нужную мне функцию. setExact, как следует из названия, должен запускать задачу в точное время. Я использовал это и снова обнаружил, что уведомление не срабатывает точно. Покопавшись в StackOverflow, я обнаружил, что даже setExact не был точным после Marshmallow для экономии заряда батареи. Работала как функция setInExact. Опять же, я обнаружил, что это странно, что две функции выполняют одну и ту же работу.

Есть еще одна неприятная вещь, которая называется режим сна. Google представил это в Android 7.0. Это заставляет функции диспетчера будильников перестать работать, когда телефон находится в полусонном режиме, то есть когда телефон не активен в течение нескольких минут. Большой! Мой будильник даже не сработает, если пользователь не использует телефон активно.

Я начал беспокоиться о своем приложении и, наконец, нашел решение, которое мне было нужно.

Функция setExactAndAllowWhileIdle - активирует будильник в нужное время и даже работает, когда телефон находится в режиме ожидания или в спящем режиме. Я наконец нашел своего воина, который работает так, как я хотел, но работает только после Marshmallow.

Некоторые хорошие люди из StackOverflow дали мне решение, которое я хотел. Используйте разные функции для разных версий. Вот мой код.

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

Я использовал setExact для версии Android ниже M и выше или равной O. Затем функцию setExactAndAllowWhileIdle для версии выше и равную M. Установите функцию для версии ниже и равную K. У меня есть разрешение блокировки пробуждения, которое заставляет будильник работать в дремоте режим.

Все хорошо, верно. НЕЕЕЕЕТ!
Вы видите, что Android фрагментирован, и каждый производитель телефонов Android настраивает ОС по своему вкусу. Таким образом, функция, которая работает в обычном Android, может не работать на других скинах Android, когда включена функция энергосбережения. У меня есть телефон Samsung, работающий на One UI. Мое приложение выдает уведомление в нужное время, только когда функция энергосбережения выключена. Я слышал, что это может не работать точно также в телефонах Redmi и OnePlus. Эти производители телефонов могут изменить поведение функции диспетчера аварийных сигналов Android, чтобы продлить срок службы батареи. Это серьезный недостаток работы Android. Должен ли я иметь разный код для каждого телефона, а также для разных версий Android?

Разработка этого модуля была самым неприятным занятием при разработке всего приложения для Android. Может, это только я. Опытные разработчики умеют это делать. Но Google должен упростить этот беспорядок и упростить жизнь таким разработчикам-новичкам, как я.

Дайте мне одну функцию, которая срабатывает в нужное время в каждой версии Android и в каждой оболочке Android.

Спасибо.