Ответ
Да, делал. Основные сложности: работа с AlarmManager и WakeLock для гарантированного срабатывания, обработка Doze Mode, создание персистентного уведомления для Android 8+.
Пример установки будильника:
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
val intent = Intent(context, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, FLAG_IMMUTABLE)
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
Для Android 10+ важно запрашивать SCHEDULE_EXACT_ALARM permission. Также учитывал различия в API уровней и тестировал на разных устройствах.
Ответ 18+ 🔞
А, ну это классика, ёпта! Слушай, я с этими будильниками на Андроиде так намучился, что готов уже ебать мои старые костыли. Казалось бы, что сложного — поставить таймер, чтобы он сработал. Ан нет, хуй с горы!
Основная засада была в двух вещах. Первое — это AlarmManager и WakeLock, чтобы твой будильник не проспал, когда телефон в глубоком сне. Второе — это этот ёперный театр с Doze Mode, который на новых андроидах так экономит батарею, что твоему алёрму просто пиздец наступает.
И да, не забудь про персистентное уведомление для восьмёрки и выше, а то система твой сервис прибьёт, как муху, и будильник нихуя не сработает. Доверия к этой системе — ноль ебать.
Вот, смотри, как я это делал, чтоб хоть как-то работало:
val alarmManager = context.getSystemService(ALARM_SERVICE) as AlarmManager
val intent = Intent(context, AlarmReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, FLAG_IMMUTABLE)
alarmManager.setExactAndAllowWhileIdle(
AlarmManager.RTC_WAKEUP,
triggerTime,
pendingIntent
)
Ключевой момент — setExactAndAllowWhileIdle. Без этого в режиме Doze можешь забыть о точном времени. Но и это не панацея, чувак.
А ещё для десятки и выше нужно явно запрашивать разрешение SCHEDULE_EXACT_ALARM, иначе система тебе просто скажет «иди нахуй» и проигнорирует точный алёрм. Удивление пиздец, когда вроде всё сделал, а оно не работает, а оказывается, пермишна не дал.
Пришлось овердохуища времени потратить, чтобы всё это учесть: различия в API, протестить на куче разных девайсов, от древних кирпичей до последних флагманов. Каждый твик по-своему косячит. В общем, задача на терпение, которого у меня уже ноль ебать осталось.