Как реализовать периодическое обновление данных в Android приложении
Что проверяют
Понимаете ли вы разницу между обновлением, пока экран открыт, и фоновой синхронизацией, и знаете ли ограничения системы на фоновую работу. Следом обычно спрашивают, почему нельзя обновлять данные в фоне каждую минуту.
Как отвечать
Пока пользователь на экране, достаточно корутин: во ViewModel поток flow { while (true) { emit(repo.load()); delay(30_000) } }, а в UI сбор через repeatOnLifecycle(Lifecycle.State.STARTED) или collectAsStateWithLifecycle() в Compose. Приложение ушло в фон, сбор остановился, запросы прекратились.
Для фона стандарт это WorkManager:
PeriodicWorkRequestBuilder<SyncWorker>(1, TimeUnit.HOURS): минимальный интервал 15 минут, меньшее значение поднимается до 15;CoroutineWorker: вместоWorker, чтобы вdoWork()вызывать suspend-функции репозитория. ВозвращаетResult.success(),Result.retry()с backoff илиResult.failure();Constraints:setRequiredNetworkType(NetworkType.CONNECTED),setRequiresBatteryNotLow(true);enqueueUniquePeriodicWork: с уникальным именем и политикойKEEPилиUPDATE, чтобы запуск приложения не плодил дубликаты.
WorkManager не гарантирует точное время: в Doze запуск откладывается до окна обслуживания. Если данные должны появиться сразу, правильнее не опрашивать сервер, а присылать data-сообщение через FCM и уже по нему ставить разовую задачу.
Точный AlarmManager требует разрешения SCHEDULE_EXACT_ALARM, которое на свежих версиях Android по умолчанию не выдаётся, так что для синхронизации его не берут. Foreground service оправдан, только когда пользователь видит идущий процесс, и с Android 14 требует объявленного типа.
Где спотыкаются
Ставят задачу через enqueue при каждом старте приложения. Копии накапливаются, и сервер получает кратно больше запросов.
Ожидают, что периодическая задача отработает ровно через заданный интервал, и строят на этом логику. Интервал задаёт минимум, а не расписание.
Держат опрос в Handler.postDelayed или в lifecycleScope.launch без repeatOnLifecycle. Запросы идут, пока приложение в фоне, а Handler с анонимным Runnable ещё и держит Activity, если забыть снять колбэки.