Joshua Hoffman - Should the CTO be Coding? - Codemotion Amsterdam 2019
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
1. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
2. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Andrea Baccega
Founder DroidTech.it
Co-Founder Androidiani.com
@veke87
me@andreabaccega.com
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
3. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Dario Lipari
Android Apps: Modus Operandi, Swapper for root user
Manteiner Hobbybrew – http://hobbybrew.kenai.com
@azatoth77
dario.lipari@gmail.com
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
4. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Un'applicazione modulare è un'applicazione che prevede più
componenti:
●Un ”Core”
●Più ”Plug-in”
Ognuna di queste componenti è un package differente.
●
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
5. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Android dispone di classi native per la comunicazione tra applicazioni
diverse e componenti della stessa applicazione:
Intent e BroadcastReceiver
●
Service e ContentProvider
●
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
6. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Un Intent è semplicemente l'esplicitazione di un'intenzione
●Vorrei avviare un'applicazione
●Vorrei passare da un'Activity ad un'altra all'interno della stessa
applicazione
●Vorrei comunicare il cambiamento di stato di un parametro (es:
notifica geolocalizzazione, cambio livello della batteria, ecc...)
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
7. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
●Permette di passare dati attraverso l'utilizzo della classe Bundle e
all'implementazione di Parcelable e Serializable
●Viene propagato grazie ad un metodo dell'oggetto Context:
sendBroadcast() e tutti i suoi overload
●E' possibile specificare una “action” generica oppure esplicitare a
quale Activity o BroadcastReceiver verrà inviata
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
8. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Come trasportare i dati da chi lancia l'intent a chi li riceve?
Grazie all'oggetto Bundle che è incapsulato all'interno della classe Intent.
Bundle accetta in input una coppia Key-Value, dove Key è una stringa che
rappresenta il nome del parametro e Value è un tipo nativo (String, int,
float, ecc...) oppure un oggetto che implementa Serializable o Parceable.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
9. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Parcelable (interfaccia specifica Android) è più indicato se i dati non
devono essere serializzati:
infatti il modo in cui Parcelable salva e recupera i dati può cambiare ad
ogni implementazione di Android e se l'oggetto Parcelable viene
serializzato (file o db) potrebbe non poter essere più recuperabile.
Serializable è meno performante, ma è indicato per la serializzazione.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
10. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
L'oggetto Bundle è molto flessibile e permette di contenere i dati in ogni
formato ;)
E' possibile utilizzare anche un oggetto JSON che può essere incapsulato
nell'oggetto Bundle in formato stringa.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
11. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Ecco il Manifest del BroadcastReceiver che riceve un intent:
<receiver android:name=”CheckReceiver”>
<intent-filter>
<action
android:name=”org.azasoft.mo.intent.QUERY_CONDITION”/>
</intent-filter>
</receiver>
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
12. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Ecco il codice che lancia un intent:
Intent intent = new Intent(“org.azasoft.mo.intent.QUERY_CONDITION”);
intent.setPackage(“org.azasoft.plugin.batterylevel”);
intent.putExtra(“json”,
_CurrentConditions.get(ConditionIndex).get_bundle());
_context.sendOrderedBroadcast(intent, null, myBroadcastReceiver,
null, Activity.RESULT_FIRST_USER, null, null);
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
13. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Ecco il codice del BroadcastReceiver che riceve l'intent, ma sopratutto ne
riceve i dati:
JSONObject json = new
JSONObject(intent.getExtras().getString(“json”));
…
setResultCode(Activity.RESULT_OK);
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
14. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Un caso reale:
Modus Operandi permette di configurare Android sulla base di situazioni,
composte da condizioni da verificare e azioni da svolgere.
E' un'applicazione modulare che utilizza Intent, BroadcastReceiver,
AlarmManager, Thread e WakeLock per svolgere i suoi compiti.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
15. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
AlarmManager è utilizzato come Scheduler:
In questo modo ad intervalli regolari Modus Operandi può effettuare
il controllo di tutte le Situazioni inserite lanciando un intent per
ogni
Condizione da verificare ed uno per ogni Azione da svolgere.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
16. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Un Thread specifico è lanciato dal BroadcastReceiver che riceve
l'intent
di AlarmManager per effettuare il controllo delle Situazioni ed il lancio
delle Azioni associate.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
17. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Una Condizione, come un'Azione, è composta da un BroadcastReceiver
e da un'Activity.
Il BroadcastReceiver serve per verificare la Condizione, l'Activity serve per
configurarla e passare al Core i dati che questo poi serializzerà su DB e li
ripasserà al BroadcastReceiver per verificarne lo stato quando
necessario.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
18. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Ci sono Condizioni Fals Core lancia un intent
Start check da e per ogni Azione da
Situazione verificare? eseguire
True
Core lancia Intent per
verificare la Condizione
La condizione è Fals Fine
verificata? e Situazione
Tru
e
Passo alla condizione
seguente
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
19. Sviluppo di applicazioni modulari e interoperabilità tra le applicazioni
Tips
E' possibile usare PackageManager per verificare che il plugin che si sta
chiamando è davvero installato oppure no.
Questo evita eventuali problemi legati ad una disinstallazione successiva
di qualche plugin.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
20. I Servizi
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
21. I Servizi – Che Cosa sono?
Il Servizio è un componente dell’applicazione utilizzato per eseguire un’operazione di
●
maggiore durata ed è utilizzzato per la fornitura di funzionalità con altre applicazioni
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
22. I Servizi – Cosa Non sono?
● Il Service NON è:
1. Un processo separato
2. Un Thread
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
23. I Servizi – I Due Tipi di Servizio
●Esistono due tipi di servizio:
•Locale
•Remoto
● Noi tratteremo solamente il Remoto!
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
24. I Servizi – La Ricetta
●Quattro sono i componenti chiave:
•android.app.Service
•android.content.ServiceConnection
•Tag <service> sull’Android Manifest
•Android.os.Binder
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
25. I Servizi – AIDL Interface
● AIDL : Android Interface Definition Language
●
Permette di definire l’interfaccia che condivideranno il client e il service tramite un
linguaggio molto vicino al JAVA.
●
● *IBinder è un interfaccia
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
26. funzionalità
I Servizi – Pro e Contro per la condivisione funzionalità
●
PRO CONTRO
Performante Adatto a pochi scenari
Low Level * Necessità di gestire la connessione remota
● *IBinder è un interfaccia
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
28. I Content Providers – Che Cosa Sono?
●I Content Provider servono ad incapsulare dati e renderli disponibili alle applicazioni
tramite l’interfaccia ContentResolver.
●Di solito i ContentProviders vengono costruiti sopra un Database.
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
29. I Content Providers – Cosa Permettono di Fare?
●Attraverso i Content providers è possibile:
•Condividere dati tra applicazioni
•Leggere dati
•Scrivere dati
•Notificare cambiamenti sui dati
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
30. I Content Providers – La ricetta
●I componenti chiave:
•Uri, UriMatcher
•ContentResolver
•Tag <provider> sull’Android Manifest
•Cursor
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
31. I Content Providers – Pro e Contro per la condivisione dati
PRO CONTRO
●
Molto Facile da implementare Non più facile se Datastore != SQLite
Notifiche Push
Sistema a Uri
Gestione nativo delle permissions
● *IBinder è un interfaccia
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
33. AC2DM – Cosa è?
● Android Cloud to Device Messaging Framework
●Permette l’invio di messaggi leggeri dal proprio server alle proprie applicazioni Android.
●Non è disegnato per inviare grande mole dati bensi per notificare l’esistenza di nuovi dati
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
34. possibilità
AC2DM – Le possibilità del servizio
• Veicolare una richiesta differente per ogni dispositivo
• Inviare informazioni fino a 1024bytes
• Consumi di batteria veramente ridotti
• Real Time notifications
• Zero Costi – Si! E’ gratuito ☺
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
35. AC2DM – La ricetta
• Un Server ( che supporti chiamate HTTPS )
• Una Web App
• Un account Google abilitato
• Piccole Modifiche all’app
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
36. AC2DM – La ricetta
• Un Server ( che supporti chiamate HTTPS )
• Una Web App
• Un account Google abilitato
• Piccole Modifiche all’app
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
37. AC2DM – Il funzionamento – La Registrazione
Applicazione Primo Avvio
Start
Applicazione
Google
Broadcast Servers
Richiesta Google
Registration_id Receiver
Registration_id
Registration
Receiver
Sender Web App
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
38. AC2DM – Il funzionamento – L’invio Dati
●Il Server effettua una richiesta in POST a https://android.apis.google.com/c2dm/send con le
seguenti chiavi (ad Es):
Chiave Valore
registration_id xxxxxxxxx
collapse_key nuovo_utente
data.nome Mario Rossi
data.email mario.rossi@droidtech.it
delay_while_idle x
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
39. AC2DM – Il funzionamento – L’invio dei Dati 2
Send msg ? Google
Servers
Server Ok!
Conversione
A GTALK
Intent
☺
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
40. AC2DM – Il funzionamento – La ricezione
●Una volta che google invia il messaggio al cellulare, l’applicazione verrà svegliata da un
intent in broadcast contenente i seguenti campi extra
Chiave Valore
nome Mario Rossi
email Mario.rossi@droidtech.it
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
41. AC2DM – Possibili Scenari
●Esempi:
•Localizzazione Real-time
•Sync impostazioni WebApp+Android App Real-Time
•Notifiche Real Time
+∞
•
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
42. AC2DM – Pro e Contro per la condivisione dati
PRO CONTRO
●
Free Integrazione su più fronti
Veloce
Multi Livello
● *IBinder è un interfaccia
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
43. AB – E questo è tutto gente
Andrea Baccega – info@droidtech.it – Androidiani.Com Dario Lipari – dario.lipari@gmail.com – @azatoth77
Editor's Notes
Processo: Tranne che diversamente specificato infatti il Service non viene eseguito su un differente processo dall’applicazione chiamante Thread: Il Service, come componente, non deve essere utilizzato come un Thread per evitare un ANR. ( domanda. Chi sa dirmi cos’è ANR? ) Tempo : 40sec
Locale: Update Meteo ogni ora Remoto: Player Musicale Android Tempo minore 3:37
Service: - Classe rappresentante il servizio vero e proprio ServiceConnection: - Interfaccia per monitorare lo stato di un service. Attraverso i suoi callbacks onServiceConnected e ..Disconnected abbiamo la possibilità di sapere quando possiamo interagire con il service remoto <service>: Possibilità di specificare: Service su differente processo Permission: Per farlo partire e quindi permettere di bindarsi. Binder: - Classe Base per effettuare RPC ( Remote Procedure Calls ) . La maggior parte degli sviluppatori non estenderà questa casse direttamente ma utilizzerà il tool aidl del pacchetto sdk android
Service: - Classe rappresentante il servizio vero e proprio ServiceConnection: - Interfaccia per monitorare lo stato di un service. Attraverso i suoi callbacks onServiceConnected e ..Disconnected abbiamo la possibilità di sapere quando possiamo interagire con il service remoto Binder: - Classe Base per effettuare RPC ( Remote Procedure Calls ) . La maggior parte degli sviluppatori non estenderà questa casse direttamente ma utilizzerà il tool aidl del pacchetto sdk android
PRO - Low level poichè si ha maggiore controllo sul flusso dati e sulla connessione CONTRO - Pochi scenari: non adatto a lavorare
Scrivere - Aggiornamento dati - Inserimento Dati Notifiche - Applicazioni Esterne possono registrarsi per una notifica. - Polling vs Push
Uri e UriMatcher: - Ogni ContentProvider risponde ad alcuni URI specificati nel tag provider - Uri identifica l’uri della richiesta - UriMatcher possiamo smistare tale richiesta ContentResolver: - Permette alle applicazioni di accedere ai content providers - Si occupa di risolvere la richiesta - E direzionarla nel provider giusto ( se esiste ) TAG - Struttura uri - Authority ( anche piu di una ) - Permissions - Lettura - Scrittura Cursor: - Classe base quando si lavora con DB - Cursore browsing righe DB
E’ possibile inviare anche lo stesso messaggio a differenti utenti Nei 1024 bytes è compreso un overhead Viene utilizzata la stessa connessione di gtalk
E’ necessaria una web app che permetta di fare lo storing degli utenti ai quali mandare la notifica Per inviare messaggi tramite ac2dm è necessario form + abilitazione
E’ necessaria una web app che permetta di fare lo storing degli utenti ai quali mandare la notifica Per inviare messaggi tramite ac2dm è necessario form + abilitazione
Reg_id : sapete gia Data.<*> serve per mandare il valore di key Delay_while_idle se incluso indica che il messaggio può aspettare il risveglio del telefono Collapse_key serve per raggruppare piu messaggi sotto un certo gruppo. Se il telefono è in idle e piu messaggi dello stesso gruppo devono essere recapitati, in realtà solamente uno per gruppo arriverà al terminale La richiesta deve essere autentificata
E’ necessaria una web app che permetta di fare lo storing degli utenti ai quali mandare la notifica Per inviare messaggi tramite ac2dm è necessario form + abilitazione
Broadcast spiegati da dario nella prima parte del talk.