Android è la piattaforma aperta di mobile computing sviluppata dalla Open Handset Alliance e sostenuta da Google. Basata su Linux e dotato di un ambiente Java ottimizzato e una ricca libreria di classi, Android si candida per essere l'ambiente applicativo ideale per la telefonia cellulare. Dopo aver illustrato l'architettura del framework e l'IDE di sviluppo, vedremo la realizzazione di una applicazione Java, sfruttando le librerie di Android e testandola sull'emulatore e su un terminale HTC G1. Si vedra' come realizzare una user interface, conoscere e utilizzare le semplici ma potenti funzionalità disponibili. In chiusura si fara' un confronto critico tra Android, iPhone e Java ME.
1. Lo sbarco di Google nel pianeta Mobile Internet:
primo impatto ed esempi pratici.
Riccardo Solimena
(Java Italian Portal)
Stefano Sanna
(JUG Sardegna Onlus)
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
2. Outline
Who we are
●
Android: brevissima introduzione
●
Code, please!
●
DEMO!
Architecture, library, tools
●
Android vs Java ME vs iPhone
●
Conclusioni
●
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
3. Riccardo Solimena
Java Experienced Consultant @ Capgemini
●
Past: Java Tech Lead @ Links M&T
–
Technical Writer @
●
Java Italian Portal
–
Java Journal, Keep in tech, Programmazione.it
–
http://www.google-phone-android.com
–
Musician @
●
http://www.youtube.com/riccardosolimena
–
http://www.sevenotes.com
–
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
4. Stefano Sanna
Java ME Tech Lead @ beeweeb technologies
●
Professional developer @ JME, iPhone, Android
●
Technical writer @
●
Book “Java Micro Edition” (Hoepli, 2007)
–
DEV, Java Journal, Computer Programming
–
Blogger @ http://www.gerdavax.it
●
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
5. Android
Android è una piattaforma open source per la
●
telefonia mobile basata su Linux e Java
Dal blog ufficiale:
●
“Android is the first truly open and
comprehensive platform for mobile devices. It
includes an operating system, user-interface and
applications -- all of the software to run a mobile
phone, but without the proprietary obstacles that
have hindered mobile innovation”
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
6. Non solo Google...
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
7. Caratteristiche principali
Android è una piattaforma ricca e moderna:
●
Componenti di sistema riusabili e sostituibili
–
Dalvik virtual machine
–
Browser integrato (basato sul motore WebKit)
–
Grafica avanzata 2D e 3D (OpenGL ES 1.0)
–
Database SQLite
–
Ricco supporto ai formati multimediali: MPEG4,
–
H.264, MP3, AAC, AMR, JPG, PNG, GIF
GSM, EDGE, 3G; Bluetooth e WiFi
–
Fotocamera, GPS, bussola e accelerometro
–
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
8. Principali caratteristiche
Linguaggio: Java
●
Libreria: Java SE (Apache Harmony, esclusa la
●
parte visual) + Apache Http + Android libraries
Dalvik Virtual Machine: ottimizzata per device
●
mobili; totalmente indipendente dalla JVM Sun (e
non compatibile con il bytecode standard di Java)
Kernel Linux: sistema operativo robusto,
●
efficiente, portabile
OPEN SOURCE!
●
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
9. HTC G1: il primo!
528Mhz Qualcomm 7201 processor
●
64MB RAM, 128MB ROM, 1GB MicroSD card
●
3.1MP camera (no flash) 2048 x 1536
●
Quad Band, UMTS, HSDPA
●
Bluetooth, 802.11b/g
●
Display 3.17quot;
●
HVGA (480 x 320)
GPS + compass
●
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
10. HTC G1: per gli utenti
WebKit browser
●
Supporto SMS e MMS
●
Audio: MP3, AAC, AAC+, WMA
●
MPEG4, WAV, MIDI, REAL AUDIO, OGG
Video: H.264, streaming, 3GPP, MPEG4, 3GP
●
Email: POP, IMAP, SMTP, AOL e GMail
●
IM: AIM, MSN, Yahoo!, GTalk
●
Android Market + OTA application delivery
●
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
11. Cominciamo dai link!
SDK e documentazione:
●
http://code.google.com/android
–
Sorgente della piattaforma:
●
http://source.android.com/
–
Open Handset Alliance:
●
http://www.openhandsetalliance.com
–
Android Market:
●
http://www.android.com/market/
–
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
12. Code, please!
Anziché partire dalla teoria, dall'architettura, dalla
●
documentazione, dalle classi...
PARTIAMO DAL CODICE
Vogliamo realizzare una applicazione di supporto
●
al Java Day, con la lista dei talk, i dettagli di
ciascun intervento e la mappa di Roma centrata
sulla sede dell'evento
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
13. DEMO
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
14. Struttura dell'applicazione
SQLiteDatabase
ListaTalk JavaDayMap
(Activity) (Activity)
Geocoder
ListView
MapView
ItemAdapter
MapController
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
15. Progetto Android
Delizioso sorgente Java!
File di supporto
Immagini
XML di layout della UI
Stringhe, vettori...
Descrittore dell'applicazione
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
16. Modelliamo il talk
public class Talk {
// getter e setter omessi per brevità...
private int keyId;
private String talkName;
private int numRoom;
private String abstractTalk;
private String speech;
private String time;
public Talk(int keyId, String talkName, int numRoom, String
abstractTalk, String speech, String time) {
super();
this.keyId = keyId;
this.talkName = talkName;
this.numRoom = numRoom;
this.abstractTalk = abstractTalk;
this.speech = speech;
this.time = time;
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
17. Tutto inizia con un'Activity...
public class ListaTalk extends Activity {
private ArrayList<Talk> talkItems;
private ListView talkList; private TalkItemAdapter adapter;
private TalkDAO talkDAO; private Cursor talkCursor;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
talkList = (ListView)findViewById(R.id.talkList);
talkItems = new ArrayList<Talk>();
int resID = R.layout.talk_item;
adapter = new TalkItemAdapter(this, resID, talkItems);
talkList.setAdapter(adapter);
// inizializzazione popup (next slide)
talkDAO = new TalkDAO(this);
talkDAO.open();
populateTodoList();
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
18. Creiamo la popup
final Builder builder = new AlertDialog.Builder(this);
talkList.setOnItemClickListener(new OnItemClickListener() {
//@Override
public void onItemClick(AdapterView<?> a, View v, int pos,
long arg3) {
Talk talkSelected = (Talk)talkList.getItemAtPosition(pos);
builder.setTitle( ... );
builder.setMessage( ... );
builder..setPositiveButton(quot;Chiudiquot;, new
android.content.DialogInterface.OnClickListener() {
public void onClick(final DialogInterface dialog, final
int arg1) { }
}).show();
}
});
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
19. Riempire l'elemento della lista
public class TalkItemAdapter extends ArrayAdapter<Talk> {
int layoutID;
public TalkItemAdapter(Context _context, int _resource,
List<Talk> _talkItems) {
super(_context, _resource, _talkItems);
layoutID = _resource;
}
@Override
public View getView(int position, View convertView, ViewGroup
parent) {
LinearLayout todoView;
Talk item = getItem(position);
String talkName = item.getTalkName();
String time = item.getTime();
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
20. Riempire l'elemento della lista
if (convertView == null) {
todoView = new LinearLayout(getContext());
String inflater = Context.LAYOUT_INFLATER_SERVICE;
LayoutInflater vi = (LayoutInflater)
getContext().getSystemService(inflater);
vi.inflate(layoutID, todoView, true);
} else {
todoView = (LinearLayout) convertView;
}
TextView talkNameView = (TextView)
todoView.findViewById(R.id.row);
TextView talkTimeView = (TextView)
todoView.findViewById(R.id.rowTime);
talkNameView.setText(talkName);
talkTimeView.setText(time);
return todoView;
}
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
21. Dov'è l'interfaccia grafica?
Android consente di definire i componenti grafici
●
e il loro layout sulla UI attraverso file XML
Ad ogni componente è associato un riferimento
●
univoco attraverso la classe R (resources)
Nel codice è possibile:
●
caricare layout e componenti XML e assegnarli
–
alla vista corrente
modificarne i parametri
–
create nuove viste programmaticamente
–
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
23. TalkItem
<?xml version=quot;1.0quot; encoding=quot;utf-8quot;?>
<LinearLayout
xmlns:android=quot;http://schemas.android.com/apk/res/androidquot;
android:layout_width=quot;fill_parentquot;
android:layout_height=quot;fill_parentquot;
android:background=quot;@color/notepad_paperquot;>
<TextView
android:id=quot;@+id/rowTimequot; android:layout_width=quot;wrap_contentquot;
android:layout_height=quot;fill_parentquot; android:padding=quot;10dpquot;
android:scrollbars=quot;verticalquot; android:fadingEdge=quot;verticalquot;
android:textColor=quot;@color/notepad_textquot;
android:layout_alignParentRight=quot;truequot;
/>
<TextView
android:id=quot;@+id/rowquot; android:layout_width=quot;fill_parentquot;
android:layout_height=quot;fill_parentquot; android:padding=quot;10dpquot;
android:scrollbars=quot;verticalquot; android:fadingEdge=quot;verticalquot;
android:textColor=quot;@color/notepad_textquot;
android:layout_alignParentLeft=quot;@+id/rowTimequot;
/>
</LinearLayout>
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
24. Piccola rivoluzione
Una applicazione può:
●
estendere Activity di libreria (ad esempio, la
–
MapActivity)
invocare Activity di sistema (ad esempio, per
–
avviare il browser o effettuare una chiamata)
esportare le proprie activity rendendole
–
disponibili ad altre applicazioni (ad esempio, per
l'accesso ad un servizio o una procedura
proprietaria)
Le Activity e i messaggi (Intent) per attivarle sono
●
definite nel Manifest dell'applicazione
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
25. Manifest
<?xml version=quot;1.0quot; encoding=quot;utf-8quot;?>
<manifest xmlns:android=quot;http://schemas.android.com/apk/res/androidquot;
package=quot;it.javaday.android.roma2009quot;
android:versionCode=quot;1quot; android:versionName=quot;1.0.0quot;>
<application android:icon=quot;@drawable/iconquot; android:label=quot;@string/
app_namequot;>
<activity android:name=quot;.ListaTalkquot;
android:label=quot;@string/app_namequot;>
<intent-filter>
<action android:name=quot;android.intent.action.MAINquot; />
<category
android:name=quot;android.intent.category.LAUNCHERquot; />
</intent-filter>
</activity>
....
</manifest>
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
26. Richiamare le mappe
@Override
public boolean onCreateOptionsMenu(Menu menu) {
menu.add(quot;Mapquot;);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
startActivity(new Intent(quot;it.javaday.android.roma2009.MAPquot;));
return super.onOptionsItemSelected(item);
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
27. Location-based Service
Android è equipaggiato con una ricca libreria per
●
la realizzazione di applicazioni georeferenziate
integrate con i servizi di Google:
LocationManager: per determinare la posizione
–
corrente con GPS o sistemi alternativi
Geocoder: per la trasformazione di indirizzi in
–
coordinate geografiche e viceversa
MapView: per la visualizzazione di mappe,
–
complete di controlli di zoom, scrolling e
sovrapposizione di layer personalizzati e
interattivi
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
28. Visualizzare una mappa
Per visualizzare una mappa (centrata su un
●
indirizzo noto) all'interno di una applicazione
occorre:
includere la libreria com.google.android.maps e
–
richiedere la user-permission INTERNET
scrivere una nuova Activity che estenda MapView
–
ottenere le Android Maps API Key associate ai
–
propri certificati di sviluppo e di pubblicazione
(maggiori dettagli sul sito
http://code.google.com/android)
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
29. Mappe nell'applicazione
Nel Manifest occorre specificare l'uso della
●
libreria e ottenere i permessi per la localizzazione
(se si usa il GPS) e la connettività:
<application ...>
<uses-library android:name=quot;com.google.android.mapsquot; />
<activity android:name=quot;.JavaDayMapquot;
android:label=quot;@string/app_namequot;>
<intent-filter>
<action android:name=quot;it.javaday.android.roma2009.MAPquot; />
<category
android:name=quot;android.intent.category.DEFAULTquot; />
</intent-filter>
</activity>
</application>
<uses-permission android:name=quot;android.permission.INTERNETquot;/>
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
30. Estendiamo MapActivity
public class JavaDayMap extends MapActivity {
private MapView mapView;
private MapController mapController;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Slide successive
// map code here!!!!!!
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
31. Usiamo il Geocoder
Il Geocoder trasforma l'indirizzo testuale in latitudine/longitudine
try {
Geocoder coder = new Geocoder(getApplicationContext());
List<Address> result = coder.getFromLocationName(quot;Roma,
Via Vasca Navalequot;, 1);
Double lat = result.get(0).getLatitude() * 1E6;
Double lon = result.get(0).getLongitude() * 1E6;
GeoPoint geopoint = new GeoPoint(lat.intValue(),
lon.intValue());
}
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
32. Mostriamo la mappa
mapView = (MapView) findViewById(R.id.mapview);
MapView.LayoutParams lp = new
MapView.LayoutParams(MapView.LayoutParams.WRAP_CONTENT,
MapView.LayoutParams.WRAP_CONTENT, 160, 430,
MapView.LayoutParams.BOTTOM_CENTER);
View zoomControls = mapView.getZoomControls();
mapView.addView(zoomControls, lp);
mapView.displayZoomControls(true);
mapController = mapView.getController();
mapController.setCenter(geopoint);
mapController.setZoom(17);
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
33. Architettura di Android
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
34. Quattro entità fondamentali
Activity: moduli applicativi visuali e componibili
●
con cui interagisce l'utente (una mappa, una lista
di messaggi...)
Service: logiche applicative prive di UI, invocabili
●
da Activity ed eseguibili in background
Broadcast Intent Receiver: consente
●
l'interazione dell'applicazione con gli eventi del
telefono, ricevendo e inviando notifiche
Content Provider: consentono salvataggio,
●
ricerca e condivisione dati tra applicazioni
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
35. View e widget
Android dispone di una ricca libreria di viste e
●
widget, altamente configurabili e personalizzabili
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
36. Ambiente di sviluppo
SDK dedicato che comprende compilatore per il
●
formato .dex (Dalvik Executable) ed emulatore
Plug-in per Eclipse che consente la gestione di
●
progetti Android all'interno dell'ambiente di
sviluppo
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
37. Android Market
Sulla scia dell'App Store dell'iPhone, Android
●
dispone di un sistema integrato di distribuzione
delle applicazioni: l'Android Market
Attualmente dispone di poco meno di 1000
●
applicazioni (contro le 15000 dell'App Store) ed è
limitato a software gratuito
Attivo in USA e UK, in primavera arriverà in altre
●
nazioni (Italia inclusa!) e consentirà la vendita di
applicazioni.
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
38. Android vs Java ME
Java ME è la tecnologia di mobile computing più
●
diffusa in assoluto, ma soffre di alcuni problemi:
il disegno originale è del 2001: la
–
retrocompatibilità comincia a pesare
la frammentarietà delle implementazioni rende
–
difficoltoso il porting e precaria la compatibilità
Android è stato progettato per dispositivi
●
moderni: un confronto con Java ME è quasi fuori
luogo. D'altro canto, però, Android gira su un solo
telefono: probabilmente tra 1-2 anni la situazione
cambierà...
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
39. Android vs iPhone OS
Android e iPhone OS hanno caratteristiche simili,
●
anche se:
Android sembra pensato per i programmatori:
–
l'architettura modulare di Android consente
mash-up tra applicazioni; è possibile interazione
a basso livello e esecuzione in background;
iPhone OS è evidentemente pensato per gli
–
utenti: il look & feel di CocoaTouch, l'interfaccia
multitouch e le guideline di iPhone OS sono
estremamente innovativi e hanno segnato un
punto di svolta per il mondo della telefonia
mobile
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
40. G1 o iPhone?
Questo è ciò che si chiedono tutti: Google o
●
Apple? iPhone o anti-iPhone?
Il presente è certamente iPhone: oltre 10M di
●
terminali, 15K applicazioni, 500M download
Android sarà protagonista (?) del 2009, con la
●
commercializzazione di nuovi dispositivi e
l'allargamento a nuovi mercati
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
41. Conclusioni
Android è una piattaforma di sviluppo potente,
●
flessibile e innovativa: il futuro della telefonia
mobile passerà certamente per questa strada
L'architettura modulare e l'integrazione con i
●
servizi di Google consente lo sviluppo di
applicazioni Mobile Internet avanzate
L'Android Market potrà essere una buona
●
opportunità per gli sviluppatori indipendenti
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009
42. GRAZIE!
Riccardo Solimena
●
web: http://www.riccardosolimena.com
–
Skype: riccardo.solimena
–
email: riccardo.solimena@gmail.com
–
Stefano Sanna
●
web: http://www.gerdavax.it
–
Skype: gerdavax
–
email: gerdavax@gmail.com
–
Riccardo Solimena, Java Italian Portal - Stefano Sanna, JUG Sardegna
Javaday Roma III Edizione – 24 gennaio 2009