Класс 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 описана в разделе Отправка запросов на работу в фоновую службу.