создать сервис всегда для каждого вещателя? - PullRequest
0 голосов
/ 08 февраля 2019

Я наблюдал паттерн, в котором все BroadcastReceiver имели Service, созданный вместе с ним.Я согласен, что длительный процесс требует service.

Есть ли какие-либо преимущества в создании service для всех BroadcastReceiver и использовании BroadcastReceiver только для получения трансляции, передайте ее на service?

Можно ли запуститьне сложная операция / задача в BroadcastReceiver сама?Есть ли недостатки или какие-либо анти-паттерны?

1 Ответ

0 голосов
/ 08 февраля 2019

При использовании BroadcastReceivers, это действительно зависит от объема работы, который необходимо выполнить.

Если работа достаточно легкая и может быть завершена в течение 10 секунд, то можно запустить ее прямо из метода onReceive () .Для легкой работы, такой как эта, имеет меньше смысла запускать Сервис, чтобы просто закончить эту работу.

Существует только 3 настоящие опасности для выполнения работы внутри BroadcastReceiver:

  • Выполнение работы в фоновом потоке может привести к тому, что BroadcastReceiver будет убит раньшевсе работы выполненыПо достижении конца onReceive() процесс BroadcastReceiver будет считаться процессом с низким приоритетом, поэтому он может быть уничтожен, если система этого потребует. Поэтому выполнение работы в фоновом режиме может привести к некорректному завершению работы, что весьма опасно, если вы вставляете данные в базу данных.

  • Выполнение работы наОсновной поток, чтобы избежать достижения конца onReceive().Я видел, как разработчики сделали это, чтобы бороться с предыдущей проблемой, которая вызывает проблемы с производительностью из-за потенциально слишком большой работы в основном потоке.Я уверен, что вы знаете, почему это плохо.

  • Выполнение слишком большого объема работы и превышение 10 секунд приведут к тому, что система будет рассматривать ваше приложение как не отвечающее.

Конечно, вы можете немного увеличить ограничение на фоновую работу с помощью метода goAsync(), но это не тот метод, который вы должны использовать вместо Сервиса.

Итак, с учетом этих трех опасностей, которые я упомянул, имеет смысл, почему популярное решение для выполнения дополнительной работы заключается в передаче работы надлежащему Сервису или JobScheduler.

Так что вам решать, какой вариант лучше подходит для вашего случая использования.

  1. Если работа действительно легкая, нет проблем с выполнением работы в BroadcastReceiver.

  2. Если работа легкая, но данные важны и ими нельзя рисковать, рассмотрите возможность сделать это в Службе.

  3. Если работа тяжелая, обязательно сделайте это через Сервис или запланируйте ее как работу в JobScheduler.

Но, честно говоря, мой общий совет - экономно использовать BroadcastReceivers.Используйте их только в случае необходимости, поскольку слишком большое количество зарегистрированных BroadcastReceivers и сервисов может повлиять на производительность вашего приложения.

...