Service и IntentService в Android: руководство по Службам и пример использования

Service и IntentService в Android: руководство по Службам и пример использования

Service (Сервис) или Служба является одним из основных компонентов Android. Он используется повсеместно: от функционала для фонового скачивания файлов с интернета до проигрывания музыки с файловой системы устройства. Поэтому любому андроид разработчику необходимо понимать как работает компонент Service и уметь его правильно использовать.  

Теория по Service в Android

Служба работает в фоновом режиме, а это означает, что она не имеет пользовательского интерфейса и не зависит от Activity. Таким образом, Activity может быть уничтожена операционной системой, а Service продолжит работать в фоновом режиме. Чаще всего служба используется для выполнения длительных операций, с которыми не справится какой-нибудь AsyncTask.

Есть 2 типа служб в Android:

  1. Непривязанная служба (Unbound service)
  2. Привязанная служба (Bound service)

Unbound service — это служба, которая запускается Activity или с помощью BroadcastReceiver и не зависит от Activity. Он всегда будет работать в фоновом режиме. Такую службу может убить только система Android, когда ей недостаточно памяти для выполнения более приоритетных задачи.

Есть 2 типа непривязанной службы:

  1. Служба, которая наследуется от класса Service.
  2. Служба, которая наследуется от класса IntentService.

Рассмотрим разницу между ними и где лучше использовать каждый тип:

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

Внутри службы можно запускать несколько задач и выполнять их параллельно. Например, скачивать несколько mp3 файлов с интернета. Мы не знаем какая задача будет завершена первой, а какая — последней, поэтому контролировать процессы внутри службы нам помогает жизненный цикл компонента Service.

Проходит он так:

onCreate() -> onStartCommand() -> onDestroy()

Вызов onCreate()означает, что служба создана. После этого вызывается onStartCommand(), который свидетельствует о том, что служба начала работу в фоновом режиме. Именно в этом методе мы должны описать задачи, которые необходимо выполнить в компоненте Service. Вызов метода onDestroy() даст нам знать, что сервис уничтожен.

Пример создания Service в Android

Наже представлен просто пример работы сервиса:

Предположим, что мы пишем приложение, в котором SimpleService в фоне выполняет какую-то важную работу. Из теории выше мы знаем, что Service может быть уничтожен системой Android если ей понадобится дополнительная память. Поэтому нам нужно позаботиться о том, чтобы служба снова перезапустилась, когда появится доступная память. В этом случае мы можем задать поведение сервиса с помощью необходимого флага поведения:

  • Флаг START_STICKY означает, что вашу службу нужно перезапустить если что-то пошло не так. Однако в этом случае любые данные переданные службе будут утеряны, потому что система перезапуская ее передаст null на вход метода startCommand().
  • Флаг START_NOT_STICKY означает, что в случае проблем система не перезапустит вашу службу. То есть, такой сервис нужно перезапускать вручную.

Задавать флаг нужно в методе onStartCommand():

Вторым типом непривязанной службы является IntentService.

IntentService в Android

Служба IntentService запускается рабочим потоком, а не основным потоком или потоком пользовательского интерфейса. Из IntentService нельзя обновлять пользовательский интерфейс, потому что он всегда работает в фоне. Чаще всего он используется для длительных операций, например, загрузки файлов с сервера.

IntentService может быть запущен из Activity или BroadcastReceiver. При запуске всегда происходит цепочка вызовов метода жизненного цикла:

onCreate() -> onHandleIntent() -> onDestroy()

Служба IntentService создается после вызова метода onCreate(), а выполнение задач в фоне происходит в методе onHandleIntent(). Уничтожение службы происходит вызовом методома onDestroy(). Также IntentService сам автоматически останавливается после завершения задачи.

Интересной особенностью IntentService является то, что если у вас запущено несколько задач, то он будет обрабатывать задачи по очереди: одну один раз, а другие задачи будут ждать в очереди. Как только текущая задача будет завершена, IntentService приступает к выполнению следующей задачи из очереди.

Простейший пример IntentService:

Bound Service — привязанная служба в Android

Вторым типом службы в Android является Bound service.

Bound service — служба, которая позволяет привязывать службу к клиенту. Эта служба начнет работать, после вызова метода bindService(). Также она предоставляет возможность работы с ней в том же процессе или же в другом процессе. Для другого процесса привязывание происходит с помощью IPC (межпроцессной связи).

Межпроцессная связь обеспечивает запуск службы в отдельном потоке или нескольких потоках. Для однопоточного процесса будет работать Messenger (о нем мы поговорим в следующих статьях), а для нескольких потоков будет использован AIDL (Язык определения интерфейса Android), например, воспроизведение аудио, видео и т.п.

Bound Service может привязываться либо с Activity, либо с BroadcastReceiver. Что нам нужно сделать, так это просто вызвать метод bindService(). Для привязки службы необходимо передать экземпляр IBinder в метод onBind() жизненного цикла. Когда задача завершается, нужно вызывать метод unBind() клиента.

IBinder — базовый интерфейс просто и легковесного механизма обработки удаленных процедур.

Давайте посмотрим, как это работает в приложении. У нас вот такой Bound service:

Давайте создадим Activity для привязки этой службы к клиенту.

Для создания соединения между клиентом и сервером используем экземпляр специального ServiceConnection. Мы можем привязать службу в методе onStart() и отвязать unbindService() в методе onStop(). Вот и все.

В следующей статье мы рассмотрим IPC Remote connection для привязки компонентов Service. Следите за обновлениями в соц. сетях и подписывайтесь на новые статьи.

Добавить комментарий

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