Crea un servizio in background

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:

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.