La classe IntentService
offre una struttura semplice per la corsa
su un singolo thread in background. Ciò gli consente di gestire operazioni a lunga esecuzione
senza influire sulla reattività dell'interfaccia utente. Inoltre,
IntentService
non è interessato dalla maggior parte degli eventi del ciclo di vita dell'interfaccia utente, quindi
continua a essere eseguito in circostanze che causerebbero l'arresto di un AsyncTask
Un IntentService
ha alcune limitazioni:
-
Non può interagire direttamente con l'interfaccia utente. Per inserire i risultati nell'interfaccia utente,
devi inviarli a un
Activity
. -
Le richieste di lavoro vengono eseguite in sequenza. Se un'operazione è in esecuzione
IntentService
e tu ne invii un'altra, la richiesta attende fino a viene completata la prima operazione. -
Un'operazione in esecuzione su
IntentService
non può essere interrotta.
Nella maggior parte dei casi, però, è preferibile optare per IntentService
e semplici operazioni in background.
Questa guida spiega come fare:
- Crea la tua sottoclasse di
IntentService
. - Crea il metodo di callback richiesto
onHandleIntent()
. - Definisci il
IntentService
nel file manifest.
Gestire gli intent in entrata
Per creare un componente IntentService
per la tua app, definisci una classe che
estende IntentService
e, al suo interno, definisci un metodo che
esegue l'override di onHandleIntent()
. Ad esempio:
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 ... } }
Nota che gli altri callback di un componente Service
regolare, come
onStartCommand()
vengono richiamati automaticamente da
IntentService
. In un IntentService
, dovresti evitare
eseguendo l'override di questi callback.
Per ulteriori informazioni sulla creazione di un IntentService
, consulta l'articolo Estensione del
IntentService.
Definisci il servizio per intent nel manifest
È necessario inserire anche IntentService
nel manifest dell'applicazione.
Fornisci questa voce come
<service>
elemento secondario di
Elemento
<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>
L'attributo android:name
specifica il nome della classe del
IntentService
.
Nota che
<service>
non contiene un
filtro per intent. La
Activity
che invia richieste di lavoro al servizio utilizza un
Intent
esplicito, quindi non occorre alcun filtro. Anche questo
significa che solo i componenti nella stessa app o in altre applicazioni con
con lo stesso ID utente
possono accedere al servizio.
Ora che hai il corso IntentService
di base, puoi inviare richieste di lavoro
con Intent
oggetti. La procedura per creare questi oggetti
e il loro invio al tuo IntentService
è descritto in
Inviare richieste di lavoro al servizio in background.