Tworzenie usługi w tle

Klasa IntentService zapewnia prostą strukturę do uruchamiania operacji w pojedynczym wątku w tle. Dzięki temu może obsługiwać długotrwałe operacje bez wpływu na szybkość reagowania interfejsu. Ponadto Większość zdarzeń cyklu życia interfejsu użytkownika nie ma wpływu na IntentService, dlatego nadal działa w sytuacjach, które spowodowałyby wyłączenie AsyncTask

Element IntentService ma kilka ograniczeń:

  • Nie może wchodzić w bezpośrednią interakcję z interfejsem. Aby umieścić wyniki w interfejsie, wysłać je do Activity.
  • Żądania robocze są uruchamiane po kolei. Jeśli operacja jest wykonywana w IntentService, a Ty wyślesz do niej kolejną prośbę, poczeka, aż pierwsza operacja jest zakończona.
  • Nie można przerwać operacji uruchomionej na elemencie IntentService.

W większości przypadków jednak preferowanym sposobem działania jest IntentService i prostych operacji w tle.

Z tego przewodnika dowiesz się, jak:

Obsługa intencji przychodzących

Aby utworzyć komponent IntentService dla aplikacji, zdefiniuj klasę, która rozszerza metodę IntentService i w niej definiuje metodę, która zastępuje wartość 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, takie jak Pole onStartCommand() jest wywoływane automatycznie przez IntentService IntentService: należy unikać i zastępować te wywołania zwrotne.

Aby dowiedzieć się więcej o tworzeniu IntentService, zapoznaj się z artykułem Przedłużanie IntentService.

Określ usługę intencji w pliku manifestu

IntentService wymaga też wpisu w manifeście aplikacji. Udostępnij ten wpis jako <service> który jest elementem podrzędnym tagu Element <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 klasy IntentService

Zwróć uwagę, że <service> element nie zawiera filtr intencji. Activity, który wysyła do usługi żądania służbowe, używa jednoznacznie Intent, więc filtr nie jest potrzebny. To także oznacza, że tylko komponenty znajdujące się w tej samej aplikacji lub w innych aplikacjach z tagiem użytkownik o tym samym identyfikatorze użytkownika może uzyskać dostęp do usługi.

Po utworzeniu podstawowych zajęć w usłudze IntentService możesz wysyłać prośby o pracę za pomocą Intent obiektów. Procedura tworzenia tych obiektów i wysyłanie ich na urządzenie IntentService opisano w Wysyłanie próśb o pracę do usługi w tle.