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:
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 ?