Non Conventional Android Programming (Italiano) - Presentation Transcript
Non-conventional Android Programming
Chi sono? Davide Cerbo http://jesty.it http://davide.cerbo.born-to-co.de http://www.linkedin.com/in/davidecerbo [email_address]
http://www.pro-netics.it [email_address]
Prima bastava
Nuove Caratteristiche
GPS
Bussola
Fotocamera
Schermi ad alta risoluzione
WI-FI
UMTS / HSPDA
Multi-touch
Dove stiamo andando?
(Il mercato)
Troppi dispositivi
Ad ognuno il suo
IPhone: Object C
Android: Java
BlackBerry: Java
Nokia/Symbian: Java e C++
Windows Mobile: .NET e C
Write once, run anywhere Ricorda niente?
PhoneGap HTML + JAVASCRIPT + CSS = PhoneGap.com
PhoneGap CROSS PLATFORM + INTERFACCIA API NATIVE + OPEN SOURCE = PhoneGap.com
Cosa posso fare? ...e a breve: fotocamera, mappe e gestione file
Esempi assortiti //LOCALIZZAZIONE GEOGRAFICA var getLocation = function () { var suc = function ( p ){ alert ( p . coords . latitude + " " + p . coords . longitude ); }; var fail = function (){ alert ( "Location not available!" );}; navigator . geolocation . getCurrentPosition ( suc , fail , undefined ); } //VIBRAZIONE navigator . notification . vibrate ( 0 ); //BEEEEEEP navigator . notification . beep ( 2 );
Esempi assortiti //ACCELLEROMETRO var watchAccel = function () { var s = function ( a ){ document . getElementById ( 'x' ). innerHTML = roundNumber ( a . x ); document . getElementById ( 'y' ). innerHTML = roundNumber ( a . y ); document . getElementById ( 'z' ). innerHTML = roundNumber ( a . z ); }; var d = function (){}; var opt = {}; opt . frequency = 100 ; Timer = navigator . accelerometer . watchAcceleration ( s , f , opt ); } //FOTOCAMERA navigator . camera . getPicture ( dump_pic , fail , { quality : 50 }); function dump_pic ( data) { ... document . getElementById ( "test" ). src = "data:image/jpeg;base64," + data ; }
Dove è il trucco? PhoneGap mette a disposizione un progetto di partenza per ogni dispositivo supportato. Ogni progetto è una semplice applicazione costituita da un browser web che gira a tutto schermo ed in cui sono state iniettate degli oggetti javascript che corrispondono alle API native del dispositivo. Per ogni dispositivo per cui vogliamo distribuire il nostro applicativo dovremmo copiare i file html, css, javascript e le immagini dentro una cartella del progetto e modificare le configurazioni necessarie, ad esempio il nome del progetto, l'autore, etc.. Nel caso di Android dovremmo copiare i file in: ../my-android/assets/www/
Per capirci meglio... ...osserviamo questo pezzo di codice tratto dalla classe DroidGap.java contenuta nel progetto di partenza per Android: private void bindBrowser(WebView appView) { gap = new PhoneGap( this , appView); geo = new GeoBroker(appView, this ); accel = new AccelListener( this , appView); launcher = new CameraLauncher(appView, this ); // This creates the new javascript interfaces for PhoneGap appView.addJavascriptInterface( gap , "DroidGap" ); appView.addJavascriptInterface( geo , "Geo" ); appView.addJavascriptInterface( accel , "Accel" ); appView.addJavascriptInterface( launcher , "GapCam" ); }
Perchè Android?
Open Source
Basato su Linux e Java (Dalvik)
Vasta scelta di dispositivi
Sistema operativo altamente personalizzabile
?
Una piccola parentesi su Android 2.0 (Eclair)
Gestione di più Google account
Supporto per Microsoft Excange Server
Pulsanti Home, Menu e Back diventano facoltativi
Nuovo browser web con HTML5
Migliorata applicazione della fotocamera (flash, zoom digitale, etc...)
Messaggi SMS e MMS ricercabili
MOTOROLA DROID http://droiddoes.com
Ma Spring?
SpringME
Permette l'utilizzo dell'object configuration tramite XML
Non utilizza la reflection, ma la generazione automatica del codice
Il pacchetto generato non conterrà librerie supplementari
Sviluppato e utilizzato da un Wilfred Springer, ex Software Architect in TomTom
Funziona tramite un plugin per Apache MAVEN
Nato per J2ME ma utilizzabile anche con GWT e Android
SpringME: come funziona?
Spring utilizza la reflection per la Dependency Injection Class cl = Class.forName("Person"); Object instance = cl.newInstance(); Method meth = cl.getDeclaredMethod("setName"); method.invoke(instance, new Object[] { "Nick Hornby" }); --------------------------------------------------------- ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(...); BeanFactory factory = (BeanFactory) appContext; Person frank = (Person)factory.getBean(“frank”);
SpringME genera automaticamente il codice tramite un plugin per Apache Maven Person instance = new Person(); instance.setName("Wilfred Springer"); --------------------------------------------------------- BeanFactory factory = new BeanFactory(); Person frank1 = (Person)factory.getBean(“frank”); Person frank2 = factory.getFrank();
Android + Maven
Installiamo l'SDK per Android
Impostiamo la variabile di ambiente ANDROID_SDK_15
Modifichiamo il pom.xml aggiungendo il plugin SpringME
Creiamo il file application-context.xml in /context, es.: <beans> <bean id="ciao" class="it.jesty....Greeting" scope="prototype"> <constructor-arg value="Ciao" /> </bean> </beans>
Creiamo la classe Greeting.java
Modifichiamo la classe MavenAndroidActivity.java, es.: public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); TextView tv = new TextView( this ); tv.setText(((Greeting)new BeanFactory().getBean( "ciao" )) .to( "MavenAndroidActivity" )); //oppure: tv.setText(((Greeting)new BeanFactory().getCiao()).to(...)); }
Ripetiamo il passo 8 e 9 mvn com.jayway.maven.plugins.android.generation2:maven-android-plugin:deploy
Android è il nuovo sistema operativo open source p more
Android è il nuovo sistema operativo open source per dispositivi mobili e realizzato da Google che si è posta la missione di rendere l’internet mobile accessibile a tutti tramite dispositi a basso costo.
Durante questo intervento mostrerò come sia possibile sviluppare per questo sistema operativo (e non solo) senza l’utilizzo di Java e come sia possibile utilizzare una versione light di Spring Framework nelle applicazioni mobili. less
0 comments
Post a comment