Класс IntentService
предоставляет простую структуру для выполнения операции в одном фоновом потоке. Это позволяет ему обрабатывать длительные операции, не влияя на скорость реагирования вашего пользовательского интерфейса. Кроме того, на IntentService
не влияет большинство событий жизненного цикла пользовательского интерфейса, поэтому он продолжает работать в обстоятельствах, которые могут привести к остановке AsyncTask
IntentService
имеет несколько ограничений:
- Он не может напрямую взаимодействовать с вашим пользовательским интерфейсом. Чтобы поместить результаты в пользовательский интерфейс, вам необходимо отправить их в
Activity
. - Рабочие запросы выполняются последовательно. Если операция выполняется в
IntentService
и вы отправляете ей еще один запрос, запрос ожидает завершения первой операции. - Операцию, выполняемую в
IntentService
нельзя прервать.
Однако в большинстве случаев IntentService
является предпочтительным способом выполнения простых фоновых операций.
В этом руководстве показано, как выполнить следующие действия:
- Создайте свой собственный подкласс
IntentService
. - Создайте необходимый метод обратного вызова
onHandleIntent()
. - Определите
IntentService
в файле манифеста.
Обработка входящих намерений
Чтобы создать компонент IntentService
для вашего приложения, определите класс, расширяющий IntentService
, и внутри него определите метод, который переопределяет onHandleIntent()
. Например:
Котлин
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 ... } }
Ява
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
см. в разделе Расширение класса IntentService .
Определите службу намерений в манифесте
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
описана в разделе «Отправка рабочих запросов в фоновую службу» .