Crea un servizio in background

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:

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.