Android 4 – Guida per lo Sviluppatore

Android 4 - Guida per lo sviluppatore

Android 4 – Guida per lo sviluppatore

E’ finalmente disponibile l’ultima edizione del mio libro sulla programmazione Android giunto ormai alla versione 4 della piattaforma. Al momento è disponibile in versione Kindle ma presto sarà disponibile anche in versione cartacea nelle principali librerie. A differenza della edizione dedicata ad Android 3, non si tratta di un semplice aggiornamento ma ho colto l’occasione per riscrivere il tutto quasi da zero utilizzando un approccio puramente pratico. Attraverso la realizzazione di due prototipi, ho provato a descrivere quelli che sono in concetti principali relativi allo sviluppo della maggior parte delle applicazioni Android. Si parte dal primo capitolo nel quale ho dedicato solo pochissime pagine nella descrizione di cosa sia Android (immaginando infatti che chi compra il libro già lo sapesse…) descrivendo poi tutto ciò che è necessario conoscere sul linguaggio Java che sappiamo essere il linguaggio di riferimento (anche se ora non l’unico) per lo sviluppo Android. Nel secondo capitolo si inizia quindi a parlare Android attraverso la descrizione del nuovo ambiente di sviluppo che si chiama Android Studio e che è stato presentato all’ultima Google I/O a Giugno. Tenere il passo degli strumenti che Google mette a disposizione per lo sviluppo di Android è cosa quasi impossibile; nella prima versione del libro ricordo di aver ripreso tutti gli screen shot del plugin di eclipse per 6 volte!!! Ho quindi saltato la parte di pura installazione (che si può trovare sul sito ufficiale di Android) per descrivere gli strumenti principali tra cui Gradle che è il nuovo sistema di build. In Android Studio, basato ora su IntelliJ, si è iniziato a dividere la parte di scrittura del codice da quella di build e creazione delle versioni dell’applicazione per diverse tipologie di dispositivo. Ora, a dire il vero, la definizione degli script di build rappresentano un vero e proprio lavoro 🙂 Il terzo capitolo è quindi dedicato alla descrizione della prima applicazione che si chiama UGHO (User Generate HOroscope). Si tratta di una applicazione nata da una semplice idea ovvero quella di generare un oroscopo in base a come le persone si sentono e non in base alla posizione dei vari pianeti; una specie di oroscopo al contrario. Per chi crede e per chi è dubbioso si tratta ovviamente di un esempio di applicazione che descriviamo inizialmente in quello che è il flusso di navigazione. Da qui i concetti di Activity e gestione delle varie risorse. Nel capitolo 4 iniziamo invece a parlare di Fragment per l’adattamento della nostra applicazione ai dispositivi tablet o comunque caratterizzati da display di dimensioni diverse da quelle di uno smartphone. Nel capitolo 5 descriviamo le View ovvero quei componenti che utilizziamo per riempire le varie schermate ed interagire con l’applicazione. Nel capitolo 6 vediamo delle View particolari ovvero le ListView ed il fondamentale concetto di Adapter. In questi capitoli trattiamo le basi ma ci spingiamo anche un po’ oltre attraverso la realizzazione di alcune interessanti specializzazioni di Adapter attraverso l’applicazione del famoso Design Pattern Decorator. In particolare descrivo nel dettaglio come sia possible decorare un Adapter per l’aggiunta delle sezioni che sono magari di più semplice implementazione in iOs. Il capitolo 7 è dedicato a componenti come la ActionBar ed i Menu che caratterizzano la maggior parte delle applicazioni. Con questo capitolo possiamo dire che si conclude la prima parte con la quale è possibile già realizzare alcune interessanti applicazioni. La seconda parte è comunque di fondamentale importanza in quanto tratta argomenti come quello della persistenza (capitolo 8), multithreading e servizi (capitolo 9) e sicurezza (capitolo 10). Anche in questi capitoli si da grande spazio non solo alle basi ma anche ad un utilizzo un po’ avanzato dell’ambiente. I capitoli 11 e 12 sono dedicati rispettivamente alla gestione delle animazioni e dei widget. A dire il vero non era mia intenzione inserirli ma mi sono stati espressamente richiesti dai vari lettori delle precedenti lezioni. Il capitolo 13 è dedicato alla gestione degli account e delle corrispondenti operazioni di sincronizzazione. Si tratta di aspetti molto importante nella maggior parte delle applicazioni professionali. In questa fase descrivo infatti anche come si utilizzano le API di Facebook per la registrazione ed utilizzo delle informazioni corrispondenti. Infine il capitolo 14 è dedicato alla gestione della location e delle mappe. Si tratta sicuramente del capitolo che presenta il maggior numero di novità rispetto alle versioni precedenti in quanto descrive API presentate all’ultimo Google I/O e gestite attraverso le Google Play Service.

Come detto più volte si tratta comunque di un testo dedicato a chi vuole cominciare a sviluppare applicazioni per Android ma che contiene alcuni spunti che sono sicuro essere utili anche per i più esperti. Il tutto è supportato ad moltissimi esempi oltre al codice relativo ai diversi step di creazione di UGHO che verrà presto pubblicata come applicazione sul Play Market e di cui metterò a disposizione il sorgente attraverso repository pubblico di GitHub. Il codice disponibile attraverso il testo è infatti ricco di diverse possibilità di implementazione che invece vogliamo in un certo senso “pulire” per fornirne una versione ufficiale. Quando disponibile ne darò notizia su questo sito.

A chi deciderà di acquistare il mio libro auguro buona lettura. Agli altri ricordo comunque che è possibile scaricare tutti gli esempi e sorgenti al seguente link di apogeo.

Ultima considerazione riguarda la descrizione di argomenti più specifici ed in modo più avanzato. Per questo non perdete i diversi Sushi tra cui quello dedicato a RoboGuice di prossima uscita.

Massimo Carli

 

