Длительные операции в методе onReceive(). В чем их особенность?
Выполнять длительные операции в методе onReceive() не стоит.
Дело в том, что если приложение не запущено, а ресивер принял какой-то броадкаст (это был статически зарегистрированный ресивер), то система запустит приложение (при этом не запустит активити, то есть приложение будет работать в фоне) и вызовет метод onReceive() вашего ресивера. Данный метод исполняется на главном потоке и поэтому должен исполняться быстро. В то же время, не стоит запускать новый поток или фоновый сервис из метода onReceive(), потому что если в это время от приложения будет активен только ресивер, то после исполнения onReceive() система может убить весь процесс приложения, чтобы освободить ОЗУ, при этом будет уничтожен и поток/сервис.
Есть 2 способа, которые Google рекомендует использовать, чтобы выполнить какую-либо длительную операцию в onReceive()
- Использовать метод goAsync() внутри метода onReceive(). Вызов goAsync() в методе onReceive() сохраняет броадкаст активным после возврата из onReceive(). Но даже с использованием метода goAsync() система ожидает, что вы закончите операцию очень быстро и поэтому жизнь ресивера ограничивается 10 секундами
- Использовать JobScheduler
Бесплатные Telegram-боты для обучения
Практика с проверкой кода и помощью ИИ-ментора
AndroidSprint AI Mentor
Проверяет Pull Request'ы в GitHub, проводит тестовые собеседования с голосом и таймером, помогает разбираться с кодом 24/7
Попробовать ИИ-ментора →KotlinSprint Bot
22 урока Kotlin, 220 тестов, 120 практических задач с код-ревью
Начать обучение Kotlin →