Создать фоновую службу

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