Servizio vs IntentService nella piattaforma Android


774

Sto cercando un esempio di qualcosa che può essere fatto con un IntentServiceche non può essere fatto con un Service(e viceversa)?

Credo anche che un venga IntentServiceeseguito in un thread diverso e un Serviceno. Quindi, per quanto posso vedere, avviare un servizio all'interno del proprio thread è come avviare un IntentService. È corretto?


45
IntentService is used for short tasks (etc) and a service is for long onesdove l'hai letto?
njzk2,

9
anche, ti consiglio di leggere il codice sorgente per IntentService. Rende abbastanza chiaro cosa sia e cosa faccia.
njzk2,

1
Ho modificato la mia domanda dopo aver visto il tuo commento.
roiberg,


2
Link nel commento precedente (di greg7gkb) è un'ottima lettura.
DSlomer64,

Risposte:


1348

Tejas Lagvankar ha scritto un bel post su questo argomento. Di seguito sono riportate alcune differenze chiave tra Service e IntentService.

Quando usare?

  • Il servizio può essere utilizzato in attività senza UI, ma non dovrebbe essere troppo lungo. Se è necessario eseguire attività lunghe, è necessario utilizzare i thread all'interno del servizio.

  • L'IntentService può essere utilizzato in compiti lunghi di solito con nessuna comunicazione al thread principale. Se è necessaria la comunicazione, è possibile utilizzare il gestore del thread principale o gli intenti di trasmissione. Un altro caso di utilizzo è quando sono necessari callback (attività attivate dall'intento).

Come innescare?

  • Il servizio viene attivato chiamando il metodo startService().

  • L'IntentService viene attivato utilizzando una Intent, si genera un nuovo thread di lavoro e il metodo onHandleIntent()viene chiamato su questo thread.

Attivato da

  • Il servizio e IntentService possono essere attivati ​​da qualsiasi thread, attività o altro componente dell'applicazione.

Gira su

  • Il servizio viene eseguito in background ma viene eseguito sul thread principale dell'applicazione.

  • L'IntentService viene eseguito su un thread di lavoro separato.

Limitazioni / Svantaggi

  • Il servizio può bloccare il thread principale dell'applicazione.

  • L'IntentService non può eseguire attività in parallelo. Quindi tutti gli intenti consecutivi andranno nella coda dei messaggi per il thread di lavoro e verranno eseguiti in sequenza.

Quando fermarsi?

  • Se si implementa un servizio , è responsabilità dell'utente interrompere il servizio al termine del suo lavoro, chiamando stopSelf()o stopService(). (Se si desidera solo fornire l'associazione, non è necessario implementare questo metodo).

  • L'IntentService interrompe il servizio, dopo tutte le richieste iniziali sono stati gestiti, in modo da non dover chiamata stopSelf().


11
breve e dolce, ma è meglio se modifichi la tua risposta includendo i punti di CommonsWare, poiché molte persone leggono solo le risposte accettate o più votate
Shirish Herwade,

12
@Darpan Un servizio è un componente dell'applicazione che può eseguire operazioni di lunga durata in background e non fornisce un'interfaccia utente. Un servizio viene eseguito nel thread principale del suo processo di hosting. Il servizio non crea il proprio thread e non viene eseguito in un processo separato (se non diversamente specificato). Ciò significa che, se il tuo servizio eseguirà un lavoro intensivo della CPU o operazioni di blocco (come la riproduzione di MP3 o il networking), dovresti creare un nuovo thread all'interno del servizio per farlo.
José Juan Sánchez,

8
"IntentService deve essere attivato dal thread principale." Sei sicuro? All'interno di MainActivity onCreate (), quando chiamo un IntentService da un nuovo thread (codice sotto), funziona ancora per me. new Thread (new Runnable () {@Override public void run () {Intent intent = new Intent (context, HelloIntentService.class); startService (intent);}}). start ();
Ashok Bijoy Debnath il

9
@AshokBijoyDebnath Hai ragione! I Servizi e IntentServices possono essere avviati da qualsiasi thread, attività o altro componente dell'applicazione. Ho appena modificato il testo della risposta per risolvere questo problema. Grazie per il tuo suggerimento di modifica! :)
José Juan Sánchez il

