Non Conventional Android Programming (Italiano)

5,498 views

Published on

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.

Published in: Technology, Education
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,498
On SlideShare
0
From Embeds
0
Number of Embeds
124
Actions
Shares
0
Downloads
67
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Non Conventional Android Programming (Italiano)

  1. 1. Non-conventional Android Programming
  2. 2. Chi sono? Davide Cerbo http://jesty.it http://davide.cerbo.born-to-co.de http://www.linkedin.com/in/davidecerbo [email_address]
  3. 3. http://www.pro-netics.it [email_address]
  4. 4. Prima bastava
  5. 5. Nuove Caratteristiche <ul><li>GPS
  6. 6. Bussola
  7. 7. Fotocamera
  8. 8. Schermi ad alta risoluzione
  9. 9. WI-FI
  10. 10. UMTS / HSPDA
  11. 11. Multi-touch </li></ul>
  12. 12. Dove stiamo andando?
  13. 13. (Il mercato)
  14. 14. Troppi dispositivi
  15. 15. Ad ognuno il suo <ul><li>IPhone: Object C
  16. 16. Android: Java
  17. 17. BlackBerry: Java
  18. 18. Nokia/Symbian: Java e C++
  19. 19. Windows Mobile: .NET e C </li></ul>
  20. 20. Write once, run anywhere Ricorda niente?
  21. 21. PhoneGap HTML + JAVASCRIPT + CSS = PhoneGap.com
  22. 22. PhoneGap CROSS PLATFORM + INTERFACCIA API NATIVE + OPEN SOURCE = PhoneGap.com
  23. 23. Cosa posso fare? ...e a breve: fotocamera, mappe e gestione file
  24. 24. Esempi assortiti //LOCALIZZAZIONE GEOGRAFICA var getLocation = function () { var suc = function ( p ){ alert ( p . coords . latitude + &quot; &quot; + p . coords . longitude ); }; var fail = function (){ alert ( &quot;Location not available!&quot; );}; navigator . geolocation . getCurrentPosition ( suc , fail , undefined ); } //VIBRAZIONE navigator . notification . vibrate ( 0 ); //BEEEEEEP navigator . notification . beep ( 2 );
  25. 25. 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 ( &quot;test&quot; ). src = &quot;data:image/jpeg;base64,&quot; + data ; }
  26. 26. 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/
  27. 27. 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 , &quot;DroidGap&quot; ); appView.addJavascriptInterface( geo , &quot;Geo&quot; ); appView.addJavascriptInterface( accel , &quot;Accel&quot; ); appView.addJavascriptInterface( launcher , &quot;GapCam&quot; ); }
  28. 28. Perchè Android? <ul><li>Open Source
  29. 29. Basato su Linux e Java (Dalvik)
  30. 30. Vasta scelta di dispositivi
  31. 31. Sistema operativo altamente personalizzabile </li></ul>?
  32. 32. Una piccola parentesi su Android 2.0 (Eclair) <ul><li>Gestione di più Google account
  33. 33. Supporto per Microsoft Excange Server
  34. 34. Pulsanti Home, Menu e Back diventano facoltativi
  35. 35. Nuovo browser web con HTML5
  36. 36. Migliorata applicazione della fotocamera (flash, zoom digitale, etc...)
  37. 37. Messaggi SMS e MMS ricercabili </li></ul>
  38. 38. MOTOROLA DROID http://droiddoes.com
  39. 39. Ma Spring?
  40. 40. SpringME <ul><li>Permette l'utilizzo dell'object configuration tramite XML
  41. 41. Non utilizza la reflection, ma la generazione automatica del codice
  42. 42. Il pacchetto generato non conterrà librerie supplementari
  43. 43. Sviluppato e utilizzato da un Wilfred Springer, ex Software Architect in TomTom
  44. 44. Funziona tramite un plugin per Apache MAVEN
  45. 45. Nato per J2ME ma utilizzabile anche con GWT e Android </li></ul>
  46. 46. SpringME: come funziona? <ul><li>Spring utilizza la reflection per la Dependency Injection Class cl = Class.forName(&quot;Person&quot;); Object instance = cl.newInstance(); Method meth = cl.getDeclaredMethod(&quot;setName&quot;); method.invoke(instance, new Object[] { &quot;Nick Hornby&quot; }); --------------------------------------------------------- ClassPathXmlApplicationContext appContext = new ClassPathXmlApplicationContext(...); BeanFactory factory = (BeanFactory) appContext; Person frank = (Person)factory.getBean(“frank”);
  47. 47. SpringME genera automaticamente il codice tramite un plugin per Apache Maven Person instance = new Person(); instance.setName(&quot;Wilfred Springer&quot;); --------------------------------------------------------- BeanFactory factory = new BeanFactory(); Person frank1 = (Person)factory.getBean(“frank”); Person frank2 = factory.getFrank(); </li></ul>
  48. 48. Android + Maven <ul><li>Installiamo l'SDK per Android
  49. 49. Impostiamo la variabile di ambiente ANDROID_SDK_15
  50. 50. Installiamo Android nel nostro repository , es.: mvn install:install-file -DgroupId=android -DartifactId=android -Dversion=1.5_r2 -Dpackaging=jar -Dfile=$ANDROID_SDK_15/platforms/android-1.5/android.jar
  51. 51. Creiamo un nuovo progetto, es.: android create project --target 3 --name MavenAndroidExample --path ./maven-android-example --activity MavenAndroidActivity --package it.jesty.mavenandroid.example </li></ul>
  52. 52. Android + Maven <ul><li>Creiamo il file pom.xml (lo vediamo nella prossima slide)
  53. 53. Facciamo un po' di pulizia: rm -r bin build.xml build.properties libs
  54. 54. Creiamo l'emulatore, es.: android create avd --name mavenandroidadv --target 3
  55. 55. Eseguiamo l'emulatore, es.: emulator -avd mavenandroidadv
  56. 56. mvn install per generare il file .apk
  57. 57. Eseguiamo il deploy del file .apk nel dispositivo: mvn com.jayway.maven.plugins.android.generation2:maven-android-plugin:deploy </li></ul>
  58. 58. ... <dependencies> <dependency> <groupId> android </groupId> <artifactId> android </artifactId> <version> 1.5_r2 </version> <scope> provided </scope> </dependency> </dependencies> <build> <sourceDirectory> src </sourceDirectory> <plugins> <plugin> <groupId> com.jayway.maven.plugins.android.generation2 </groupId> <artifactId> maven-android-plugin </artifactId> <version> 2.1.0 </version> <configuration> <sdk> <path> ${env.ANDROID_SDK_15} </path> <platform> 1.5 </platform> </sdk> <deleteConflictingFiles> True </deleteConflictingFiles> </configuration> <extensions> true </extensions> </plugin> ... Android + Maven
  59. 60. Android + Maven + SpringME <ul><li>Modifichiamo il pom.xml aggiungendo il plugin SpringME
  60. 61. Creiamo il file application-context.xml in /context, es.: <beans> <bean id=&quot;ciao&quot; class=&quot;it.jesty....Greeting&quot; scope=&quot;prototype&quot;> <constructor-arg value=&quot;Ciao&quot; /> </bean> </beans>
  61. 62. Creiamo la classe Greeting.java
  62. 63. 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( &quot;ciao&quot; )) .to( &quot;MavenAndroidActivity&quot; )); //oppure: tv.setText(((Greeting)new BeanFactory().getCiao()).to(...)); }
  63. 64. Ripetiamo il passo 8 e 9 mvn com.jayway.maven.plugins.android.generation2:maven-android-plugin:deploy </li></ul>
  64. 65. ... <resources> <resource> <directory>${basedir}/context/</directory> <filtering>true</filtering> <includes> <include>**/*.xml</include> </includes> </resource> <resource> <directory> ${basedir}/target/generated-sources/spring-me </directory> </resource> </resources> <plugins> <plugin> <groupId>me.springframework</groupId> <artifactId>spring-me-maven-plugin</artifactId> <version>1.0-SNAPSHOT</version> <executions> <execution> <goals> <goal>generate</goal> <goal>dot</goal> </goals> <phase>generate-sources</phase> </execution> </executions> <configuration> <contextFile> ${basedir}/context/application-context.xml </contextFile> <className> it.jesty.mavenandroid.example.BeanFactory </className> <dotFile>${basedir}/target/poloko-context.dot</dotFile> </configuration> </plugin> ...
  65. 66. Android + Maven + SpringME <?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?> <beans xmlns=&quot;http://www.springframework.org/schema/beans&quot; xmlns:xsi=&quot;http://www.w3.org/2001/XMLSchema-instance&quot; xsi:schemaLocation=&quot; http://www.springframework.org/schema /beans http://www.springframework.org/schema/beans/spring- beans-2.0.xsd&quot; default-lazy-init=&quot;true&quot; > <bean id=&quot;ciao&quot; class=&quot;it.jesty...Greeting&quot; scope=&quot;prototype&quot; > <constructor-arg value=&quot;Ciao&quot; /> </bean> <bean id=&quot;hello&quot; class=&quot;it.jest...Greeting&quot; scope=&quot;prototype&quot; > <constructor-arg value=&quot;Hello&quot; /> </bean> </beans>
  66. 67. Android + Maven + SpringME package it.jesty.mavenandroid.example; public class Greeting { private String greeting; public Greeting(String greeting){ this .greeting = greeting; } public String to(String to){ return this .greeting + &quot;, &quot; + to; } }
  67. 69. Risorse e Bibliografia <ul><li>Android http://www.android.com
  68. 70. PhoneGap http://phonegap.com
  69. 71. SpringME http://springframework.me http://sourceforge.net/projects/springme/
  70. 72. Libro su SpringME http://www.scribd.com/doc/8611209/Spring-ME
  71. 73. Maven per Android http://code.google.com/p/maven-android-plugin http://code.google.com/p/masa
  72. 74. Linee guida allo sviluppo per Android http://developer.android.com/guide/practices/design/performance.html
  73. 75. Big Picture degli store di Android, IPhone e IPod Touch http://mashable.com/2009/09/15/iphone-android-apps-visualized/ </li></ul>
  74. 76. Download esempi http://jesty.it/non-conventional-android-programming.zip Il file compresso contiene: <ul><li>Esempio funzionante della demo di PhoneGap per Android
  75. 77. Esempio di utilizzo di Apache Maven con Android
  76. 78. Esempio di utilizzo di SpringME </li></ul>

×