Создание фоновой службы

Класс IntentService предоставляет простую структуру для выполнения операции в одном фоновом потоке. Это позволяет обрабатывать длительные операции, не влияя на скорость отклика пользовательского интерфейса. Кроме того, на IntentService не влияют большинство событий жизненного цикла пользовательского интерфейса, поэтому он продолжает работать в обстоятельствах, которые привели бы к завершению работы AsyncTask.

У IntentService есть несколько ограничений:

  • Он не может напрямую взаимодействовать с пользовательским интерфейсом. Чтобы показать результаты в интерфейсе, их нужно отправить в Activity.
  • Запросы на выполнение работ выполняются последовательно. Если в IntentService выполняется операция и вы отправляете ещё один запрос, он будет ожидать завершения первой операции.
  • Операцию, выполняемую на IntentService, нельзя прервать.

Однако в большинстве случаев для выполнения простых фоновых операций предпочтительно использовать IntentService.

В этом руководстве рассказывается, как:

  • Создайте собственный подкласс IntentService.
  • Создайте необходимый метод обратного вызова onHandleIntent().
  • Определите IntentService в файле манифеста.

Обработка входящих намерений

Чтобы создать компонент IntentService для приложения, определите класс, расширяющий IntentService, и в нем определите метод, переопределяющий onHandleIntent(). Пример:

Kotlin

class RSSPullService : IntentService(RSSPullService::class.simpleName)

    override fun onHandleIntent(workIntent: Intent) {
        // Gets data from the incoming Intent
        val dataString = workIntent.dataString
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Java

public class RSSPullService extends IntentService {
    @Override
    protected void onHandleIntent(Intent workIntent) {
        // Gets data from the incoming Intent
        String dataString = workIntent.getDataString();
        ...
        // Do work here, based on the contents of dataString
        ...
    }
}

Обратите внимание, что другие обратные вызовы обычного компонента Service, например onStartCommand(), автоматически вызываются методом IntentService. В IntentService не следует переопределять эти обратные вызовы.

Подробнее о создании IntentService читайте в статье Extending the IntentService class (Расширение класса IntentService).

Определите сервис Intent в манифесте

Для IntentService также требуется запись в манифесте приложения. Добавьте эту запись в виде элемента <service>, который является дочерним по отношению к элементу <application>:

    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
        ...
        <!--
            Because android:exported is set to "false",
            the service is only available to this app.
        -->
        <service
            android:name=".RSSPullService"
            android:exported="false"/>
        ...
    </application>

Атрибут android:name указывает название класса IntentService.

Обратите внимание, что элемент <service> не содержит фильтр интентов. Activity, который отправляет запросы на работу в сервис, использует явный Intent, поэтому фильтр не нужен. Это также означает, что доступ к сервису могут получить только компоненты того же приложения или других приложений с тем же идентификатором пользователя.

Теперь, когда у вас есть базовый класс IntentService, вы можете отправлять ему запросы на выполнение работы с помощью объектов Intent. Процедура создания этих объектов и их отправки в IntentService описана в разделе Отправка запросов на работу в фоновую службу.