Mobile Web Design - programmazione mobile Corso di Laurea in
Transcript
Mobile Web Design - programmazione mobile Corso di Laurea in
ANDROID Mobile Web Design COS’È ANDROID Android non è un linguaggio di programmazione ma un vero e proprio stack di strumenti e librerie per la realizzazione di applicazioni mobili. Esso ha come obiettivo quello di fornire tutto ciò di cui un operatore, un vendor di dispositivi o uno sviluppatore hanno bisogno per raggiungere i propri obiettivi. Google non ha realizzato Android da zero: ha acquisito nel 2005 la Android Inc. con i principali realizzatori che hanno poi fatto parte del team di progettazione della piattaforma in Google. Nel 2007 le principali aziende nel mondo della telefonia hanno dato origine alla Open Handset Alliance (OHA) Oltre a Google, troviamo infatti produttori di dispositivi come Motorola, SprintNextel, Samsung, Sony-Ericsson eToshiba,operatori mobili comeVodafone,TMobile e costruttori di componenti come Intel eTexas Instruments. Nel 2007 esce la prima versione del Software Development Kit (SDK), che ha consentito agli sviluppatori di iniziare a toccare con mano la nuova piattaforma e realizzare le prime applicazioni sperimentali, che dal 2008 hanno anche potuto essere testate sul primo dispositivo reale, ovvero il G1 della T-Mobile. ANDROID E JAVA Android non esegue bytecode Java, quindi non ha bisogno di una JVM. Per ottimizzare al massimo l’utilizzo delle risorse dei dispositivi, è stata adottata una propria VM che prende il nome di Davlik (nome di una località in Islanda) Le librerie standard di Java utilizzate da Android sono quasi la totalità a parte le Abstract Window Toolkit (AWT) e le Swing. La definizione dell’interfaccia grafica è un aspetto fondamentale nell’architettura di Android, la quale utilizza un approccio dichiarativo. ! Java non è l’unico linguaggio a disposizione degli sviluppatori, infatti esiste: • Android Scripting Evironment (ASE): per semplificare lo sviluppo delle applicazioni attraverso un linguaggio di scripting di alto livello • Android Native Development Kit (AND): per sfruttare al massimo le potenzialità hardware del dispositivo nel caso di app che richiedono elevata elaborazione DAVLIK VM Si tratta di una VM ottimizzata per l’esecuzione di applicazioni in dispositivi a risorse limitate, la quale esegue codice contenuto in file di estensione .dex ottenuti a loro volta, in fase di building, a partire da file .class di bytecode java La DVM utilizza un garbage collector La DVM non implementa alcun Just In Time compiler Il meccanismo di generazione del codice nella DVM viene detto register based (orientato all’utilizzo dei registri) a differenza di quello della JVM di tipo stack based (orientato all’utilizzo dell ostack). Grazie a ciò si ottiene una riduzione di circa il 30% delle operazioni (in generale!) ! considerando l’operazione: c = a + b push b; // LS push a: // LS add; // LLS store c; // LS add a,b,c /LLS ARCHITETTURA ARCHITETTURA Activity Manager strumento fondamentale attraverso il quale l’utente interagisce con l’applicazione, ha la responsabilità di organizzare le varie schermate in uno stack a seconda dell’ordine di visualizzazione ! Package Manager si occupa di gestire il ciclo di vita delle applicazioni nei dispositivi ! Window Manager permette di gestire le finestre delle diverse applicazioni, gestite da processi diversi sullo schermo ! Telephony Manager permette interazione con le caratteristiche di un telefono ARCHITETTURA Resource Manager componente per ottimizzazione delle risorse ! View System gestione e renderizzazione dei componenti di view ! Location Manager API per la gestione delle informazioni relative alla localizzazione ! Notification Manager permette ad un’app di inviare notifiche al dispositivo STRUTTURA DEL PROGETTO AndroidManifest.xml file XML che descrive l’applicazione al dispositivo, indica quindi le componenti supportate ! bin/ cartella contenente i file compilati dell’app ! libs/ cartella che contiene i JAR richiesti dall’applicazione ! res/ cartella che contiene tutte le risorse, icone, GUI layouts STRUTTURA DEL PROGETTO src/ cartella che contiene i sorgenti dell’app ! assets/ cartella che contiene file statici che saranno caricati in fase di deploy dell’app ! gen/ cartella che contiene il codice generato in automatico da Android ! build.xml e *.properties file usati per la compilazione in caso di compilazione attraverso riga di comando ! proguard.cfg file utilizzato per l’integrazione con ProGuard per offuscare il coidice Android STRUTTURA DEL PROGETTO res/drowable/ per le immagini (PNG, JPEG, ...) ! res/layout/ contiene i file xml per la definizione dei layout ! res/menu/ contiene file xml per la definizione dei menu ! res/raw/ contiene file generici come ad esempio file CSV, audio clip ! res/values/ per stringhe, dimensioni... STRUTTURA DEL PROGETTO res/xml/ file xml generici ! res/drowable-hdpi/ res/drowable-ldpi/ res/drowable-mdpi/ per la gestione dei file adattati per high, low e medium schermi ANDROIDMANIFEST.XML <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/ apk/res/android" package="it.mwd.helloandroid" android:versionCode="1" android:versionName="1.0"> <application android:label="@string/app_name"> <activity android:name=".HelloAndroid" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> STRING.XML <?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">HelloAndroid</string> </resources> ACTIVITY In qualsiasi programma sviluppato in Android, è sicuramente richiesta un interfaccia grafica che permetta all’utente di orientarsi all’interno della nostra applicazione e interagire con essa secondo i principi previsti dallo sviluppatore. Questa interfaccia viene solitamente gestita tramite le così dette activity. Possiamo immaginare un activity come una schermata, un contenitore di componenti grafici e oggetti messi a disposizione dell’utente. È facile intuire come in un applicazione possano esservi diverse schermate che comunichino, si richiamino e si susseguano, a volte anche ripetutamente. E’ questo il motivo per cui solitamente un programma consta di più activity connesse tra loro, la principale delle quali è solitamente definita main activity. la piattaforma organizza le attività secondo un principio di stack, in base al quale l’activity attualmente in uso è quella in cima. Il richiamo di una specifica activity porterà questa in cima allo stack, ponendo quindi le altre in uno stato di pausa. Ogni applicazione aperta mantiene uno stack delle Activity, questo permette la gestione del tasto back (il cui funzionamento è simile a quello di un browser) che permette quindi di tornare all’activity precedentemente chimata. ACTIVITY Quando si passa da una applicazione all’altra viene mostrata l’ultima activity aperta se l’applicazione è già stata usata dall’untente. In caso contrario viene mostrata quella predefinita. In termini di programmazione, un activity è intesa come un estensione della classe android.app.Activity del framework di Android, si tratta di una struttura di supporto su cui un software può essere organizzato e progettato. RISORSE string string array /res/values /res/values R.string.<chiave> <string /> R.array.<chiave> <string-array /> e <item /> integer array /res/values R.array.<chiave> <string-array /> e <item /> color /res/values R.color.<chiave> <color /> color drawable /res/values o /res/drawable R.drawable.<chiave> <drawable /> e <shape /> Stili e temi /res/values R.style.<chiave> <style /> e <item /> Dimension /res/values R.dimen.<chiave> <dimen /> RISORSE LAYOUT assets assets R.string.<chiave> drawable res/drawable R.drawable.<file name> XML generici res/xml R.xml.<file name> raw res/raw R.raw.<file name> ESEMPIO <?xml version="1.0" encoding="UTF-8"?> <resources> <string name="app_title">Button Counter</string> <string name="button_label">Press</string> <string name="output_label">Numero Click:</string> <string-array name="myArray"> <item>Valore 1</item> <item>Valore 2</item> <item>Valore 3</item> </string-array> <integer-array name="primeArray"> <item>2</item> <item>3</item> <item>5</item> <item>7</item> </integer-array> </resources> ESEMPIO RISORSE COLORE <?xml version="1.0" encoding="utf-8"?> <resources> <color <color <color <color name="red">#FF0000</color> name="green">#00FF00</color> name="blue">#0000FF</color> name="red_transparent">#66DDCCDD</color> </resources> ! Si tratta di risorse molto semplici, che permettono di rappresentare dei colori secondo le seguenti sintassi: #RGB, #ARGB, #RRGGBB e #AARRGGBB, dove con R, G e B indichiamo le tre componenti red, green e blue in cui può essere scomposto un colore mentre con A indichiamo l’eventuale componente alpha di trasparenza DIMENSION <?xml version="1.0" encoding="utf-8"?> <resources> <dimen name="button_width_pix">100px</dimen> <dimen name="button_height_pix">50px</dimen> <dimen name="button_width_dp">100dp</dimen> <dimen name="button_height_dp">50dp</dimen> </resources> px uso dei pixel nel display in le dimensioni sono assolute e misurate in pollici (inch) mm le dimensioni sono assolute e misurate in millimetri pt si utilizzano i punti come 1/72 di un inch dp si tratta di un’unità astratta indipendente dalla densità di pixel sp come la dp, solo che l’adattamento avviene tenendo conto delle preferenze dell’utente relative al font utilizzato MAIN.XML <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:// schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> ! <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:id="@+id/output"/> <Button android:text="@+id/myButton" android:id="@+id/pressButton" android:layout_width="wrap_content" android:layout_height="wrap_content" /> ! </LinearLayout> CLASSE R public static final class id { public static final int output=0x7f050000; public static final int pressButton=0x7f050001; } ! ! un atttributo in un documento XML di configurazione può far riferimento ad altri valori definiti nello stesso o in altri documenti, la sintassi è la seguente: @[package:][+] type/name UTILIZZO DELLE RISORSE public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); Button pressButton = (Button) findViewById(R.id.pressButton); final TextView outputView = (TextView) findViewById(R.id.output); pressButton.setOnClickListener( new OnClickListener() { public void onClick(View v) { outputView.setText("Click # " + counter++); } }); } ESEMPIO USO RISORSE COLORE <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http:// schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="@color/red"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="@color/blue"/> </LinearLayout> INTENT Uno degli argomenti di maggior interesse nell’architettura di Android, è sicuramente costituito dalla possiblità delle activity di richiamarsi tra loro e di riutilizzare activity per eseguire azioni che possono essere comuni a più applicativi. Un intent, come il nome stesso suggerisce è un “intenzione”, una sorta di richiesta da parte di un applicazione di poter accedere ad una risorsa. In sintesi, quando un’applicazione ha la necessità di eseguire una particolare operazione non farà altro che creare un Intent richiedendo l’utilizzo di una qualche risorsa, o componente, in grado di poterlo esaudire. Un qualsiasi intent necessiterà quindi delle informazioni relative all’operazione che si intende eseguire e dovrà essere a conoscenza del tipo di dati su cui essa opera. A volte l’intent sarà esplicito e quindi si conoscerà a priori chi sarà in grado di risolverlo. In questo caso dovremo specificare noi la classe da eseguire. In altri casi invece non sappiamo chi risolverà l’intent, il nostro compito sarà quello di specificare l’azione da eseguire pur non conoscendo il destinatario. INTENT Possiamo quindi capire come si riveli necessario un meccanismo che permetta a un applicazione, e ai suoi componenti di dichiarare quali siano gli intent che è in grado di gestire. Questo viene fatto dagli intent filter. In base a questo criterio, quando viene lanciato un intent verrà cercata un’applicazione in grado di gestirlo e di rispondere quindi all’applicazione che lo ha lanciato. Notiamo che questo venga quindi eseguito a runtime, consentendo perciò una migliore ottimizzazione delle risorse. In altre parola gli intent sono il modo attraverso cui due activity, o anche due applicazioni diverse possono scambiare dati tra loro. Inviare un intent ad una activity in certi casi significa attivarla e chiederle di processare i dati dell'intent In altri casi un'applicazione può prepararsi ad "ascoltare" un'activty (es. ricezione SMS, arrivo di una chiamata, ecc.) in modo da svolgere qualche compito ogni volta che avviene un determinato evento di sistema.