La classe IntentService
fornisce una struttura semplice per l'esecuzione di un'operazione su un singolo thread in background. In questo modo può gestire operazioni a lunga esecuzione senza influire sulla reattività dell'interfaccia utente. Inoltre, un IntentService
non è interessato dalla maggior parte degli eventi del ciclo di vita dell'interfaccia utente, quindi continua a essere eseguito in circostanze che potrebbero causare l'arresto di un AsyncTask
Un IntentService
ha alcune limitazioni:
-
Non può interagire direttamente con l'interfaccia utente. Per inserire i relativi risultati nell'interfaccia utente, devi inviarli a un
Activity
. -
Le richieste di lavoro vengono eseguite in sequenza. Se un'operazione è in esecuzione in un
IntentService
e le invii un'altra richiesta, la richiesta attende il completamento della prima operazione. -
Un'operazione in esecuzione su un
IntentService
non può essere interrotta.
Tuttavia, nella maggior parte dei casi un IntentService
è il modo migliore per eseguire operazioni in background semplici.
Questa guida illustra come effettuare le seguenti operazioni:
- Crea la tua sottoclasse di
IntentService
. - Crea il metodo di callback richiesto
onHandleIntent()
. - Definisci
IntentService
nel file manifest.
Gestire gli intent in arrivo
Per creare un componente IntentService
per la tua app, definisci una classe che
estenda IntentService
e, al suo interno, definisci un metodo che
esegua l'override di onHandleIntent()
. Ecco alcuni esempi:
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 ... } }
Tieni presente che gli altri callback di un normale componente Service
, come
onStartCommand()
, vengono richiamati automaticamente da
IntentService
. In un IntentService
, dovresti evitare di eseguire l'override di questi callback.
Per scoprire di più sulla creazione di un IntentService
, consulta Estensione della classe IntentService.
Definisci il servizio intent nel manifest
Per un IntentService
è necessaria anche una voce nel manifest dell'applicazione.
Fornisci questa voce come
elemento <service>
che è un elemento secondario dell'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 dell'elemento
IntentService
.
Tieni presente che l'elemento <service>
non contiene un filtro intent. Activity
che invia le richieste di lavoro al servizio utilizza un valore Intent
esplicito, quindi non sono necessari filtri. Ciò significa inoltre che solo i componenti nella stessa app o in altre applicazioni con lo stesso ID utente possono accedere al servizio.
Ora che hai la classe IntentService
di base, puoi inviarle richieste di lavoro con oggetti Intent
. La procedura per creare questi oggetti
e inviarli al tuo IntentService
è descritta in
Inviare richieste di lavoro al servizio in background.