giovedì 17 febbraio 2011

Android, introduzione alle applicazioni

Le applicazioni per Android sono scritte in Java. Tuttavia, il bytecode generato dalla compilazione viene ottimizzato dal tool di sviluppo e l'applicazione viene eseguita sul dispositivo all'interno di una Dalvik Virtual Machine (DVM), una macchina virtuale molto più leggera della classica Java Virtual Machine (JVM). La DVM è infatti ottimizzata per l'esecuzione su dispositivi mobili, richiede poca memoria e permette pertanto l'istanza di più DVM sullo stesso dispositivo!
La distribuzione delle applicazioni avviene attraverso file apk (Android package), una variante del file JAR (gli archivi Java). All'interno di un file apk (che possiamo aprire con un gestore di archivi compressi, vi invito a farlo) troviamo le directory e i file destinati alle risorse (cartella res/ e file resources.arsc) e quella per le informazioni (cartella META-INF/), oltre ai file che descrivono al sistema operativo l'applicazione (AndroidManifest.xml, il manifesto dell'applicazione) e l'applicazione stessa (impacchettata in unico file, classes.dex).
Non va mai dimenticata una cosa: il kernel Linux è alla base di Android! Ogni applicazione viene eseguita all'interno di un processo Linux che dispone della propria virtual machine sicché il codice in esecuzione risulta isolato dal codice delle altre applicazioni. Questo conferisce al sistema operativo e alle applicazione un certo grado di stabilità. Esistono, ovviamente, delle tecniche per la comunicazione fra processi.
Le prestazioni delle applicazioni all'interno del sistema operativo derivano da un'attenta scomposizione dei componenti e delle risorse che la descrivono. La loro esecuzione può inoltre avvenire da più punti di accesso al codice del programma, questo permette al sistema operativo di eseguire all'occorrenza un preciso pezzo di codice piuttosto che l'intera applicazione! Tale necessità è ad esempio utile ad un'applicazione per invocare le funzionalità già sviluppate in un'altra applicazione. Per comprendere la suddetta modularità e per sfruttarla all'interno delle proprie applicazioni è necessario studiare e programmare pochi componenti (non necessariamente tutti, dipende dalla complessità dell'applicazione). Segue una loro breve descrizione:
  • Attività (Activity): rappresenta la schermata che consente all'utente l'interazione con l'applicazione, raccogliendo gli elementi che compongono l'interfaccia grafica e disponendoli secondo un opportuno layout. Ogni attività, implementata come sotto classe della classe Activity (del package android.app.Activity), è indipendente da un'altra. Solitamente un'attività svolge una precisa azione per l'applicazione, essa può essere orientata all'input dei dati, alla presentazione dell'output oppure a entrambe. Tutto dipende da come viene progettata dal programmatore. Nonostante l'indipendenza detta prima, le attività possono in ogni caso cooperare fra di loro per l'implementazione di una delle due fasi dette prima. In tal caso ci sarà un'attività principale che, dopo l'input o l'elaborazione dei dati, chiederà al sistema operativo il passaggio a una seconda attività, passando a quest'ultima le opportune informazioni. Il contenuto visivo dei componenti viene offerto da oggetti della classe View (del package android.view.View). Un'attività, quindi, contiene oggetti della classe View (bottoni, aree di testo, etichette, etc...);
  • Servizi (Services): lo svolgimento in background di una determinata funzione viene garantito da un preciso servizio, anche quando l'utente sta eseguendo altre operazioni sul dispositivo. Poiché un servizio non dispone di un'interfaccia grafica, l'unico modo per avviarne uno o fermarlo consiste nell'interazione con un'attività dell'applicazione (ad esempio con un bottone). La riproduzione di un flusso audio è un esempio di servizio. L'ascolto di un brano, avviato interagendo con i bottoni di un lettore audio, verrà garantito da un servizio anche quando l'utente avvia sul dispositivo una nuova applicazione! La comunicazione con un servizio può avvenire attraverso l'interfaccia che esso fornisce ai programmi;
  • Ricevitori (Broadcast receiver): questo componente notifica gli eventi alle applicazioni, come ad esempio lo stato della batteria, la disponibilità di una risorsa etc... Ogni applicazione, in base alle proprie necessità, può allora servirsi di un preciso numero di ricevitori. Anche questo componente non dispone di un'interfaccia grafica. Va comunque detto che al verificarsi di un evento questo componente può avviare un'attività per la notifica all'utente (mediante la classe NotificationManager). Le notifiche possono anche aggiungere icone nella barra di stato di Android;
  • Fornitori (Content provider): questo componente offre a un'applicazione la possibilità di gestire e condividere dati (ad esempio in un database). Tale possibilità avviene estendendo la classe base ContentProvider (del package android.content) e implementando i metodi per l'inserimento e il recupero dei dati. Le applicazioni non possono tuttavia invocare direttamente i suddetti metodi ma possono accedere ai dati solo attraverso gli oggetti della classe ContentResolver.

Nessun commento:

Posta un commento