Crea un servizio in background

La classe IntentService fornisce una struttura semplice per eseguire un'operazione su un singolo thread in background. In questo modo può gestire operazioni di lunga durata 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 funzionare in circostanze che causerebbero l'arresto di un AsyncTask

Un IntentService presenta 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 in un IntentService e ne invii un'altra, la richiesta attende fino al completamento della prima operazione.
  • Un'operazione in esecuzione su IntentService non può essere interrotta.

Nella maggior parte dei casi, però, è preferibile utilizzare IntentService per eseguire semplici operazioni in background.

Questa guida spiega come fare:

Gestire gli intent in arrivo

Per creare un componente IntentService per la tua app, definisci una classe che estende IntentService e al suo interno definisci un metodo che sostituisce 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
        ...
    }
}

Tieni presente che gli altri callback di un componente Service normale, come onStartCommand(), vengono richiamati automaticamente da IntentService. In un IntentService, devi 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 di intent nel manifest

È necessario che un IntentService sia presente anche nel file manifest dell'applicazione. Fornisci questa voce come elemento <service> 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 IntentService.

Tieni presente che l'elemento <service> non contiene un filtro per intent. Il Activity che invia richieste di lavoro al servizio utilizza un Intent esplicito, pertanto non è necessario alcun filtro. Ciò significa anche che solo i componenti della stessa app o di altre applicazioni con lo stesso ID utente possono accedere al servizio.

Ora che hai la classe IntentService di base, puoi inviare richieste di lavoro con oggetti Intent. La procedura per creare questi oggetti e inviarli a IntentService è descritta in Inviare richieste di lavoro al servizio in background.