2
Nessun problema, provaci!
José Juan Sánchez,

165

Se qualcuno può mostrarmi un esempio di qualcosa che può essere fatto con un IntentServicee non può essere fatto con un Servicee viceversa.

Per definizione, questo è impossibile. IntentServiceè una sottoclasse di Service, scritta in Java. Quindi, qualsiasi cosa IntentServicefaccia, Servicepotrebbe fare, includendo i relativi bit di codice che IntentServiceutilizza.

Avviare un servizio con il proprio thread è come avviare un IntentService. Non è?

Le tre caratteristiche principali di un IntentServicesono:

  • il thread di sfondo

  • l'accodamento automatico di Intents consegnato a onStartCommand(), quindi se uno Intentviene elaborato dal onHandleIntent()thread in background, altri comandi fanno la coda in attesa del loro turno

  • lo spegnimento automatico del IntentService, tramite una chiamata a stopSelf(), una volta che la coda è vuota

Tutto ciò potrebbe essere implementato da un Servicesenza estensione IntentService.


6
Un po 'tardi, ma sto scoprendo che Servicechiamare con startServicepuò funzionare solo per circa 10 secondi prima di lanciare un ANR - un IntentServiceinizio con la trasmissione di un intento non sembra avere questa limitazione
edthirdird

16
@edthethird: Questo perché stavi collegando il thread principale dell'applicazione. Tutti i metodi del ciclo di vita su tutti i componenti, incluso onStartCommand()di a Service, vengono chiamati sul thread principale dell'applicazione. Non puoi collegare questo thread per più di qualche millisecondo senza congelare l'interfaccia utente e, se impieghi molti secondi, otterrai il servizio equivalente di un ANR.
CommonsWare,

3
Sì, ho commentato troppo presto. Stavo facendo il lavoro onStartCommandinvece di onHandleIntent- sembra che onStartCommandsia eseguito sul thread dell'interfaccia utente, tuttavia viene generato un thread separato per l' onHandleIntentesecuzione.
terzo terzo

3
@IgorGanapolsky: lo IntentServicechiama da solo, dopo i onHandleIntent()ritorni, se non c'è più lavoro da fare.
Commons War

1
Il problema non è l'inglese, ma la programmazione. Ad esempio, "ho CHIUSO l'app" non ha una definizione precisa, quindi non posso dirti cosa succede quando ciò accade. Inoltre non so come "ho CHIUSO l'app" a cui si riferisce "verrà scaricato dopo 1 ora". Potresti considerare di porre una domanda Stack Overflow separata, in cui puoi fornire un esempio riproducibile minimo di "verrà scaricato dopo 1 ora". Lì, puoi spiegare in dettaglio cosa significa "ho CHIUSO l'app" (ad esempio, cosa fa specificamente l'utente per chiudere l'app?).
CommonsWare,

39

Servizio

  • Invoca da startService()
  • Attivato da qualsiasi Thread
  • Gira su Main Thread
  • Può bloccare il thread principale (UI). Usa sempre il thread all'interno del servizio per attività lunghe
  • Una volta completato il compito, è nostra responsabilità interrompere il servizio chiamando stopSelf()ostopService()

IntentService

  • Esegue compiti lunghi di solito nessuna comunicazione con il thread principale se è necessaria la comunicazione, quindi viene eseguita da HandleroBroadcastReceiver
  • Richiamare via Intent
  • Attivato da Main Thread
  • Funziona sul thread separato
  • Impossibile eseguire l'attività in parallelo e più intenti sono in coda sullo stesso thread di lavoro.

19

Non reinventare la ruota

IntentService estende la classe di servizio , il che significa chiaramente che IntentServiceè stato intenzionalmente creato per lo stesso scopo.

Qual è lo scopo?

