In background con un Service

android_hello world

Tra le varie features che Android ci offre per le nostre apps, si trovano anche i services. Un Service altro non è che un programma che gira in background, anche ad applicazione “spenta”, molto simile, per chi conosce Linux, ai demoni.

A cosa ci serve? Beh, con un Service possiamo scaricare dati in background senza che l’utente debba tenere aperta l’app, possiamo monitorare qualche tipo di risorsa, possiamo ad esempio tracciare il percorso del cellulare tramite GPS, ecc…

La realizzazione di un Service non è per nulla difficile, oggi vedremo come crearne uno molto, molto, molto semplice, che quando viene avviato o stoppato ci mostra un Toast.

Ecco quindi come sarà la GUI, con tutte le stringhe a posto nel loro file res/values/strings.xml

GUIIl testo dell’ultima textView finisce con uno spazio dopo i due punti, perché dopo aggiungeremo del testo e senza spazio risulterebbe tutto attaccato.

Dichiarazione del Service in AndroidManifest.xml

Ora dobbiamo dichiarare che nella nostra app useremo un Service. Come? Rechiamoci nell’AndroidManifest.xml presente nella root del progetto, e sotto il tag <application>, mettiamo:

Dichiarazione del Service
Dichiarazione del Service

Ovviamente name, icon e label si capiscono, non li spiego, notare solo come, per scegliere l’icona, usiamo il riferimento alle resources, usando @drawable, directories in cui saranno presenti i file “disegnabili”, e riferendoci all’icona dell’app, ic_launcher.

Ora non ci resta che, ormai lo sapete, …

…Programmare!

E già, avremo un po’ di cose a cui badare nella programmazione. Innanzitutto creiamo la classe per il servizio,  che chiameremo “MyService”, ed estenderà Service. Dovremo implementare tre metodi principalmente, onBind che non ci servirà per questo tutorial ma sarà comunque obbligatorio, onCreate chiamato alla creazione del Service, che sarà il corpo di questo, al cui interno scriveremo cosa fare, e onDestroy che verrà chiamato alla distruzione/stop del servizio. Ecco come le ho implementate, mostrando dei Toast.

Classe My Service
Classe MyService

Ed ora passiamo all’implementazione, vedendo qualcosa di nuovo, un modo di eseguire un metodo al click di un button senza aggiungere il button al file java.

Beh prima di tutto vediamo l’onCreate dell’Activity, non sto a spiegare le prime linee, le findByView ecc, perché già viste negli articoli precedenti.

Metodo onCreate dell'Activity
Metodo onCreate dell’Activity

Le cose da notare qui sono due, ossia il corpo dei due metodi onClick. Nel primo creiamo un “Intent”, che sarà il nostro servizio, passando come argomento il contesto e la classe che estende il Service, e poi lo startiamo grazie ad un metodo fornito dal context. Check() è un metodo definito da me che vediamo più tardi. Per stoppare il processo, usiamo stopService dando come argomento un nuovo intent ma con la stessa classe.

Ed ora vediamo questo misterioso check(), che altro non fa che scrivere quando è stata l’ultima verifica che il service era/non era attivo.

Metodo check()
Metodo check()

isMyServiceRunning chiede tutti i servizi attualmente attivi e li sfoglia ad uno ad uno per verificare che abbiamo lo stesso nome della nostra classe. Se così accade ritorna true. Check quindi usa questo metodo, e se viene ritornato true, lo scrive nella prima textView e aggiorna anche la seconda textView scrivendo la data attuale.

Cosa c’è di strano? La prima cosa è il modo con cui prendiamo la risorsa R.strin.lastCheck : infatti, dovendo concatenare due stringhe, ossia “Last Check: ” e la data, dobbiamo recuperare la risorsa in questo modo. La seconda cosa è che check ha un parametro View che non ci interessa mai, e la terza è che non abbiamo visto nessun listener per il Button Check. Perchè? Andiamo a vedere nell’XML dell’Activity.

XML del Button Check
XML del Button Check

Nella definizione del Button abbiamo aggiunto una proprietà, “android:onClick”, che eseguirà il metodo passato, a patto che questo sia un public void metodo(View v); Ed ecco “spiegate” le ultime due stranezze. Quest’ultimo modo di eseguire un’azione è identico al listener, senonché il metodo qui deve risiedere per forza nell’Activity. Diventa utile quando abbiamo, per altre cose, già scritto un metodo che, proprio a fagiolo, deve essere richiamato da un pulsante, come in questo caso.

Ora possiamo far partire l’app!

Come al solito lascio in download la cartella di Eclipse zippata con i sorgenti, e l’apk scaricabile da Aptoide.

[banner size=”468X60″]
Seguiteci anche su Facebook, Google Plus e Twitter, per restare sempre in contatto con noi e con le nostre guide.