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