IMPORTANT: Per accedir als fitxer de subversion: http://acacha.org/svn (sense password). Poc a poc s'aniran migrant els enllaços. Encara però funciona el subversion de la farga però no se sap fins quan... (usuari: prova i la paraula de pas 123456)

Un resum ràpid seria:

  • Es pot executar en segon terme per tal de realitzar accions mentrestant l'usuari està treballant amb altres aplicacions.
  • Un servei pot permetre als altres components Android lligar-se (bind) per tal de poder realitzar interprocess communication.
  • Un servei s'executa per defecte en el main thread de l'aplicació que el conté.
  • És un dels components Android principals.

Introducció

Un servei és un component d'una aplicació que realitza tasques de "llarga durada" en segon terme i que no disposa d'interfície d'usuari.

Per exemple, una aplicació pot executar un servei i aquest servei continuar executant-se encara que l'aplicació que ha executat el servei finalitzi.

Com es comuniquem amb els serveis si no tenen interfície gràfica? Es possible fer una operació bind que permeti realitzar operacions interprocess communication (IPC) amb els serveis.

Exemples de tasques que pot realitzar un servei.

  • Gestionar transaccions de xarxa (actualitzacions, descarregues, etc.)
  • Executar música.
  • Realitzar operacions I/O amb fitxers.
  • Interaccions amb un content provider
  • ...

Els serveis poden tenir dos formes:

  • Started: Un servei està iniciat quan un altre components android com una activitat executa startService(). Un cop iniciat, un servei pot romandre en execució de forma indefinida inclús si el components que l'ha executat finalitzi (això sempre que s'executin en threads independents). Típicament els serveis d'aquest tipus realitzen una tasca (per exemple descarregar un fitxer) i un cop l'operació s'acaba finalitzen.
  • Bound: un servei està "bound" quan un altre component executa bindService(). Un servei bound ofereix una interfície client servidor que permet comunicar-se entre els clients (component que crida el servei) i el servei. El client pot fer peticions (requests) al servei i obtenir resultats d'aquestes peticions, implementant un sistema interprocess communication (IPC). Un servei bounded només dura el que el component lligat al servei. Múltiples components es poden lligar a un sol servei, però un cop tots han fet un unbound aleshores el servei es destrueix.

És possible que un servei sigui dels dos tipus al mateix temps, implementant els següents mètodes:

onStartCommand() per controlar com s'inicia el servei

i

onBind() per controlar el binding.


Els components poden utilitzar el servei de la mateixa forma que les activitats poden cridar altres activitats: utilitzant Intents.

IMPORTANT: Caution: A service runs in the main thread of its hosting process—the service does not create its own thread and does not run in a separate process (unless you specify otherwise). This means that, if your service is going to do any CPU intensive work or blocking operations (such as MP3 playback or networking), you should create a new thread within the service to do that work. By using a separate thread, you will reduce the risk of Application Not Responding (ANR) errors and the application's main thread can remain dedicated to user interaction with your activities.

Quan utilitzar un servei o un thread ?

Un servei és simplement un component que s'executa en segon terme quan l'usuari està treballant amb altres aplicacions. Per exemple, si només ens interessa realitzar tasques llargues fora del UI thread però aquestes tasques només es realitzen mentrestant l'usuari està interactuant amb la nostra aplicació, aleshores no utilitzeu un servei.

Un exemple es executar música en segon terme quan esteu utilitzant una aplicació. Un exemple seria un joc amb música. En canvi si esteu fent una aplicació que reprodueixi música i els vostres usuaris volen escoltar aquesta música mentrestant treballen amb altres aplicacions, aleshores cal fer un servei.

IMPORTANT: Cal tenir en compte que els serveis també s'executen al fil d'execució principal si no dieu el contrari. Per tant, també sol ser necessari executar els serveis en fils d'execució independents o worker threads