84 thoughts on “Android 4 – Guida per lo Sviluppatore

  1. Tempismo perfetto, ieri ho acquistato (su amazon) l’edizione precedente a questa. Avevo avuto modo di leggere qualche pagina e ho deciso subito di comprarne una copia. Complimenti per il lavoro svolto.

    • anch’io ho acquistato pochi giorni fa l’edizione precedente 🙁
      Vorrà dire che chiederemo uno sconto-fedeltà per la nuova! ^__^

      • Ciao Viviana,
        mi dispiace tu abbia acquistato la versione precedente ma ti ringrazio per l’interesse verso il mio libro. Posso comunque dire che, nonstante gli argomenti siano pressapoco gli stessi, si tratta di due testi molto diversi tra loro con approcci completamente diversi.

        Massimo Carli

        • Buongiorno Massimo, io ho un problema in Android Studio, Le scrivo qui perchè non so dove altro scriverLe,
          praticamente quando accedo al file activity_main.xml mi appare solo il formato testuale e non l interfaccia come nel libro…Come posso fare?

          • Buongiorno,
            nella parte bassa dovrebbero esserci due tab. Uno si chiama Text con la parte testuale ed un altro si chiama Design con la rappresentazione visuale del layout.

            Saluti
            Massimo Carli

          • Salve Massimo, inanzitutto grazie per la risposta fulminea, si ho provato a vedere ma non ci sono e nemmeno palette e’ disponibile in alto a destra….

          • Prova a ripristinare il layout di default con la voce Restore Default Layout nel menu Window.

            M.

          • Scusi in alto a sinistra palette non c e’, ho provato una montagna di finestre ma niente, non so proprio come fare… Non ci sara’ per caso da cambiare qualche impostazione ?

        • Salve massimo. Poiche ho comprato da pochi giorni il manuale Android 4 – guida allo sviluppatore, ho istallato la versione android studio più recente. Ho creato UGHO ma nel momento in cui vado a fare il build mi da il seguente errore:
          Error:The SDK Build Tools revision (19.0.3) is too low for project ‘:UGHO’. Minimum required is 19.1.0
          come posso risolvere il problema per andare avanti?

          • Buongiorno,
            si tratta di un problema dovuto ad un aggiornamento dei Build Tool. E’ necessario quindi scaricare la nuova versione dei tool attraverso l’SDK Manager e quindi cambiare, nel file di gradle, il riferimento alla 9.0.3 con quello alla 9.1.0.

            Saluti
            Massimo

          • Ciao. grazie per la velocità della risposta. Ho aperto l’android Sdk manager ed ho scaricato la versione 19.1 di android sdk build-tools. Ora però non so come cambiare il riferimento nel file di gradle. Mi può spiegare in dettaglio come si fa? Grazie ancora ed a presto

          • Buongiorno,
            deve andare nel file build.gradle del progetto e cambiare

            android {
            compileSdkVersion 19
            buildToolsVersion “19.0.3”

            – – –

            }

            in

            android {
            compileSdkVersion 19
            buildToolsVersion “19.1.0”
            – – –
            }

            Saluti
            Massimo Carli

          • Ho risolto il problema di come modificare la versione build sdk. basta andare nel file build.gradle e modificare solo indice della versione sdk. In sostanza si va ad agire come segue:
            apply plugin: ‘android’

            android {
            compileSdkVersion 19
            buildToolsVersion “19.1.0”

            defaultConfig {
            minSdkVersion 8
            targetSdkVersion 19
            versionCode 1
            versionName “1.0”
            }
            buildTypes {
            release {
            runProguard false
            proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.txt’
            }
            }
            }

            dependencies {
            compile ‘com.android.support:appcompat-v7:+’
            compile fileTree(dir: ‘libs’, include: [‘*.jar’])

            Ho modificato solo buildToolsVersion “19.0.1” con buildToolsVersion “19.1.0”
            Grazie lo stesso Massimo

  2. Non ho comprato l’ebook ma per ora ho scaricato solo l’estratto (primo capitolo) l’impaginazione sembra ben fatta (alcuni manuali tecnici sono impaginati con i piedi)

    Un neo abbastanza grande è il prezzo 27 euro per un ebook (quando già sai che il cartaceo da 40 euro scende a 33 e 15 senza spese di spedizione) sono un pò tanti. Ovviamente la colpa non è dell’autore ma si divide fra editore e stato. Lo stato ovviamente ha molta più colpa facendo pagare il 4% di iva su un libro cartaceo e il 21% (fra poco forse 22) sullos tesso libro in formato digitale. L’editore ha le suel colpe non mi puoi far pagare 22 euro + iva un libro senza carta, senza copertina e senza rilegatura

    Scusate lo sfogo credo però che comprerò la versione cartacea

    Idea per Apogeo: perché non regalare la versione digitale a chi compra la versione cartacea?

    • Ciao Fabrizio,
      ti ringrazio per l’interesse verso i miei libri e capisco le tue perplessità. Come dici tu il prezzo dei libri non dipende dalla mia volontà. Io posso solamente impegnarmi per fare in modo che il valore del testo si avvicini il più possibile a quello che è il suo prezzo.
      Saluti
      Massimo Carli

  3. L’ho comprato appena uscito , cioè ieri 🙂 sono rimasto molto soddisfatto almeno fino a questo momento del taglio che gli hai dato . In particolar modo ho apprezzato molto il primo capitolo dedicato agli aspetti propedeutici , nonché quindi degli elementi di Java utili ai fini della comprensione del resto del testo ; anche l’idea di condurre il tutto verso un progetto finale sinceramente mi entusiasma . Spero che le date del Sushi verranno presto pubblicate su Apogeo e.. hai mai pensato di scrivere un testo su Java ?? hai scritto delle piccolezze che mi erano del tutto estranee nonostante ho consultato altri volumi sulla programmazione Java 😮

  4. Complimenti per il nuovo lavoro pubblicato !

    Sono al quarto libro acquistato (Android, Andriod 3, Sushi – Creare la prima applicazione Android) e quindi mi posso definire un vero fan.
    Trovo molto interessante l’introduzione ad Android Studio e l’ aver mantenuto la guida del lettore tramite l’approccio pratico.
    Ancora non mi sono addentrato molto, ma la differenza con i volumi precendenti è percepibile.
    Ogni volta qualcosa di nuovo, senza dimenticare mai i concetti base.
    Grazie per l’impegno, anche perchè nel panorama italiano non ci sono autori o libri su Android paragonabili.

    saluti

    • Ciao Cristiano,
      ti ringrazio per i complimenti che fanno sempre piacere. In effetti questa volta ho voluto dare un approccio completamente diverso e molto piu’ pratico sperando che il tutto sia utile ai lettori. So comunque che e’ impossibile accontentare tutti 🙂

      Saluti
      Massimo Carli

  5. Salve! Ho bisogno di un importante consiglio… devo scrivere la mia prima applicazione (non banale) Android, utilizzando come IDE Eclipse+ADT. Mi consiglierebbe di acquistare Android 4 o la versione precedente? La domanda nasce anche dopo aver letto una sua precedente risposta in cui dice che pur trattando praticamente gli stessi argomenti, gli approcci sono differenti. Quale scegliere e in base a cosa?
    Grazie.

    • Ciao Rosa,
      si tratta di un grande dilemma 🙂 I concetti dei due libri sono quasi gli stessi nel senso che l’ultimo è ovviamente aggiornato alla versione 4 di Android mentre il precedente si ferma alla versione 3. A dire il vero non si tratta di modifiche eclatanti per cui la tua scelta dovrebbe tenere in considerazione quello che è lo strumento di sviluppo utilizzato. Se il progetto è importante ti consiglio di utilizzare eclipse + ADT in quanto Android Studio sta ancora cambiando.
      Saluti
      Massimo

  6. In realtà controllando meglio nel pacchetto degli esempi mancano tutti i progetti relativi al capitolo 7, e quindi: FloatingContextMenuTest, PopupTest, SpinnerActionViewTest, TabFragmentTest e DropDownNavigationTest.
    🙁 🙁 🙁

    Saluti,
    Daniele.

    • Ciao Daniele,
      ti ringrazio per la segnalazione e ti chiedo scusa ma con tutto questo materiale ho dimenticato qualcosa nello ZIP che ho dato ad Apogeo. Nella sezione download di questo sito ho messo i progetti mancanti. Se manca ancora qualcosa non dubitare nel chiedermelo. Ne approfitto anche per segnalare che con gli ultimi aggiornamenti qualcosa potrebbe essere cambiato nella gestione dei progetti da parte di Android Studio rispetto a quello che ho utilizzato durante la scrittura del libro. Per questo motivo, ma anche per comprendere al meglio gli esempio, il consiglio è quello di crearne di propri cercando di ripetere quanto fatto in quelli esistenti.
      Grazie
      Massimo

      • Ciao Massimo,

        ho dimenticato di segnalarti OptionMenuTest.
        Per quanto riguarda la versione di Android Studio, mi ha creato non pochi guai di configurazione nell’import dei tuoi progetti che chiaramente ho risolto creando manualmente dei nuovi chiamati con i nomi dei tuoi esempi. Per dire nel capitolo 3, quando affronti l’implementazione della registrazione, Android Strudio ha dei problemi nel “renderizzare” il datepicker restituendo il seguente problema:
        and are broken in this version of the rendering library. Try updating your SDK in the SDK Manager when issue 59732 is fixed. (Open Issue 59732, Show Exception)
        Niente di che perché chiaramente non è un problema di esecuzione, e infatti l’applicazione gira correttamente su un nexus 4, ma la rappresentazione del layout sull’ide non avviene correttamente, se non abbassando la versione di android da 18 a 15 nelle opzioni di rendering layout.

        Grazie per la rapidità della risposta.
        Daniele.

  7. Ciao Massimo,

    oltre al progetto OptionMenuTest, mancano anche ActionModeTest e BatchActionModeTest.
    Credo e spero di averli segnalati tutti.

    Saluti.
    Daniele.

  8. Ciao Massimo,

    ho acquistato il tuo ultimo libro, sono molto inesperto sulla materia, quindi la mia domanda potrebbe sembrare banale. Mi sono perso già all’inizio, utilizzo android studio e quando creo un nuovo progetto, nella cartella layout viene creato, oltre al file activity_main.xml quasi vuoto, un altro file, cioè fragment_main.xml che contiene ciò che dovrebbe essere nel primo file, mentre nel progetto che sto seguendo sul libro c’è solo il primo file. Inoltre il file MainActvity.java ha le istruzioni per caricare la vista dal file fragment_main.xml. Cosa mi consigli di studiare per riuscire a capire questo passo?

    • Ciao Biagio,
      Android Studio viene aggiornato di continuo ed i template di creazione dei progetti possono subire delle modifiche. Nella ultima versione di AS non viene creata solamente una Activity ma anche un Fragment. In sintesi e’ stato fatto quello che nel testo viene descritto successivamente. Le possibilita’ sono due. La prima consiste nel proseguire la lettura del testo fino al capitolo dei Fragment che spiega il tutto. La seconda consiste nel cancellare quanto creato da AS e quindi seguire il progetto passo passo.

      Saluti
      Massimo

  9. Buongiorno,
    vorrei procedere all’acquisto in digitale del libro e vorrei sapere quanto è prerequisito essenziale conoscere veramente il java prima di iniziare a leggerle la Guida. Io conosco qualcosa di altri linguaggi al oggetti, ma non java.
    Grazie

    • Bungiorno,
      se conosce già un altro linguaggio di programmazione ad oggetti non ci saranno problemi. Il primo capitolo tratta appunto i concetti specifici di Java da conoscere per il resto del testo.

      Saluti
      Massimo Carli

  10. Buongiorno Massimo,
    ho acquistato l’ultima versione del libro, ma ho un po’ di difficolà ad importare i tuoi progetti essendo stati realizzati con una vecchia versione di adroid studio, mi dirai fatti il tuo progetto! Però in vari punti il libro chiede di far riferimento alle tue classi che non riesco ad importare. Nono so se sono stato molto chiaro, hai qualche suggerimento?

    • Buongiorno Simone.
      Per importare i progetti del libro e’ necessario utilizzare l’opzione File > Import Project. La versione utilizzata per gli esempi era molto precedente alla versione corrente di Android Studio per cui bisogna cambiare la corrispondente configurazione nei file build.gradle. Ad esempio, per il Capitolo 2, e’ sufficiente utilizzare la seguente configurazione

          buildscript {
              repositories {
                  maven { url 'http://repo1.maven.org/maven2' 
              }
          }
          dependencies {
              classpath 'com.android.tools.build:gradle:0.8.+'
          }
      }
      apply plugin: 'android'
      
      dependencies {
          compile files('libs/android-support-v4.jar')
      }
      
      android {
          compileSdkVersion 19
          buildToolsVersion '19.0.1
      
          defaultConfig {
              minSdkVersion 7
              targetSdkVersion 16
          }
      }
      

      Spero che questo risolva il problema.
      Saluti
      Massimo Carli

  11. Ho acquistato il suo libro e installato Android Studio 0.4.6 su Windows 8.1.
    L’emulatore per visualizzare l’applicazione Hello Word si apre ma non visualizza niente a parte l’interfaccia del cellulare. Tutto è di una lentezza esasperante (ho un portatile con 4 GB di ram), soprattutto quando si lancia l’applicazione (che non parte). Ero partito con le migliori intenzioni, ma se è così lascio perdere tutto. Cordiali Saluti.

    • Buongiorno Fabio,
      intanto la ringrazio per l’acquisto. Purtroppo non sono un esperto di Windows 8 che avro’ visto al massimo un paio di volte 🙂 L’emulatore di Android non e’ mai stato un fulmine. Anzi, ultimamente e’ pure migliorato molto. Il consiglio che posso dare e’ quello di usare questo emulatore http://www.genymotion.com/ oppure utilizzare direttamente un dispositivo reale connesso al PC attraverso un cavo USB. Spero non basi comunque questo per farla arrendere 🙂
      Saluti
      Massimo Carli

  12. Salve, volevo chiederle se é prevista a breve e comunque al massimo entro l’ anno l’ uscita di un nuovo libro che tratti la versione più recente di Amdroid. Grazie

    • Buongiorno,
      la ringrazio per l’interesse. Al momento non è in programma alcun testo sulla ultima versione di Android.

      Saluti
      Massimo Carli

  13. Salve,
    volevo comprare il suo libro in entrambi i formati (elettronico e cartaceo), devo comprarli entrambi o da qualche parte li posso trovare abbinati?

    Saluti

    • Buonasera,
      la ringrazio per l’interesse. Purtroppo, da quello che mi risulta, si tratta di due prodotti diversi che quindi devono essere acquistati separatamente. Mi pare comunque che anche altri editori seguano questa politica.

      Saluti
      Massimo Carli

  14. Ciao Massimo,
    Ho gia acquistato il tuo libro in versione cartacea e letto il primo capitolo.
    Mi sorgono due problemi.
    a) come faccio ad adattarmi ad android studio 0.1 quando ormai è disponibile solo il 0.4?
    b) io non ho alcuna conoscenza di java, prima di leggere il tuo libro conviene leggerne un altro dove imparo il linguaggio ?

    In attesa Ringrazio

  15. Buongiorno ho acquistato Android 4 e devo dire che mi sono trovato molto bene, libro chiaro e ricco di esempi. Ho però un problema con le mappe, quando genero la key di debug tutto funziona vedo la mappa con il mio merker, quando però vado a generare la key di relise la mappa non si vede più nella mia app. Mi dice che non è possibile contattare il server. Utilizzo android studio.

    Ciao e grazie

    • Buongiorno,
      la ringrazio per l’acquisto. Quando la mappa non si vede si tratta probabilmente del fatto che la chiave e’ stata ottenuta con il certificato sbagliato ovvero quello di debug quando l’applicazione e’ stata firmata con quello di produzione.

      Saluti
      Massimo

        • stesso problema, per favore qual è la procedura esatta per generare una chiave per la release? sono giorni che ci sto provando sto diventando matto!

          Anche io ho acquistato il libro, ma questa fase non la trovo da nessuna parte, grazie.

          • Buongiorno,
            si tratta di un processo abbastanza automatico. Il primo passo consiste nella creazione del key store con un comando come il seguente

            keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000

            Creato il file my-release-key.keystore (o equivalente) in Android Studio puo’ configurare la cosa con la seguente definizione:

            signingConfigs {
            release {
            storeFile file("myreleasekey.keystore")
            storePassword "password"
            keyAlias "MyReleaseKey"
            keyPassword "password"
            }
            }

            come descritto qui.

            Se si riferisce alla chiave da usare per Google Map o simili bisogna estrarre la chiave SHA1 dal precedente file di store attraverso il comando:

            keytool -exportcert -alias -keystore -list -v

            sostituendo i vari nomi e password con quelli da lei inseriti in precedenza.

            Spero di esserle stato utile
            Massimo Carli

      • Carissimo Massimo, ci ho riprovato, stavolta seguendo le tue indicazioni, che poi sono le stesse che ho seguito sul sito di developer android.

        Se compilo in modo debug, funziona, se compilo in release mode (assembleRelease) e installo sul dispositivo connesso via USB (installRelease), compare schermata bianca.

        Ho creato anche con Build > Generate Signed APK, traferito sulla directory del dispositivo e installato manualmente… stesso risultato!

        Ora mi domando, ho letto da qualche parte che la versione release funziona solo se distribuita da PlayStore, ma come faccio a collaudare l’app?

        In secondo luogo, devo forse allineare il codice?

        Sono abbastanza disperato… intanto grazie per la prontissima risposta.

        • L’apk firmato con il certificato di produzione ha la stessa “dignità” di quello firmato con il keystore di debug. Una delle differenze che potrebbe essere causa del tuo problema è relativo all’offuscamento con Proguard che viene fatto nel primo caso e non nel secondo. Controlla di aver inserito le giuste definizioni di Proguard. Al 99% il problema è quello.
          M.

          • Rieccomi, ho passato tutto il giorno a provare a configurare il Proguard.

            Per prima cosa ho provato ad impostare il build.gradle come specificato nel libro, ma sembra dare qualche errore, temo ache Android Studio abbia grossi problemi!

            Ho cercato dappertutto, principalmente su StackOverflow, per capire se qualcuno avesse scritto qualcosa da copiare nel mio progetto.

            La configurazione che mi è sembrata più adatta è questa:

            -keep class com.google.android.gms.maps.** { *; }
            -keep interface com.google.android.gms.maps.** { *; }

            che ho messo nel file proguard-rules.pro

            Niente, non succede niente!

            Mi viene solo una gran voglia di gettare il piccolo smartphone dalla finestra!

        • *** ATTENZIONE ***
          Ho trovato questo file: proguard-android.txt che sembra essere il template usato nella configurazione di release!

          tolgo i commenti:

          -dontusemixedcaseclassnames
          -dontskipnonpubliclibraryclasses
          -verbose

          -dontoptimize
          -dontpreverify

          -keepattributes *Annotation*
          -keep public class com.google.vending.licensing.ILicensingService
          -keep public class com.android.vending.licensing.ILicensingService

          -keepclasseswithmembernames class * {
          native ;
          }

          -keepclassmembers public class * extends android.view.View {
          void set*(***);
          *** get*();
          }

          -keepclassmembers class * extends android.app.Activity {
          public void *(android.view.View);
          }

          -keepclassmembers enum * {
          public static **[] values();
          public static ** valueOf(java.lang.String);
          }

          -keep class * implements android.os.Parcelable {
          public static final android.os.Parcelable$Creator *;
          }

          -keepclassmembers class **.R$* {
          public static ;
          }

          -dontwarn android.support.**

          C’è qualcosa qua in mezzo che può collidere con le mappe di Google?

          • Non c’è niente da decommentare. Se si usano le Google Map bisogna per prima cosa seguire le istruzioni qui per i Google Play Services e quindi le istruzioni per ottenere la chiave da usare per le Mappe come spiegato qui.
            La chiave da usare per le Google Map dipende dal certificato per cui la chiave di produzione è diversa da quella di debug.

            M.

        • [RISOLTO]

          che fatica!

          Non era il ProGuard, sicuramente Android Studio lo aveva già configurato a dovere,

          il problema era questo:

          Creando una MapsActivity da Wizard, il file con le chiavi ‘google_maps_api.xml’ era stato messo sia nella directory “debug” che nella directory “release”, un nonsenso, visto che le API2 consentono di usare la stessa chiave per diversi keystore!
          perciò durante la compilazione “release”, la chiave non veniva ‘valorizzata’ correttamente!

          Quindi ho portato il file con la chiave ‘google_maps_api.xml’ in main e ho distrutto le directory debug e release, dato che non voglio differenziare i parametri di debug da quelli di release.

          GRAZIE PER IL CONTRIBUTO

  16. Salve non ho trovato nulla sull’uso dei socket allora mi sono cimentato.
    Voglio far dialogare il dispositivo con una applicazione desktop via TCP, ma aprendo un socket mi trovo sempre con il seguente errore
    “java.net.SocketException: socket failed: EACCES (Permission denied)”.
    Eppure nel manifest ho messo i permessi per internet:

    Qualcuno ha suggerimenti sull’uso dei socket. Ad ogni modo il libro è bello e consigliatissimo

    • Buongiorno,
      in genere dai dispositivi mobili si accede a servizi REST attraverso il protocollo HTTP. L’utilizzo di Socket su porte diverse dalla 80 non e’ molto usato e qualche volta addirittura impedito dai gestore di rete.
      M.

  17. Salve!,avrei bisogno di qualche chiarimento prima di procedere all’acquisto del suo libro.
    I dubbi che mi sorgono sono i seguenti:
    – Quanto a fondo è necessario conoscere Java (io ne conosco le basi ed i meccanismi di programmazione ad oggetti, ho una scarsa conoscenza delle classi del jdk )
    – quali altri requisiti sono necessari per ottenere un qualche risultato dalla lettura di questo libro
    – un altro dubbio riguarda l ambiente di sviluppo, ho avuto modo di provare AS ma mi dava alcuni problemi nel rendering degli elementi grafici. Oltre a questo, mi preoccupano i procedimenti da eseguire per importare i sorgenti di versioni precedenti.

    Quindi, le mie domande sono …. Sono sufficienti le mie conoscenze di java? Mi porterà problemi l utilizzo di AS o sarà sufficiente seguire dei semplici passaggi per risolvere i problemi da me sopracitati ?
    Confido in una sua risposta sincera e la ringrazio in anticipo.

    • Buongiorno,
      per questo libro, nonostante il primo capitolo sia di richiamo, serve una ottima conoscenza di Java. Il tool di sviluppo Android Studio e’ poi cambiato rispetto a quello usato nel testo per cui, sebbene gli argomenti siano sempre validi, richiede un minimo di dimestichezza con tutto l’ambiente di programmazione ed il mondo Java. In sintesi il testo e’ valido ma bisognera’ fare un po’ di fatica in piu’ 🙂

      Saluti
      Massimo Carli

  18. salve,inanzitutto le faccio i complimenti per il testo che è chiaro e intuitivo nel giusto modo…purtroppo sto incontranto alcune difficoltà a causa degli aggiornamenti di android studio,in particolare non riesco a trovare il modo di generare una nuova activity…premo con il destro sul package,ma il menu che viene fuori è completamente diverso da quello che è nel testo…ho cercato in ogni posto possibile del programma ma proprio non riesco a trovare l opzione android component…sapresti aiutarmi?
    ti prego!!!anche perche non vorrei arrendermi al secondo capitolo!!!

    • Buongiorno,
      per generare una nuova Activity e’ sufficiente selezionare il package con il pulsante destro del mouse e quindi scegliere New > Activity. A questo punto vi sono moltissime opzioni per diversi tipi di attivita’. Una Activity e’ comunque una classe che estende Activity per cui puo’ essere creata come tale ricordandosi poi di definirla all’interno del file di configurazione AndroidManifest.xml

      Saluti
      Massimo Carli

  19. Buongiorno Massimo,
    Il libro lo trovo davvero ben fatto… Ma il link per scaricare i sorgenti da errore 404.
    Mi sarebbe tanto utile poterli scaricare.

    • Buongiorno,
      la ringrazio per la segnalazione. Un aggiornamento automatico di WordPress ha cancellato tutto. Ho ripristinato i link nella sezione download

      Saluti
      Massimo Carli

  20. Ho comprato il libro android 4 guida per lo sviluppatore sperando di trovare una risposta ad un problema che da tempo non riesco a risolvere, purtroppo anche in questo libro come negli altri non ho trovato la risposta a questo problema.

    Quando crea una applicazione Android che ha almeno una activity, quando l’utente forza la chiusura dal Task Manager dell’app, il broadcastreceiver muore, come se non fosse mai stato registrato. L’unica soluzione che ad oggi mi evita di perdere la registrazione del broadcast è quella di mettere finish() dentro il metodo onStop, togliendo la possibilità all’utente di forzare la chiusura app.

    La soluzione sarebbe fare 2 app separate, una senza activity una con

    Sembra che io non sia l’unico ad avere questo problema, in diversi articoli di html.it ioprogrammo e atri, gli esempi dei broadcastreveiver, hanno tutti questo problema, se si forza la chiusura dell’app il broadcast muore, come se non fosse mai stato registrato, pensavo che fosse un problema solo in debug, ma anche in relase il problema persiste.

    Per finire, il metodo dell’activity onDestroy finish(); non funziona, l’app viene chiusa proma dal taskmanager, qualsiasi tentativo di deregistrare e registrare il boradcast dentro onDestroy dell’activity non funziona.

    posto il codice di una semplicissima app che parte all’avvio che ha questo problema.

    Lei Sig. Carli ha una soluzione ?

    ########manifest

    ###########################

    ###########broadcast class
    public class BroadAvvio extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {

    // TODO Auto-generated method stub
    if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)){
    Intent i = new Intent(context, MainActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    context.startActivity(i);
    }

    }
    }

    ###################################

    • Buongiorno,
      il tutto dovrebbe dipendere dalla modalità di registrazione del BroadcastReceiver. Nel caso in cui ci si registrasse ad un BroadcastReceiver da codice all’interno di una Activity questo comportamento è abbastanza ovvio. Nel caso in cui il BroadcastReceiver venisse registrato nel file AndroidManifest.xml questo problema non si dovrebbe verificare in quanto al momento dell’installazione esiste un componente che legge i file AndroidManifest.xml e registra le applicazioni “sensibili” ai vari Intent all’interno di un proprio repository che Android gestisce direttamente. Questo significa che la registrazione ad un BroadcastReceiver fatta nel file AndroidManifest.xml non dovrebbe perdersi nel caso di chiusura dell’applicazione; dovrebbe addirittura funzionare anche se l’applicazione non è mai stata eseguita.
      Nel caso specifico vedo un BroadcastReceiver relativo all’evento ACTION_BOOT_COMPLETED il quale dovrebbe ovviamente essere dichiarato nel file di configurazione AndroidManifest.xml ed avviare l’applicazione durante il processo di avvio del dispositivo. Come fa a dire che non funziona più dopo la chiusura dell’applicazione quando per provarlo deve addirittura riavviare il dispositivo?
      Per quello che riguarda il TaskManager, esso probabilmente esegue un bellissimo kill -9 sul processo dell’applicazione. Questo comando uccide il processo e non ha come conseguenza l’invocazione dei metodi di callback che vengono invocati nel caso di chiusura “naturale” dell’applicazione o della singola Activity. In uno dei miei libri, non ricordo se anche nell’ultimo, in relazione al ciclo di vita di una Activity simulavo proprio quello che fa il TaskManager dimostrando proprio come questi metodi, in quel caso, non vengono chiamati.
      Spero di esserle stato utile
      M.

      • buongiorno a lei,
        innanzitutto desidero ringraziarla per la risposta, mi complimento con lei per la sua competenza, il suo libro “Android 4 guida per lo sviluppatore” è sempre nella mia scrivania a portata di mano.

        Nel mio post, forse per evitare tag html maligni, è stato omesso il mio file manifest che le riposto sostituendo tag apertura e chiusura con dei trattini.

        ##########manifest
        -?xml version=”1.0″ encoding=”utf-8″?-
        -manifest xmlns:android=”http://schemas.android.com/apk/res/android”
        package=”com.xxxxxxx.app.avvio”-
        -uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” /-
        -application
        android:allowBackup=”true”
        android:icon=”@drawable/ic_launcher”
        android:label=”@string/app_name”
        android:theme=”@style/AppTheme” –
        -activity
        android:name=”.MainActivity”
        android:label=”@string/app_name” –
        -intent-filter-
        -action android:name=”android.intent.action.MAIN” /-
        -category android:name=”android.intent.category.LAUNCHER” /-
        -/intent-filter-
        -/activity-

        -receiver
        android:name=”.BroadAvvio”-
        -intent-filter-
        -action android:name=”android.intent.action.BOOT_COMPLETED” /-
        -/intent-filter-
        -/receiver-

        -activity
        android:name=”.esci”
        android:label=”@string/title_activity_esci” –
        -/activity-
        -/application-
        -/manifest-

        #########fine manifest

        La mainActivity è bianca inutile postarla.

        Installo app su dispositivo, riavvio dispositivo e tutto funziona correttamente. Funziona sempre tutto alla perfezione in tutte le circostanze, tranne quando l’activity è in vita e se ne forza la chiusura dell’app. Se apro l’app vado sul task manager, applicazioni attive e clicco “chiudi tutte” o chiudo forzatamente la singola app e riavvio il dispositivo, al riavvio il broadcast non viene
        eseguito. Ho installato una seconda app, al solo scopo di visualizzare tutti i broadcastReceiver registrati ed in effetti ho visto che il broadcast broadAvvio (mia classe del broadcast) è registrato, ma non parte.

        Ho provato anche su altri dispositivi il problema persiste. Ho provato a generare la relase, togliere le modalità di sviluppo dal dispositivi, niente.

        • La ringrazio.
          La cosa è molto strana e non dovrebbe dipendere dal fatto che l’applicazione viene chiusa con il task manager. Che cosa fa il suo BroadcastReceiver? Ha provato semplicemente ad installare l’applicazione, verificare che il BroadcastReceiver venga chiamato e quindi restartare il device senza però prima chiudere l’applicazione con il TaskManager. Se anche in questo caso il BroadcastReceiver non viene chiamato significa che il problema è nella implementazione del BroadcastReceiver.

          Saluti
          Massimo

          • Mi sembra doveroso, vista la sua gentilezza, aggiornarla.

            Ho provato con Eclipse, funziona tutto alla perfezione, anche forzando la chiusura dell’app con l’activity in primo piano sullo stack, al riavvio il broadcastreceiver funziona correttamente.

            a questo punto le opzioni sono 2

            la prima è che android studio abbia un bug, la seconda è che l’android studio che io ho installato sul mio pc ha qualcosa che non va, lunedi vado da un amico che ha android studio installato, non lo faccio su un mio altro pc per evitare che magari io commetta qualche sbaglio in fase di installazione.

            Il codice che ho testato uno su android studio l’altro su eclipse è identico, non cambia una virgola.

            Sono piu predisposto a pensare realmente ad un bug di android studio, anzi ne sono convinto, manca solo la prova del 9, in quanto è pieno zeppo di programmatori che lamentano lo stesso problema e postano su stackoverflow.com, chi risponde dice che il codice è giusto e deve funzionare, probabilmente chi ha errore usa android studio e chi risponde usa eclipse.

            Una bella gatta da pelare, eclipse seguira gli aggiornamenti o visto AS si ferma ? oltre cio ormai ero abituato con AS, vista la posta in palio sono costretto a passare ad eclipse, le mie app sono piene zeppe di BroadCastReceiver, e poi a questo punto non è che mi fido piu tanto di AS, per questo problema mi sono giocato 1 giornata di lavoro.

            Se vuole lunedi le faccio un aggiornamento.

            Grazie ancora molto gentile, ho scritto anche ad altri autori dei libri android che ho comprato ma non mi hanno risposto, lei è stato l’unico che si è esposto.

          • Grazie a lei. Il suo caso d’uso non è (fortunatamente 🙂 )molto frequente. Trovo difficile che dipenda pero’ dal tool. Probabilmente è un qualcosa legato a qualche scelta architetturale o magari un bug. Mi faccia sapere se riesce a venirne fuori.

            Saluti
            Massimo

  21. Si il broadCastreceiver funziona correttamente in tutti i casi tranne che nel sopracitato errore dei post precedenti, esso fa partire un’ activity, ho provato anche a modificare il codice del BroadCastreceiver facendole fare altro, invio sms, ma non va.
    infine ho fatto la prova del 9, facendo stampare il log, stessa storia.

    Va tutto bene sino a quando io non killo manualmente l’app.

    Funziona tutto alla perfezione tranne quando:

    Apro l’app
    vado sul tastManager forzo la chiusura app
    riavvio sistema
    al riavvio non succede niente

    ora al posto di lanciare un intent che apre l’activity,
    come da codice sopra riportato in post precedente, faccio inviare un sms.

    Stessa storia, al riavvio non parte, mentre se per esempio il sistema uccide app, o sono io programmaticamente a chiudere app, per esempio dentro il methodo onStop() con finish();, tutto funziona perfettamente, al riavvio ricevo sms.

    Ribadisco che ACTION_BOOT_COMPLETED è dichiarato nel file di configurazione AndroidManifest.xml

    Provato su piu dispositivi.

    Visti degli esempio tali e quali ai miei, sono giunto alla conclusione che il codice non è il problema, probabilmente il mio android Studio ha qualche problema, mi armerò di pazienza e provo con eclipse.

    Provato anche le modifiche dei vari settaggi ide,
    Target sdk version portato da lollipop a precedente 4.4, 4.2 niente da fare,
    modificato anche min sdk version portato da da 2.3.3 a 4.2, 4.4, lollipop 5.0, niente da fare.
    Non penso sia il codice il problema.

    I test li ho eseguiti con un Samsung galaxy grand neo 4.2, su un samsung s2 e se un galaxy tab con gli stessi risultati.

    Il problema si presenta quando l’activity cat -> LAUNCHER principale si trova in testa allo stack e viene killata manualmente dal taskmanager, pare si porti dietro il BroadCastReceiver, anche se esso poi risulta ancora registrato, ma non si avvia. Strano perche come dice lei, se il receive è registrato nel manifest le due cose dovrebbero andare ognuno per conto suo.

    Provo con Eclipse lo dovrei riconfigurare, vediamo se cambia qualcosa ho paura che si tratti di un bug di android Studio, spero di no, ormai non bisticciavo più con questo ide.

  22. chiudo la discussione non vorrei trasformare questo blog in un centro assistenza.

    Ad ogni modo anche con eclipse stesso problema.

    Quando una app viene chiusa forzatamente dall’utente il broadcastReceiver, qualsiasi esso sia, rimane registrato ma non viene eseguito. Solo facendo ripartire l’app il broadcastreceiver ritorna a funzionare, ma, ogni volta che l’app viene forzatamente chiusa il problema persiste.

    Mi viene il dubbio che il problema non sia una questione di permessi, forse se l’app fosse stata caricata dallo store con un certificato il problema si risolverebbe.

  23. Bene,
    non ho più dubbi, non solo il kill dell’app trascina con se i BroadcastReceiver, ma trascina con se anche i service.

    La prova del 9 la ho fatta con diverse app di google. L’app di google AdSense ha un servizio che ogni 15 minuti aggiorna il widget di adsense, se si porta in primo piano sullo stack adsense app e si forza la chiusura il servizio si interrompe, solo riaprendo l’app il servizio viene ripristinato. Al contrario i Service se se ne ferma forzatamente l’esecuzione, basta dichiarare startservice dentro il metodo onDestroy del service per farlo ripartire. Per non sbagliarmi questa volta ho anche fatto lo sniffing della rete, kill app = kill di tutto cio che quella app ha creato broadcastreceiver e service compresi, non ci sono dubbi, ho anche avuto una conferma da un bravo programmatore americano che ha fatto un bellissimo corso dev android su youtube.
    Non si tratta di un bug android, il sistema è pensato così

    Oggi, senza dire niente a nessuno ho osservato diversi parenti e amici smanettoni dello smartphone, purtroppo esiste un widget “applicazioni attive” che quasi tutti hanno su home e lo usano per fermare/killare le app, 3 su 5, io personalmente quando vedo lentezza killo con “applicazioni attive” che ho sempre in home, io per primo lo ho sempre fatto.

    2 soluzioni possibili.
    la prima è evitare che l’utente uccida l’app, chiamando finish() dentro il metodo onStop di ogni activity facendo in modo che al back e navigando fra activity, non sia chiamato il finish() del metodo onStop, un gioco di booleani dovrebbe bastare.

    La seconda la devo provare domani e sembra sulla carta la soluzione migliore, esplorando i permessi uses permission ho notato un bellissimo permesso android.permission.INSTALL_PACKAGES. Non so se è possibile, ma se la strada è percorribile, basterebbe fare una app senza activity dove mettere i service e i receiver e l’altra dove mettere activity e fragment, 2 app, la prima si installa normalmente e la seconda viene installata in background dall’app installata.

    Le restanti soluzioni potrebbero essere i permessi di amministratore che vieta la chiusura app, ma in installazione l’utente potrebbe spaventarsi e comunque c’è un passaggio in piu dove accettare e spuntare amministratore dispositivo.

    Vediamo un po domani se riesco a fare una app con le activity che una volta installata scarica e installa un’altra app senza activity con i receiver e servizi,
    Le app senza le activiti non possono essere killate perche non risultano attive, per killare una app è necessario che sia in testa allo stack.

    secondo giorno di lavoro andato, in cambio però l’utente non potra spegnere i miei broadcastreceiver e i servizi.

    Sempre se volete domani vi aggiorno su come è andata a finire.

    • Mi scuso se ho scambiato questo blog per un centro assistenza android dev, ma ormai, visto che ho fatto 30 faccio 31.

      Conclusione della vicenda.
      è un bug di android 4.4.x
      youtube.com/watch?v=LJys2jLKa3E#t=11

      Oggi un mio amico sul suo telefono 4.3.x ha forzato la chiusura di whatsapp e il servizio è rimasto attivo. Ho fatto la stessa cosa sul mio android 4.4.2 e il servizio di whatsapp non era piu attivo, ho postato un link ad un video che dimostra bug, tolto htt etc per evitare filtro.

      terzo giorno di lavoro andato, è un bun di android 4.4.x
      fine della vicenda.

  24. Ciao, ho acquistato il tuo libro da poco… molto interessante e ben fatto veramente, complimenti! Ho un dubbio però riguardo a delle costanti che ho visto che utilizzi spesso, ovvero:

    public static final String USER_DATA_EXTRA = Const.PKG + “.extra.USER_DATA_EXTRA”;
    oppure
    public static final String LOGIN_ACTION = Const.PKG + “.action.LOGIN_ACTION”;

    Non capisco il loro funzionamento, ne come utilizzarli all’interno del codice che sto costruendo man mano. Forse ho perso qualche pezzo, ma non credo di aver fino ad ora letto nel libro alcuna spiegazione in merito. Potresti gentilmente darmi delle delucidazioni in merito?

    • Ciao Francesco,
      ti ringrazio. Per quello che riguarda la costante Const.PKG si tratta semplicemente di un modo scrivere meno codice in relazione alla definizione di una serie di costanti che dovrebbero, per convenzione, contenere il nome del package dell’applicazione. Per non avere String lunghissime e per non sbagliare ho semplicemente creato delle costanti.
      Spero di aver risposto alla tua domanda
      Saluti
      Massimo Carli

  25. Buonasera Sig. Carli, sto utilizzando il suo libro per imparare a sviluppare app con AndroidStudio. Mi chiedevo dove possa trovare il codice sorgente completo delle app cui si fa riferimento nel suo libro?
    La ringrazio in anticipo
    Cordiali saluti
    Cesare G.

  26. Salve,
    Ho acquistato da poco la sua guida e volevo sapere se e dove siano presenti il codice e in generale il materiale (es. banale: l’icona dell’applicazione UGHO) a cui fa riferimento negli esempi del libro.

    • Buongiorno,
      la ringrazio per l’interesse. Ho appena terminato la scrittura della versione dedicata a Marshmallow che quindi uscira’ tra poche settimane.
      Saluti
      Massimo Carli

Leave a Reply

Your email address will not be published. Required fields are marked *