Klasa IntentService
zapewnia prostą strukturę umożliwiającą uruchamianie operacji w jednym wątku w tle. Pozwala to obsługiwać długotrwałe operacje bez wpływu na szybkość reagowania interfejsu użytkownika. Ponadto większość zdarzeń cyklu życia interfejsu użytkownika nie wpływa na IntentService
, więc będzie nadal działać w sytuacjach, w których wyłączenie interfejsu AsyncTask
spowoduje wyłączenie interfejsu AsyncTask
Element IntentService
ma kilka ograniczeń:
-
Nie może ona wchodzić w bezpośrednią interakcję z interfejsem użytkownika. Aby umieścić jego wyniki w interfejsie, musisz wysłać je do:
Activity
. -
Żądania robocze są uruchamiane po kolei. Jeśli w obiekcie
IntentService
wykonywana jest operacja, a Ty wyślesz do niej kolejne żądanie, będzie ono czekać na zakończenie pierwszej operacji. -
Operacja działającej na
IntentService
nie może zostać przerwana.
Jednak w większości przypadków preferowanym sposobem wykonywania prostych operacji w tle jest IntentService
.
W tym przewodniku pokazujemy, jak:
- Utwórz własną podklasę dla zajęć
IntentService
. - Utwórz wymaganą metodę wywołania zwrotnego
onHandleIntent()
. - Zdefiniuj
IntentService
w pliku manifestu.
Obsługuj intencje przychodzące
Aby utworzyć komponent IntentService
dla swojej aplikacji, zdefiniuj klasę, która rozszerza zakres IntentService
, a w jej obrębie zdefiniuj metodę, która zastępuje właściwość 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 onStartCommand()
, są wywoływane automatycznie przez IntentService
. W IntentService
należy unikać zastępowania tych wywołań zwrotnych.
Więcej informacji o tworzeniu klasy IntentService
znajdziesz w artykule o rozszerzaniu klasyIntentService.
Zdefiniuj usługę intencji w pliku manifestu
IntentService
musi też mieć wpis w pliku manifestu aplikacji.
Podaj tę pozycję 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
.
Zwróć uwagę, że element <service>
nie zawiera filtra intencji. Activity
, który wysyła do usługi żądania robocze, używa jawnego 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ż podstawową klasę IntentService
, możesz wysyłać do niej żądania robocze za pomocą obiektów Intent
. Procedura tworzenia tych obiektów i wysyłania ich do IntentService
jest opisana w sekcji Wysyłanie żądań roboczych do usługi w tle.