Klasa IntentService
zapewnia prostą strukturę do wykonywania operacji na jednym wątku w tle. Dzięki temu może obsługiwać długotrwałe operacje bez wpływu na czas reakcji interfejsu. Ponadto IntentService
nie jest zależny od większości zdarzeń cyklu życia interfejsu użytkownika, więc działa nadal w okolicznościach, w których AsyncTask
zostałby zamknięty.
Element IntentService
ma kilka ograniczeń:
-
Nie może wchodzić w bezpośrednią interakcję z interfejsem. Aby wyświetlić wyniki w interfejsie, musisz je wysłać do
Activity
. -
Żądania robocze są uruchamiane po kolei. Jeśli podczas wykonywania operacji w
IntentService
wyślesz do niego kolejne żądanie, żądanie oczekuje na zakończenie pierwszej operacji. -
Operacji wykonywanej na zasobie
IntentService
nie można przerwać.
W większości przypadków preferowaną metodą wykonywania prostych operacji w tle jest jednak IntentService
.
Z tego przewodnika dowiesz się, jak:
- Utwórz własną podklasę
IntentService
. - Utwórz wymaganą metodę wywołania zwrotnego
onHandleIntent()
. - Określ
IntentService
w pliku manifestu.
Obsługa intencji przychodzących
Aby utworzyć komponent IntentService
dla aplikacji, zdefiniuj klasę, która rozszerza IntentService
, a w niej określ metodę, która zastępuje onHandleIntent()
. Na przykład:
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 ... } }
Zwróć uwagę, że inne wywołania zwrotne zwykłego komponentu Service
, np. onStartCommand()
, są automatycznie wywoływane przez IntentService
. W IntentService
nie należy zastępować tych funkcji zwracających wartości.
Więcej informacji o tworzeniu klasy IntentService
znajdziesz w artykule Rozszerzanie klasy IntentService.
Określ usługę intencji w pliku manifestu
Element IntentService
musi też mieć wpis w pliku manifestu aplikacji.
Podaj ten wpis jako element <service>
, który jest elementem podrzędnym elementu
<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>
Atrybut android:name
określa nazwę klasy IntentService
.
Zauważ, że element <service>
nie zawiera filtra intencji. W Activity
, który wysyła żądania służbowe do usługi, używa jawnego identyfikatora Intent
, więc filtr nie jest potrzebny. Oznacza to też, że dostęp do usługi mają tylko komponenty w tej samej aplikacji lub inne aplikacje z tym samym identyfikatorem użytkownika.
Gdy masz już podstawowy typ zajęć IntentService
, możesz wysyłać do niego prośby o zadania z obiektami Intent
. Procedura tworzenia tych obiektów i wysyłania ich do IntentService
jest opisana w artykule Wysyłanie żądań wykonania do usługi działającej w tle.