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.