В чем разница сервисов, broadcast receiver и content provider в Android
Что проверяют
Знаете ли вы четыре типа компонентов приложения и их роли. Заодно проверяют, в курсе ли вы ограничений современных версий Android, где половина старых приёмов уже не работает.
Как отвечать
Это три из четырёх компонентов (четвёртый это активити), и роли у них разные.
- Service выполняет работу без интерфейса. Различают привязанный сервис (живёт, пока к нему привязан клиент, общение через интерфейс) и запущенный. С Android 8 фоновые сервисы жёстко ограничены: длительная работа делается либо сервисом переднего плана с постоянным уведомлением (музыка, навигация, запись трека), либо через
WorkManager, если задача может подождать и обязана пережить перезапуск; - BroadcastReceiver реагирует на события: заряд батареи, смена сети, загрузка системы, собственные события приложения. С Android 8 большинство неявных широковещательных сообщений нельзя принимать через манифест, только регистрацией в коде, а для внутренних событий приложения правильнее брать
LocalBroadcastManager, а лучше поток данных внутри приложения; - ContentProvider даёт другим приложениям доступ к данным по адресу
content://с правами и уведомлениями об изменениях. Через него работают системные контакты, календарь, галерея. Внутри одного приложения он не нужен, для своей базы берут Room.
Полезно свести к правилу выбора: нужно сделать работу сейчас и заметно для пользователя, это сервис переднего плана; нужно сделать надёжно и позже, это WorkManager; нужно узнать о событии системы, это приёмник; нужно отдать данные наружу, это провайдер.
Где спотыкаются
Пытаются держать фоновый сервис ради периодической синхронизации и удивляются, что система его убивает.
Регистрируют приёмники в манифесте под события, которые с восьмой версии так уже не приходят.
Заводят провайдер для собственной базы, хотя наружу данные не отдаются.