Understanding Android: Service al boot

Diego Stamigni
Diego Stamigni
Understanding Android: Service al boot

Nella programmazione Android a volte è necessario sviluppare servizi, demoni, di cui è necessario l'onStart() all'avvio del dispositivo.

Ma come è possibile sviluppare una cosa del genere ?

Tutto viene gestito da un BroadcastReceiver che non appena riceve l'avvenuto completamento del boot del devices, esegue quello per cui è stato programmato; vediamo come si gestisce:

Assumiamo di avere scritto una semplice applicazione (HelloWorldReceiver) che stampa un Hello World e volessimo che questa stringa venga stampata in una notifica Toast a ogni Riavvio.

Vediamo il codice di un semplice progetto auto creato da Eclipse:

Layout XML:

Molto semplice, una TextView ci mostra il testo contenuto in strings.xml, che è, appunto, Hello World, Main!

Main.java:

Fin qui niente di nuovo, la nostra Activity apre semplicemente il layout e ce lo mostra a schermo,

Manifest:

Niente di nuovo nemmeno nel Manifest, tutto auto creato/impostato dal nostro amico Eclipse.

Vediamo dunque di creare un Receiver che capisca che il nostro cell è stato appena acceso/riavviato; prepariamo il necessario: dobbiamo creare un nuovo file java nel quale implementare il metodo onReceive(), nella classe BroadcastReceiver:

BootReceiver.java:

Bene, abbiamo esteso la classe BroadcastReceiver, implementato il metodo onReceive() nel quale abbiamo creato un nuovo Intent per richiamare una particolare Activity: la classe Receiver (che andremo a creare). Sucessivamente, l'Intent sarà avviato come servizio.

Receiver.java:

Come si può notare, anche in modo molto intuitivo i diversi metodi andranno a gestire i diversi eventi: i metodi onCreate() e onDestroy() gestiscono rispettivamente alla creazione e distruzione del servizio. Il nostro onStart() segue in termini di avviamento il metodo onCreate(): come si può notare onStart() avvia a tutti gli effetti un nuovo Intent (una nuova azione) con un proprio id processo. Il contenuto che abbiamo scritto in questo metodo è per l'appunto la stampa, sempre attraverso una nuova notifica Toast, il contenuto della stringa hello (Hello World, Main!).

Una volta fatto tutto questo dobbiamo aggiungere e impostare il nostro servizio, il suo intent, allocargli qualche permesso, attraverso l'AndroidManifest; ecco come si mostra:

AndroidManifest.xml:

Il nuovo codice va dalla riga 17 alla 28, vediamolo meglio:

Dichiariamo il receiver (BootReceiver, è la nostra classe!!) nel quale gestiamo un intent BOOT_COMPLETED, utilizzato nella classe BootReceiver per far ritornare l'avvenuto completamento della procedura di Boot del cellulare. La sua categoria è la Home, cioè non verrà avviato nient'altro che il nostro servizio, nella Home del cellulare.

La seconda parte di codice gestisce la classe Receiver:

Impostiamo il servizio (che è la nostra classe Receiver) con la relativa azione Receiver (ancora la nostra classe). Indica che il servizio dovrà avviare un'azione, quella/e descritta/e nella classe menzionata.

Bene, proviamo a compilare e ad avviare l'applicazione, e riavviamo il cellulare.. cosa succede ? :)

Boom! Prossimamente vedremo come analizzare quello che avviene nello stack, per vedere dove si posizionano i processi e come Android gestisce la memoria in questo senso.

Che ne pensate ?