Зачем использовать службу для фоновых задач?

Активность может использовать структуру AsyncTask или Handler для фоновой работы. Оба будут продолжать работать даже после того, как пользователь отошел от активности, которая их начала, и был вызван onDestroy для этой деятельности. Другими словами, активность полностью способна выполнять фоновую работу даже после завершения ее графического интерфейса.

В этом случае использование службы для фоновой работы кажется избыточным. Что Сервис приносит в таблицу, которую деятельность не может сделать? Спасибо.

Ответ 1

Что такое служба?

Большая путаница в отношении класса Service фактически вращается вокруг того, что это не так:

  • Служба не является отдельным процессом. Сам объект службы не подразумевает, что он работает в своем собственном процессе; если не указано иное, он работает в том же процессе, что и приложение, в котором оно входит.
  • Служба не является нитью. Это не значит, что нужно выполнять работу основного потока (чтобы избежать ошибок, связанных с ошибками приложения).

Таким образом, сама услуга на самом деле очень проста, обеспечивая две основные функции:

  • Объект приложения может сообщать системе о том, что он хочет делать в фоновом режиме (даже если пользователь не взаимодействует напрямую с приложением). Это соответствует вызовам Context.startService(), которые запрашивают у системы расписание работы для службы, которая должна выполняться до тех пор, пока служба или кто-то еще не остановит ее явно.
  • Объект приложения предоставляет некоторые функции для других приложений. Это соответствует вызовам Context.bindService(), что позволяет установить длительное соединение с сервисом для взаимодействия с ним.

Прочитайте остальную часть документации для получения дополнительной информации

Таким образом, один экземпляр службы - это то, что вы хотите совершить с установленными интервалами самостоятельно, без необходимости запуска активности или чего-либо еще, чтобы "запустить" ее. Например, SMSBackup - это всего лишь служба, которая работает в фоновом режиме, каждые 10 минут обрабатывает ваши SMS-сообщения и копирует их на ярлык gmail, как "резервное" обслуживание.

Ответ 2

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

Ответ 3

AsyncTask позволяет вам легко выполнять обновления пользовательского интерфейса, а также четко разделять логику пользовательского интерфейса и логику рабочего потока. Однако другие приложения не смогут получить доступ к вашей AsyncTask. В этом случае вам нужны услуги.

Ответ 4

@BraynDenny ответ достаточно хорош, я хотел бы объяснить в другой перспективе.

Во-первых, вы неправильно поняли значение фоновых задач, определение сервиса говорит Служба постоянно работает в фоновом режиме, даже если приложение не находится на переднем плане, здесь термин background не означает отдельный поток, это означает, что служба запускается, когда вы закрываете приложение в отличие от Activity, также запускается в основном потоке по умолчанию, если вы хотите, чтобы асинхронная служба использовала намерениеService

деятельность полностью способна выполнять фоновую работу даже после ее GUI был отключен.

То, о чем вы говорили, абсолютно неверно. Активность, Сервис - это компоненты Android, но AsyncTasks или Threads не являются компонентами , когда вы убиваете активность, Asynctask в активности также убивается, поскольку экземпляр Asynctask создается внутри класса активности, но когда вы начинаете загрузку файла с помощью службы переднего плана, он не убивается, даже если вы закрыть приложение, как и музыкальные приложения на Android, даже если вы закроете приложение, музыка все еще играет в фоновом режиме, показывая уведомление переднего плана

Существует три разных типа услуг, чтобы узнать больше о них, пожалуйста, проверьте эту ссылку https://developer.android.com/guide/components/services.html#CreatingBoundService