Вы поставили будильник на семь утра, а проснулись в девять. Телефон включён, громкость на месте, будильник в списке. Обычно в такой момент ругают приложение, и иногда справедливо. Но нередко телефон сам не дал ему зазвонить.
Ниже объясняю, как это устроено изнутри. Настройки по шагам для каждой марки я вынес на отдельную страницу: почему не срабатывает будильник на Android.
Как будильник вообще звонит
Приложение-будильник не работает всю ночь. Оно просит систему разбудить его в 7:00 и закрывается. Такую запись в системе я дальше называю сигналом. В семь утра система запускает его заново, и только тогда оно включает звук и показывает экран.
Значит, ночью будильник целиком зависит от системы. Если она забыла о просьбе или решила выполнить её попозже, приложение об этом даже не узнает.
Что придумал сам Android
Начиная с Android 6 в системе есть режим экономии Doze. Когда телефон лежит неподвижно с выключенным экраном, система откладывает фоновую работу приложений и выполняет её пачками. Для будильников сделано исключение: есть особый способ поставить сигнал, который система обязана выполнить минута в минуту. Его видно снаружи: в строке состояния появляется значок будильника.
С годами правила ужесточались:
- в Android 12 для точных сигналов появилось отдельное разрешение "Будильники и напоминания", и человек может его отозвать;
- в Android 13 приложению понадобилось разрешение на уведомления, а экран звонка поднимается как раз через уведомление;
- в Android 14 показ на весь экран поверх блокировки оставили по умолчанию только приложениям для звонков и будильникам.
Всё это честные правила: они описаны, и приложение может им следовать.
Что добавляют производители
Почти каждый производитель ставит поверх Android свою экономию батареи. Общего описания у неё нет, она меняется от версии к версии, и приложение не может ни узнать о ней заранее, ни отключить её само. Чаще всего встречаются четыре механизма.
Запрет автозапуска. После перезагрузки телефона все поставленные сигналы стираются, и приложение должно поставить их заново. Для этого система будит его сразу после загрузки. На Xiaomi, Oppo и Vivo стороннему приложению такой запуск по умолчанию запрещён, а на Huawei его разрешает или запрещает сама система. Телефон обновился ночью и перезагрузился, будильник молчит.
Очистка памяти. Кнопка закрытия всех приложений в списке недавних на чистом Android просто убирает окна. На части прошивок она останавливает приложение принудительно, а принудительная остановка стирает его сигналы. Вернутся они, только когда вы снова откроете приложение.
Спящие приложения. Samsung переводит в спящий режим приложения, которые давно не открывали. Будильник легко попадает в спящие: его ставят один раз и неделями не трогают. По данным проекта Don't kill my app, на части версий хватало трёх дней.
Ограничение фона. "Контроль активности" у Xiaomi, "Запуск приложений" у Huawei, ночная экономия батареи у Realme. Называются по-разному, а делают одно: решают за вас, каким приложениям можно проснуться при выключенном экране.
Почему встроенные часы звонят
Производитель заранее внёс свои приложения в список исключений. На его часы не действуют ни контроль активности, ни запрет автозапуска. Скачанному будильнику те же права нужно выдать вручную.
Поэтому довод "встроенный же звонит" ничего не говорит о стороннем приложении.
Что может сделать приложение
Немного, но кое-что может. В Будильнике Кроха я сделал так:
- сигнал ставится тем самым особым способом, который система не откладывает, а рядом стоит запасной, на 15 секунд позже;
- сигналы пересчитываются после перезагрузки, после обновления приложения, при переводе часов и каждый раз, когда вы открываете список будильников;
- звук идёт по каналу будильников, поэтому беззвучный режим его не глушит;
- если телефон был выключен и включился в течение 15 минут после времени сигнала, будильник прозвонит сразу, а если позже, оставит отметку о пропуске.
Чего приложение не может: выдать себе автозапуск, вынуть себя из спящих, отменить чужую экономию батареи. Оно может только показать, что не так, и довести до нужного экрана. Для этого в Крохе есть экран "Почему будильник может не сработать": он проверяет разрешения и ограничения батареи на вашем телефоне, а кнопка рядом с каждой проверкой открывает нужную настройку.
Экран проверки в Будильнике Кроха. Напротив каждой строки статус и кнопка, которая ведёт в системную настройку
Что сделать вам
Три вещи на любом телефоне:
- Откройте сведения о приложении-будильнике и выберите для батареи вариант без ограничений.
- На Android 12 и новее откройте раздел "Будильники и напоминания": если ваш будильник есть в списке, переключатель должен быть включён.
- Разрешите приложению уведомления.
Дальше идут настройки конкретной марки, у каждой свои. Я собрал их по шагам, с путём по меню:
- Xiaomi, Redmi и POCO
- Samsung
- Huawei и Honor
- Realme, Oppo и OnePlus
- Vivo
- Tecno и Infinix
- Google Pixel и чистый Android
После крупного обновления системы пройдитесь по списку ещё раз: иногда оно возвращает настройки экономии в исходное состояние.
Сведения об ограничениях прошивок я сверял с проектом Don't kill my app! (Urbandroid Team, лицензия CC BY 4.0). Если на вашем телефоне пункты называются иначе или шаги не помогли, напишите в чат канала в Telegram или в MAX: поправлю страницу.