Android avanzato lezione 2

  • 1,194 views
Uploaded on

Android Avanzato - Lezione 2 - Servizi

Android Avanzato - Lezione 2 - Servizi

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
1,194
On Slideshare
0
From Embeds
0
Number of Embeds
11

Actions

Shares
Downloads
0
Comments
0
Likes
4

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. +ServiziProgrammazione in ambiente Android – CorsoAvanzato – Lezione 2Dr. Paolo Casoto - 2012
  • 2. Sommario1. Creare, avviare e terminare un servizio2. Legare mediante binding un servizio ad una attività3. Creare task asincroni4. AllarmiDr. Paolo Casoto - 20122
  • 3. I servizi Android dispone di una specifica componente per lagestione delle attività a lunga durate o cicliche che noncoinvolgono l’interfaccia grafica Classe Service Insieme ad Activity, Content Provider è Brodcast Receiver è unodei 4 componenti strutturali che possono concorrere allacomposizione di una applicazione Android. I servizi in Android hanno una priorità maggiore rispetto alleActivity non attive Vi ricordate il ciclo di vita delle activity in Android ? Tuttavia se necessario può essere terminato dal run-time eriavviato appena disponibili nuove risorse.Dr. Paolo Casoto - 20123
  • 4. Il ciclo di vita delle activity inAndroidDr. Paolo Casoto - 20124Schema tratto da“Professional Android 4 ApplicationDevelopment”, Ed.Wrox
  • 5. I servizi Non è quindi possibile fare affidamento sull’effettivaesecuzione di un servizio in un determinato istante Esso potrebbe, infatti, risultate sospeso. E’ tuttavia possibile elevare la sua priorità a livello di unaactivity visibile, solo nei rari casi in cui l’attività del serviziosia critica per l’usabilità del sistema E.g.: riproduttore audio Ma come posso sviluppare servizi sempre attivi su undispositivo Android, ad esempio per la raccolta di dati da unsensore o dal GPS ? Non consentite agli utenti di installare ed utilizzare altreapplicazioni … barbaro ma efficace.Dr. Paolo Casoto - 20125
  • 6. I servizi I servizi possono quindi essere visti come un modo permantenere attive alcune funzionalità di una applicazione anchequando le sue activity non sono più visibili Ma attenzione: i servizi sono eseguiti all’interno del threadprincipale dell’applicazione, lo stesso dove trovano spaziole activity Ergo può essere necessario spostare la computazione su thread inbackground Altrimenti si rischia di inficiare le performance e la reattività dellaGUI I servizi possono essere avviati, terminati o in generalecontrollati da activity, broadcast receiver o altri servizi dellastessa applicazioneDr. Paolo Casoto - 20126
  • 7. Creare un servizio Estendere la classe Service Gestire la sovrascrittura dei metodi: OnCreate: invocato alla creazione del servizio, è analogo allacontroparte presente all’interno della classe Activity onBind: invocato in fase di collegamento fra l’activity ed il servizio(binding), consente alla prima di ricevere una istanza del secondoalla quale inviare eventuali messaggi. Definire il servizio all’interno del file AndroidManifest.xml Esattamente come avviene per le altre componenti di unaapplicazione.<service android:enabled = “true” android:name=“.MioServizio” />Dr. Paolo Casoto - 20127Vedremo nel corso delle prossimelezioni come gestire i permessi perl’accesso al nostro servizio da partedi applicazioni terze
  • 8. Creare un servizio Sovrascrivere il metodo onStartCommand per gestirel’avvio del servizio Il metodo può essere invocato più volte durante il ciclo di vita delservizio.Tale eventualità deve essere adeguatamente gestita E.g.: riavvio del servizio Poiché il servizio è in esecuzione all’interno del threadprincipale dell’applicazione (lo stesso della GUI) èopportuno all’interno del metodo onStartCommand gestirel’avvio di un nuovo Thread in background Da bloccare alla chiusura del servizio Il metodo onStartCommand si conclude, in questo modo,brevemente, restituendo un valore interoDr. Paolo Casoto - 20128
  • 9. onStartCommand: valori di ritorno START_STICKY: modalità di default per l’avvio di un processo,indica un servizio il coi metodo onStartCommand è invocato incaso di riavvio del servizio Da utilizzare per i processi con avvio e chiusura espliciti Alle successive invocazioni del metodo onStartCommand l’intentoottenuto come parametro di input è nil  il servizio deve essere ingrado di gestire un proprio stato START_NOT_STICKY: modalità utilizzata per i servizi “arichiesta” che eseguono una singola operazione o task Al termine dell’attività il servizio termina autonomamente mediante ilmetodo stopSelf. Non è previsto il riavvio automatico del servizio. Il servizio ripartesolo in presenza di nuove chiamate di avvio. Potrebbe non completare il comando in corso di esecuzione !!!Dr. Paolo Casoto - 20129
  • 10. onStartCommand: valori di ritorno START_REDELIVER_INTENT:modalità utilizzata per iservizi per i quali è possibile effettuare il riavvio su richiesta(come per i not_sticky) ma al tempo stesso è necessaria lagaranzia di completamento dell’operazione in corso almomento della terminazione da parte del run-time In tutti e tre i casi deve essere esplicitata la terminazione delservizio o dall’esterno (caso 1) o dal servizio stesso (casi 2 e3) mediante i metodi: stopService stopSelfDr. Paolo Casoto - 201210In caso di riavvio:START_STICKY: intent vuotoSTART_REDELIVER_INTENT: intentoriginale
  • 11. onStartCommand: flag Il metodo ha, fra i suoi parametri, un parametro intero flagche indica il motivo che ha portato all’avvio del servizio. Può assumere due valori utili alla gestione del ciclo di vita delservizio START_FLAG_REDELIVERY:inviato nel caso in cui, inmodalità START_REDELIVERY_INTENT si sia verificata laterminazione del servizio da parte del run-time primadell’invocazione del metodo stopSelf. START_FLAG_RETRY:inviato in caso di avvio in seguito ad unerrore o malfunzionamento.Dr. Paolo Casoto - 201211
  • 12. Avviare un servizio La classe Activity mette a disposizione il metodo startServiceper consentire l’avvio di un servizio. E’ necessario definire un intent con la classe del servizio daavviare come oggetto. In caso di avvio di servizi gestiti da permessi dei qualil’applicazione è priva, si genera una SecurityException. Mediante l’attributo Extra dell’intent è possibile fornire ulterioriparametri al servizio. Il metodo startService identifica il servizio da attivare e neinvoca i metodi di inizializzazione (onCreate) ed avvio(onStartCommand)Dr. Paolo Casoto - 201212
  • 13. Terminazione di un servizio Due modalità Esplicita dall’esterno del servizio: mediante il metodostopService della classe Activity, con un opportuno intent qualeinput Esplicita dall’interno del servizio stesso: mediante l’invocazionedel metodo stopSelf. Utilizzato nel caso di servizi non ciclici, attivata in risposta aspecifiche richieste E’ possibile invocare la terminazione immediata del servizio oindicare l’insieme delle richieste startService che devonoessere soddisfatte prima della terminazione del servizio. Identificare mediante il parametro startId fornito dal metodoonStartCommandDr. Paolo Casoto - 201213
  • 14. Binding dei servizi E’ possibile collegare mediante un legame (binding) unaactivity ad un servizio L’activity riceve una interfaccia dettagliata che consentel’interazione con il servizio ed il suo ciclo di vita E’ necessario implementare il metodo onBind al fine di restituireuna istanza del servizio, sotto forma di oggetto Binder Classe caratterizzata dal metodo getService, cherestituisce una istanza del servizio stesso.Dr. Paolo Casoto - 201214
  • 15. Binding dei serviziDr. Paolo Casoto - 201215All’interno della classeIlMioServizio utilizzataper implementare ilservizio stessoPerché restituire unoggetto IBinder e nonuna istanza del serviziostesso ???Restituisco un proxy,ricordatevi che siamo inuna ambiente doveciascuna applicazionerisiede nel proprioprocesso.IPC e RPC
  • 16. Binding dei servizi La connessione fra una activity ed un servizio è data dall’utilizzodi una istanza della classe ServiceConnection Classe utilizzata per il monitoraggio dello stato di un servizio,caratterizzata dai seguenti metodi astratti: onServiceConnected: invocato all’avvenuta connessione alservizio, riceve come parametro un oggetto IBinder associato alservizio onServiceDisconnected: invocato alla chiusura della connessionecon un servizio. Per effettuare il binding fra una activity ed il servizio, ènecessario invocare il metodo bindService con argomenti: Intent che identifica il servizio ed eventuali parametri Oggetto ServiceConnection da utilizzare per la gestione dellaconnessione al servizio.Dr. Paolo Casoto - 201216
  • 17. Binding dei servizi E’ possibile definire un ulteriore parametro per il metodobindService che descrive la priorità del servizio avviato BIND_ADJUST_WITH_ACTIVITY:il servizio assume lamedesima priorità dell’activity alla quale è collegato. BIND_ABOVE_CLIENT: il servizio assume una prioritàmaggiore rispetto alla activity alla quale è collegato. Il run-timeterminerà, in questo caso, prima l’activity e solo successivamenteil servizio BIND_NOT_FOREGROUND: il servizio non può mai essere inesecuzione con la stessa priorità dell’activity in foreground BIND_WAIVE_PRIORITY: il servizio non altera in alcun modo lapropria priorità. ed altri ancora…Dr. Paolo Casoto - 201217
  • 18. Servizi che interagiscono conl’utente E’ possibile eseguire i servizi anche in modalità foreground Pur non disponendo di una interfaccia grafica, i servizi possonointeragire con l’utente mediante la barra delle notifiche (lascopriremo nelle prossime lezioni) Attenzione: se un processo è in foreground non può essereterminato dal runtime. Perciò questo status va assegnato solo aiprocessi che sono effettivamente importanti per l’interazionecon l’utente. Utilizziamo, all’interno della classe del servizio, il metodostartForeground Con la controparte stopForeground per la terminazione del processoin foreground, mediante, ad esempio, pulsante all’interno della barradelle notifiche.Dr. Paolo Casoto - 201218
  • 19. Utilizzare thread in background La classe AsyncTask è utilizzata per implementare l’esecuzionedi task all’interno di thread paralleli in background Creazione, gestione e sincronizzazione dei task Utilizzabili per tutte le operazioni time-consuming con brevedurata. L’utilizzo all’interno dei servizi è di immediata comprensione, mentreè necessario fare attenzione nel caso di utilizzo all’interno delleactivity Il task asincroni avviati da activity non hanno persistenza. Al riavviodell’activity sono riavviati E.g.: in caso di rotazione del dispositivo Da evitare per la gestione dei Content Provider, dove abbiamo giàincontrato la classe CursorLoader dedicata al caricamentoasincrono dei dati.Dr. Paolo Casoto - 201219
  • 20. Creare un task asincrono Per creare un nuovo task asincrono è necessario estendere laclasse AsyncTask<Params,Progress, Result> Generico rispetto all’insieme di parametri, al tipo utilizzato per lamisurazione dello stato di avanzamento ed al tipo utilizzato per ilrisultato. Sovrascriviamo i metodi che gestiscono i vari eventi checoinvolgono un task asincrono doInBackground: codice da eseguire in background. Non utilizzare mai il codice all’interno del metodo peraggiornare gli elementi della GUI (che risiedono all’interno delthread principale) Invia le richieste per l’aggiornamento della GUI mediante ilmetodo publishProgress.Dr. Paolo Casoto - 201220
  • 21. Creare un task asincrono onProgressUpdate: invocato per l’aggiornamento degli elementidella GUI nel corso dell’esecuzione del processo, al fine difornire all’utente un feedback sull’aggiornamento del processo. Al di sotto vi è un IPC fra il thread principale ed il threadall’interno del quale è in esecuzione il corpo del metododoInBackground onPostExecute: invocato alla conclusione del corpo del task,restituisce il risultato da esso generato Utilizzato per notificare agli elementi della GUI l’avvenutaconclusione del task Implementa al suo interno i meccanismi di IPC e disincronizzazione.Dr. Paolo Casoto - 201221
  • 22. Eseguire un task asincrono Dopo aver istanziato il tipo prescelto, è necessario invocaresull’istanza il metodo execute, con gli opportuni parametri diinput. Ma esiste una soluzione alternativa quando è necessarioeseguire task asincroni all’interno di servizi in background In particolare per tutti quei servizi che gestiscono richieste time-consuming on demand E.g.: aggiornamento di dati provenienti da un feed RSS Classe IntentService: gestisce l’arrivo di richieste di task, medianteintent, le accoda e le esegue mediante appositi thread paralleli Supporta la sincronizzazione con il thread principale perl’aggiornamento della GUI. Gestore di una coda di taskDr. Paolo Casoto - 201222
  • 23. IntentService Le classi che estendono la classe IntentService devonosovrascrivere un ulteriore metodo, il metodo onHandleIntent Invocato ad ogni richiesta di esecuzione di un task Il corpo del metodo è eseguito mediante un thread inbackground Il servizio è automaticamente terminato quando tutti gli intentricevuti sono stati soddisfatti Può essere utilizzato proficuamente anche nel caso di servizicon richieste cicliche e periodiche. Ma posso utilizzare in Android la gestione classica dei threadJava ? Si, ma ha senso farlo ???Dr. Paolo Casoto - 201223
  • 24. Allarmi Entità in grado di inviare uno specifico intent ad intervalli ditempo prefissati Anche nel caso in cui una applicazione sia chiusa e nessuna dellesue componenti in esecuzione A differenza dei Timer Utilizzati in combinazione con i BroadcastRecevier, gli allarmiconsentono, ad esempio, di attivare servizi ed activity. Non è necessario mantenere, quindi, un servizio dellaapplicazione attivo con un timer, con conseguente riduzionedelle risorse impiegate dall’applicazione Viceversa non utilizzateli per le operazioni periodiche chedevono verificarsi solo se l’applicazione è attiva.Dr. Paolo Casoto - 201224
  • 25. Allarmi Gli allarmi restano attivi fino al riavvio del dispositivo,quando sono cancellati La classe AlarmManager (servizio di sistema) gestisce gliallarmi di un dispositivo Grazie al metodo set è possibile definire un nuovo allarmeindicandone Tipologia Orario di attivazione Intent da inviare In caso di orario impostato al passato rispetto all’ora corrente,l’allarme è avviato immediatamente Grazie al metodo cancel è possibile rimuovere un allarmeesistenteDr. Paolo Casoto - 201225
  • 26. Allarmi Tipologie di allarme: RTC_WAKEUP:risveglia il device all’istante specificato e scatenal’invio dell’intent. RTC: non risveglia il device all’istante specificato ma scatenacomunque l’invio dell’intent. ELAPSED_REALTIME: non risveglia il device ma invia l’intentdopo uno specifico intervallo di tempo dall’avvio del dispositivo. ELAPSED_REALTIME _WAKEUP: risveglia il device ed invial’intent dopo uno specifico intervallo di tempo dall’avvio deldispositivo. Un secondo allarme relativo al medesimo intent invalida ilprecedente, che non è eseguito.Dr. Paolo Casoto - 201226
  • 27. Allarmi ripetuti E’ possibile definire anche allarmi con cadenza periodica,nelle seguenti modalità: Allarmi ad intervalli specifici: mediante il metodosetRepeating è possibile definire un intervallo esatto diesecuzione di due successive attivazione dell’allarme Questa operazione è CPU consuming Allarmi ad intervalli imprecisi: mediante il metodosetInexactRepeating è possibile definire un intervallo “aspanne” entro il quale deve essere attivato l’allarme Ad intervalli regolari il sistema si attiva, verifica tutti gli allarmiscaduti dall’ultima attivazione, e li scatena Risparmio di batteria e riduzione del carico della CPU Ideale per operazioni periodiche ma non eccessivamenteprecise.Dr. Paolo Casoto - 201227
  • 28. +Domande ???Grazie a tutti perl’attenzioneDr. Paolo Casoto, Ph.D - 2012