Выполнять длительные операции в методе onReceive() не стоит.
Дело в том, что если приложение не запущено, а ресивер принял какой-то броадкаст (это был статически зарегистрированный ресивер), то система запустит приложение (при этом не запустит активити, то есть приложение будет работать в фоне) и вызовет метод onReceive() вашего ресивера. Данный метод исполняется на главном потоке и поэтому должен исполняться быстро. В то же время, не стоит запускать новый поток или фоновый сервис из метода onReceive(), потому что если в это время от приложения будет активен только ресивер, то после исполнения onReceive() система может убить весь процесс приложения, чтобы освободить ОЗУ, при этом будет уничтожен и поток/сервис.
Есть 2 способа, которые Google рекомендует использовать, чтобы выполнить какую-либо длительную операцию в onReceive()
- Использовать метод goAsync() внутри метода onReceive(). Вызов goAsync() в методе onReceive() сохраняет броадкаст активным после возврата из onReceive(). Но даже с использованием метода goAsync() система ожидает, что вы закончите операцию очень быстро и поэтому жизнь ресивера ограничивается 10 секундами
- Использовать JobScheduler