`Lo scopo di IntentService è di semplificare il nostro lavoro per eseguire attività in background senza nemmeno preoccuparti

  • Creazione del thread di lavoro

  • Accodamento della richiesta multipla di elaborazione uno alla volta ( Threading)

  • Distruggere il Service

Quindi NO , Servicepuò fare qualsiasi attività che IntentServicesi farebbe. Se i requisiti rientrano nei criteri sopra indicati, non è necessario scrivere quelle logiche nella Serviceclasse. Quindi non reinventare la ruota perché IntentServiceè la ruota inventata.

La differenza principale

Il servizio viene eseguito sul thread dell'interfaccia utente mentre un IntentService viene eseguito su un thread separato

Quando usi IntentService?

Quando si desidera eseguire più attività in background una per una che esiste al di fuori dell'ambito di un'attività, allora IntentServiceè perfetto.

Come IntentServiceè fattoService

Un servizio normale viene eseguito sul thread dell'interfaccia utente (per impostazione predefinita Activity, qualsiasi tipo di componente Android viene eseguito sul thread dell'interfaccia utente , ad esempio BroadcastReceiver, ContentProvidere Service). Se devi completare del lavoro che potrebbe richiedere del tempo, devi creare una discussione. Nel caso di più richieste, dovrai occuparti di synchronization. IntentServiceviene fornita un'implementazione predefinita che svolge tali compiti per te.
Secondo la pagina dello sviluppatore

  1. IntentService crea un thread di lavoro

  2. IntentServicecrea una coda di lavoro che invia una richiesta al onHandleIntent()metodo uno per uno

  3. Quando non c'è lavoro, IntentServicechiama il stopSelf()metodo
  4. Fornisce un'implementazione predefinita per il onBind()metodo che è null
  5. Implementazione predefinita per la onStartCommand()quale invia una Intentrichiesta a WorkQueue ed eventualmente aonHandleIntent()

15

Aggiunta di punti alla risposta accettata:

Vedi l'uso di IntentService nell'API di Android. per esempio:

public class SimpleWakefulService extends IntentService {
    public SimpleWakefulService() {
        super("SimpleWakefulService");
    }

    @Override
    protected void onHandleIntent(Intent intent) {  ...}

Per creare un componente IntentService per la tua app, definisci una classe che estende IntentService e al suo interno, definisci un metodo che sovrascrive onHandleIntent ().

Inoltre, vedi il codice sorgente di IntentService, è costruttore e metodi del ciclo di vita come onStartCommand ...

  @Override
    public int More ...onStartCommand(Intent intent, int flags, int startId) {
       onStart(intent, startId);
        return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;
    }

L'assistenza insieme a un AsyncTask è uno dei migliori approcci per molti casi d'uso in cui il payload non è enorme. o semplicemente creare una classe che estende IntentSerivce. Da Android versione 4.0 tutte le operazioni di rete dovrebbero essere in background, altrimenti la compilazione / compilazione dell'applicazione fallisce. thread separato dall'interfaccia utente. La classe AsyncTask fornisce uno dei modi più semplici per avviare una nuova attività dal thread dell'interfaccia utente. Per ulteriori discussioni su questo argomento, vedere il post sul blog

dalla guida per sviluppatori Android :

IntentService è una classe di base per i Servizi che gestiscono richieste asincrone (espresse come Intenti) su richiesta. I client inviano richieste tramite chiamate startService (Intent); il servizio viene avviato in base alle esigenze, gestisce ciascun Intento, a sua volta, utilizzando un thread di lavoro e si interrompe quando si esaurisce il lavoro.

Modello di progettazione utilizzato in IntentService

: Questo modello di "processore della coda di lavoro" viene comunemente utilizzato per scaricare attività dal thread principale di un'applicazione. La classe IntentService esiste per semplificare questo modello e prendersi cura della meccanica. Per usarlo, estendi IntentService e implementa onHandleIntent (Intent). IntentService riceverà gli Intenti, avvierà un thread di lavoro e interromperà il servizio nel modo appropriato.

Tutte le richieste vengono gestite su un singolo thread di lavoro: possono richiedere il tempo necessario (e non bloccheranno il ciclo principale dell'applicazione), ma verrà elaborata solo una richiesta alla volta.

La classe IntentService fornisce una struttura semplice per l'esecuzione di un'operazione su un singolo thread in background. Ciò consente di gestire operazioni di lunga durata 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 funzionare in circostanze che potrebbero arrestare un AsyncTask.

Un IntentService presenta alcune limitazioni:

Non può interagire direttamente con la tua interfaccia utente. Per inserire i suoi risultati nell'interfaccia utente, devi inviarli a un'attività. Le richieste di lavoro vengono eseguite in sequenza. Se un'operazione è in esecuzione in un IntentService e si invia un'altra richiesta, la richiesta attende fino al termine della prima operazione. Un'operazione in esecuzione su un IntentService non può essere interrotta. Tuttavia, nella maggior parte dei casi

IntentService è il modo preferito per semplici operazioni in background

**

Biblioteca Volley

C'è la libreria chiamata volley-library per lo sviluppo di applicazioni di networking Android Il codice sorgente è disponibile per il pubblico in GitHub.

La documentazione ufficiale Android per le migliori pratiche per i lavori in background : aiuta a comprendere meglio il servizio di intenti, il thread, il gestore, il servizio. e anche eseguire operazioni di rete


1
Potrebbe essere meglio, se potessi dare una risposta breve, fino al punto.
eRaisedToX

12

Sono sicuro che puoi trovare un ampio elenco di differenze semplicemente cercando su Google qualcosa come "Android IntentService vs Service"

Una delle differenze più importanti per esempio è che IntentService termina da solo una volta terminato.

Alcuni esempi (rapidamente inventati) potrebbero essere;

IntentService: se vuoi scaricare un sacco di immagini all'inizio dell'apertura della tua app. È un processo una tantum e può ripulirsi dopo aver scaricato tutto.

Servizio: un servizio che verrà costantemente utilizzato per comunicare tra l'app e il back-end con le chiamate all'API Web. Anche se è finito con il suo compito attuale, vorresti comunque che lo fosse qualche minuto dopo, per ulteriori comunicazioni.


2
Non ho trovato un esempio che si possa fare con l'uno e non con l'altro. solo alcune spiegazioni che non mi hanno aiutato.
roiberg,

1
Prova questo sito, ha molte buone spiegazioni sui concetti di base di Android con esempi decenti vogella.com/articles/AndroidServices/article.html
Stefan de Bruijn

4
È un altro esempio di "come usare". non quando si utilizza specificamente il servizio e quando intentservice. Per favore, dammi un esempio teorico e non collegamenti a "come usare" o qualsiasi altro modo per farlo. Non ti sto chiedendo di "lavorare" per me mentre non sto facendo nulla è solo che ho già visto tutte quelle simpatie e ancora non sono sicuro.
roiberg,

5
questa è una differenza piuttosto importante. ad esempio, se si utilizza il servizio per mantenere una connessione persistente con il server, non è possibile utilizzare intentservice per questo in quanto è terminato subito dopo aver completato tutte le sue attività
pelotasplus

24
quando lo google, mi porta qui. ora sono in un ciclo infinito.
Lou Morda,

12

IntentService

IntentServiceviene eseguito sul proprio thread. Si fermerà quando avrà finito. Più come il fuoco e dimenticare. Le chiamate successive verranno messe in coda. Buono per mettere in coda le chiamate. Puoi anche girare più thread all'interno IntentServicese necessario. Puoi farlo usando ThreadPoolExecutor. Dico questo perché molte persone mi hanno chiesto "perché usare IntentServicepoiché non supporta l'esecuzione parallela". IntentServiceè solo un filo. Puoi fare tutto ciò di cui hai bisogno al suo interno, anche girare più thread. L'unica avvertenza è che IntentServicetermina non appena giri questi thread multipli. Non aspetta che tornino quei thread. Devi prenderti cura di questo. Quindi mi consiglia di utilizzare ThreadPoolExecutorin quegli scenari.

  • Buono per la sincronizzazione, il caricamento ecc ...

Servizio

Per impostazione predefinita, Serviceviene eseguito sul thread principale. Devi girare un thread di lavoro per fare il tuo lavoro. Devi fermarti serviceesplicitamente. L'ho usato per una situazione in cui devi eseguire roba in background anche quando ti allontani dalla tua app e torni di più per un Headless service.

  • Ancora una volta è possibile eseguire più thread, se necessario.
  • Può essere utilizzato per app come lettori musicali.

Puoi sempre comunicare di nuovo alla tua attività usando BroadcastReceiversse necessario.


8

Un IntentService è un'estensione di un servizio creato per facilitare l'esecuzione di un'attività che deve essere eseguita in background e in un thread separato.

IntentService si avvia, crea un thread ed esegue la sua attività nel thread. una volta fatto pulisce tutto. È possibile eseguire solo un'istanza di IntentService contemporaneamente, diverse chiamate vengono accodate.

È molto semplice da usare e molto conveniente per molti usi, ad esempio il download di materiale. Ma ha delle limitazioni che possono farti venir voglia di usare invece il servizio più semplice (non semplice).

Ad esempio, un servizio connesso a un server xmpp e vincolato da attività non può essere fatto semplicemente usando un IntentService. Finirai per ignorare o ignorare i contenuti di IntentService.


quello che sembra è che la maggior parte delle persone che vogliono eseguire un vero servizio di lunga durata in background finiscono per provare a trovare IntentService perché i documenti fanno sembrare che sia per quello, ma potresti principalmente usare lo stesso nuovo thread (new Runnable ()). start (). in altre parole, quando parla di "genera un nuovo thread" che è tutto ciò che fa, non lo sposta in un processo separato che è in realtà ciò che la maggior parte delle persone cerca di fare quando vogliono separare un codice in esecuzione dall'attività ! (perché solo la generazione di thread è comunque una fodera)
Lassi Kinnunen,

intentService si occupa anche del ciclo di vita del thread e utilizza un looper, che aiuta lo scheduler. Inoltre, garantisce che sia in esecuzione solo un'istanza e mette in coda altre chiamate.
njzk2,

5

Se qualcuno può mostrarmi un esempio di qualcosa che puoi fare con un IntentServicee non puoi farlo con un servicee viceversa.

IntentService non può essere utilizzato per l'ascolto a lungo, come per gli ascoltatori XMPP, è un singolo operatore a tempo, fa il lavoro e saluta.

Inoltre ha un solo threadworker, ma con un trucco puoi usarlo come illimitato.


4

La differenza principale tra a Servicee an IntentServiceè descritta come segue:

Servizio :

1.A Serviceper impostazione predefinita, viene eseguito sul thread principale dell'applicazione (qui non è disponibile alcun thread di lavoro predefinito). Pertanto, l'utente deve creare un thread separato ed eseguire il lavoro richiesto in quel thread.

2. Permette più richieste alla volta. (Multi Threading)

IntentService:

1.Ora, arrivando a IntentService, qui è disponibile un thread di lavoro predefinito per eseguire qualsiasi operazione. Si noti che è necessario implementare il onHandleIntent()metodo, che riceve l'intento per ogni richiesta di avvio, in cui è possibile eseguire il lavoro in background.

2.Ma consente solo una richiesta alla volta.


3

Android IntentService vs Service

1.Service

  • Un servizio viene richiamato utilizzando startService ().
  • Un servizio può essere richiamato da qualsiasi thread.
  • Un servizio esegue le operazioni in background sul thread principale dell'applicazione per impostazione predefinita. Quindi può bloccare l'interfaccia utente dell'applicazione.
  • Un servizio richiamato più volte creerebbe più istanze.
  • Un servizio deve essere arrestato utilizzando stopSelf () o stopService ().
  • Il servizio Android può eseguire operazioni parallele.

2. IntentService

  • Un IntentService viene richiamato utilizzando Intent.
  • Un IntentService può essere richiamato solo dal thread principale.
  • Un IntentService crea un thread di lavoro separato per eseguire operazioni in background.
  • Un IntentService invocato più volte non crea più istanze.
  • Un IntentService si interrompe automaticamente dopo il completamento della coda. Non è necessario attivare stopService () o stopSelf ().
  • In un IntentService, le chiamate con più intenti vengono automaticamente messe in coda e verranno eseguite in sequenza.
  • Un IntentService non può eseguire operazioni parallele come un servizio.

Fare riferimento da qui

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.