Длительные операции в методе onReceive(). В чем их особенность?

Выполнять длительные операции в методе onReceive() не стоит.

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

Есть 2 способа, которые Google рекомендует использовать, чтобы выполнить какую-либо длительную операцию в onReceive()

  1. Использовать метод goAsync() внутри метода onReceive(). Вызов goAsync() в методе onReceive() сохраняет броадкаст активным после возврата из onReceive(). Но даже с использованием метода goAsync() система ожидает, что вы закончите операцию очень быстро и поэтому жизнь ресивера ограничивается 10 секундами
  2. Использовать JobScheduler

Поделиться уроком

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *