При использовании BroadcastReceivers, это действительно зависит от объема работы, который необходимо выполнить.
Если работа достаточно легкая и может быть завершена в течение 10 секунд, то можно запустить ее прямо из метода onReceive () .Для легкой работы, такой как эта, имеет меньше смысла запускать Сервис, чтобы просто закончить эту работу.
Существует только 3 настоящие опасности для выполнения работы внутри BroadcastReceiver:
Выполнение работы в фоновом потоке может привести к тому, что BroadcastReceiver будет убит раньшевсе работы выполненыПо достижении конца onReceive()
процесс BroadcastReceiver будет считаться процессом с низким приоритетом, поэтому он может быть уничтожен, если система этого потребует. Поэтому выполнение работы в фоновом режиме может привести к некорректному завершению работы, что весьма опасно, если вы вставляете данные в базу данных.
Выполнение работы наОсновной поток, чтобы избежать достижения конца onReceive()
.Я видел, как разработчики сделали это, чтобы бороться с предыдущей проблемой, которая вызывает проблемы с производительностью из-за потенциально слишком большой работы в основном потоке.Я уверен, что вы знаете, почему это плохо.
Выполнение слишком большого объема работы и превышение 10 секунд приведут к тому, что система будет рассматривать ваше приложение как не отвечающее.
Конечно, вы можете немного увеличить ограничение на фоновую работу с помощью метода goAsync()
, но это не тот метод, который вы должны использовать вместо Сервиса.
Итак, с учетом этих трех опасностей, которые я упомянул, имеет смысл, почему популярное решение для выполнения дополнительной работы заключается в передаче работы надлежащему Сервису или JobScheduler.
Так что вам решать, какой вариант лучше подходит для вашего случая использования.
Если работа действительно легкая, нет проблем с выполнением работы в BroadcastReceiver.
Если работа легкая, но данные важны и ими нельзя рисковать, рассмотрите возможность сделать это в Службе.
Если работа тяжелая, обязательно сделайте это через Сервис или запланируйте ее как работу в JobScheduler.
Но, честно говоря, мой общий совет - экономно использовать BroadcastReceivers.Используйте их только в случае необходимости, поскольку слишком большое количество зарегистрированных BroadcastReceivers и сервисов может повлиять на производительность вашего приложения.