Sistemi Mobili e Wireless Android - Servizi Stefano Burigat Dipartimento di Matematica e Informatica Università di Udine www.dimi.uniud.it/burigat stefano.burigat@uniud.it
Servizi Un servizio è un componente di un'applicazione Android che permette di svolgere operazioni in background, senza interazione con l'utente (non è dotato di interfaccia) Esistono due tipi principali di servizi: un servizio started svolge qualche operazione (ad es., download di un file), gira indipendentemente dal componente che l'ha chiamato, e solitamente non ritorna alcun risultato un servizio bound permette la comunicazione e lo scambio di dati con il client che l'ha chiamato 2
Servizi I servizi girano nel thread principale del processo che li ospita se il servizio fa operazioni costose o bloccanti, è meglio creare thread secondari per svolgerle Ogni servizio deve avere una dichiarazione <service> all'interno del file manifest dell'applicazione 3
Servizi Indipendentemente dal tipo, per creare un servizio si estende la classe Service (o una sua sottoclasse) e si fa l'override di alcuni suoi metodi Per creare un servizio started è necessario fare l'override di onstartcommand() e far partire il servizio tramite il metodo startservice() Per creare un servizio bound è necessario fare l'override di onbind() e associarsi al servizio tramite il metodo bindservice() E' anche possibile creare un servizio che può funzionare sia come servizio started che come servizio bound, semplicemente implementando entrambi i metodi 4
Servizi started Questo codice viene eseguito se si attiva il servizio tramite bindservice() Questo codice viene eseguito prima di onbind() o onstartcommand() (una sola volta anche se startservice o bindservice vengono chiamati più volte) Questo codice viene eseguito se si attiva il servizio tramite startservice() ricarica il servizio in caso di sua uccisione improvvisa (ad esempio, a causa di un crash) 5
Servizi started Un servizio viene chiamato tramite Intent (per ragioni di sicurezza va sempre usato un Intent esplicito) Se si attiva un servizio tramite startservice(), bisogna fermarlo tramite stopservice() (o il servizio stesso può chiamare stopself()) 6
Servizi started main.xml manifest.xml Dichiarazione del servizio 7
Servizi started 8
IntentService Se non è necessario che un servizio gestisca richieste multiple contemporaneamente, è possibile crearlo utilizzando la classe IntentService al posto della classe Service Un IntentService è una sottoclasse di Service che crea automaticamente un thread per gestire in modo sequenziale le richieste che arrivano Per creare un IntentService è necessario implementare il metodo onhandleintent(), al quale verrà passato l'intent utilizzato per far partire il servizio 9
IntentService Un IntentService svolge le seguenti operazioni: Crea un thread separato dal main thread per l'esecuzione del codice Crea una coda di lavoro che passa un Intent alla volta al metodo onhandleintent() Ferma il servizio una volta che tutte le richieste sono state gestite (non serve chiamare stopself()) Fornisce un'implementazione di default di onbind() che ritorna null Fornisce un'implementazione di default di onstartcommand() che invia l'intent alla coda di lavoro e quindi al metodo onhandleintent() 10
IntentService Implementazione di un servizio tramite IntentService 11
IntentService Se è necessario fare l'override di altri metodi come oncreate(), onstartcommand() o ondestroy(), è necessario chiamare l'implementazione della classe base L'unico metodo, oltre a onhandleintent(), per il quale non è necessario chiamare la classe base è onbind() 12
Servizi bound Se si vuole interagire con un servizio, inviando richieste ed ottenendo risultati (anche tra processi diversi), è necessario creare un servizio bound più componenti possono fare il binding allo stesso servizio un servizio bound viene distrutto quando non rimangono componenti ad esso legati (si usa unbindservice() per slegarsi) è anche possibile fare il binding ad un servizio che è stato attivato tramite startservice() L'implementazione di onbind() deve tornare un oggetto di tipo IBinder tipicamente, si estende la classe Binder e al suo interno si specificano i metodi che verranno poi utilizzati dal componente che ha fatto il binding al servizio per poter comunicare con il servizio stesso 13
Servizi bound Lo scenario più comune di utilizzo di un servizio bound è quello in cui il servizio e il client che lo utilizza fanno entrambi parte della stessa applicazione e dello stesso processo In tal caso, si procede nel modo seguente: All'interno del service, creare un'istanza di Binder che contiene metodi pubblici che il client può chiamare, oppure ritorna l'istanza corrente del service, contenente metodi pubblici che il client può chiamare, oppure ritorna un'istanza di un'altra classe interna al service che contiene metodi pubblici chiamabili dal client Ritornare l'istanza del Binder all'interno di onbind() Nel client, chiamare i metodi pubblici attraverso l'istanza del Binder ricevuta all'interno del metodo onserviceconnected() 14
Servizi bound definizione della sottoclasse di Binder definizione del servizio che verrà attivato tramite binding (viene implementato solo onbind che ritorna un riferimento ad un oggetto di tipo Binder) 15
Servizi bound oggetto di tipo ServiceConnection (si veda prossima slide) che serve a gestire la connessione con il service 16
Servizi bound esempio di chiamata di un metodo del service chiamato da Android quando il binding del service è avvenuto 17