View
2.520
Download
0
Category
Tags:
Preview:
DESCRIPTION
Corso teorico pratico
Citation preview
Corso Android
Android
Corso teorico pratico
Corso Android
WHOAMI
Andrea Putzu[Software Engineer]
Corso Android
Introduzione
✔Strumenti:
✔Java Development Kit 1.5.0 (o superiore)(http://www.oracle.com/technetwork/java/javase/ downloads/index.html)
✔Eclipse (http://www.eclipse.org/downloads/)✔Android SDK (http://developer.android.com/sdk/index.html)
✔Android Developer Tools Eclipse plugin (https://dl-ssl.google.com/android/eclipse/)
Corso Android
Introduzione
✔Cos'è AndroidSistema operativo+middleware+applicazioni
✔insieme di strumenti e librerie per la realizzazione di applicazioni mobili
✔Open (?)✔Utilizza librerie e tecnologie open (Kernel Linux 2.6,
librerie Http Apache,...)✔Open Handset Alliance (OHA)✔Opensource Apache Licence 2.0
Corso Android
Introduzione
Corso Android
Introduzione
✔2007 nasce l'Open Handset Alliance✔2008 HTC G1 (limitazione tastiera fsica)✔10/2008 Android 1.0✔02/2009 Android 1.1✔05/2009 Cupcake (Android 1.5, tastiera virtuale, widget...)✔09/2009 Donut (Android 1.6 Quick search box, PICO
sintetizzatore vocale...)✔10/2009 Eclair (Android 2.0)✔01/2010 Eclair (Android 2.1)✔05/2010 Froyo (Android 2.2 JIT)✔10/2010 Gingerbread (miglioramento prestazoni, SIP)✔01/2011 Honeycomb (Android 3.0 Tablet)✔10/2011 Ice Cream Sandwich (Tablet + Smartphone)
Corso Android
Introduzione
Linguaggi di programmazione✔Java (SDK Java 5)✔Native Development KIT C/C++
✔Non ha la JVM ma la DVM (Dalvik VM)✔DVM ottimizzata per l'esecuzione di applicazioni su
dispositivi con risorse limitate (fle .dex)✔Il fle .dex è ottimizzato anche nella sua dimensione✔Utilizza un meccanismo di generazione di codice detto
register based (java è stack based), il quale comporta un numero inferiore del 30% di istruzioni
Corso Android
Introduzione
✔JIT: si ha un'identifcazione e traduzione di parti di codice da Java a C/C++ con miglioramento delle prestazioni di esecuzione.
✔Ogni applicazione ha un User ID diferente✔Ogni applicazione è eseguita nel suo processo (simile a
Chrome)✔Ogni applicazione ha una propria istanza di VM
Corso Android
Introduzione
Corso Android
Introduzione
Frammentazione✔Le API di un particolare API Level sono disponibili in tutti I
dispositivi che supportano tale versione✔Un device che accede al Market vedrà solo le applicazioni
compatibili
✔Compatibilità Software e Hardware
Corso Android
Introduzione
Schermi
✔Screen size: Dimensione del display in pollici (Small, Normal, Large, Exra large)
✔Aspect ratio: Rapporto tra larghezza e altezza✔Resolution: numero di pixel del display in orizzontale e
verticale✔Density: numero di pixel per unità di lunghezza fsica(Low, Medium, High, Extra High)
✔Density Indipendent: dimensione non dipendente dallapixel (dip o dp) densità
Corso Android
Introduzione
QVGA
HVGA
WVGA
Corso Android
Anatomia di un'applicazione
✔Nuovo progetto su Eclipse✔AndroidManifest.xml✔Debug✔Log:-Verbose Log.v(string tag, string msg)-Debug Log.d(string tag, string msg)-Info Log.i(string tag, string msg)-Warning Log.w(string tag, string msg)-Error Log.e(string tag, string msg)-Assert Log.println(int priority, string tag, string msg)
✔Disabilitare I Log per applicazione in release it.android.andlib.utility.LogUtil
Corso Android
Anatomia di un'applicazione
✔Android Debug Bridge (adb)✔adb shell✔adb install ✔adb uninstall✔…
Corso Android
Componenti e risorse
✔Activity✔Intent e Intent Filter✔Broadcast Intent Provider✔Content Provider✔Services
Corso Android
Componenti e risorse
Activity
✔UI applicazione✔Package android.app✔Lifecycle (onCreate(), …)✔Eseguite all'interno di un processo Linux
Intent [Filter]
✔Chiamano le Activity✔Package android.content✔Permettono di interagire
con servizi del sistema
String uri=“content://contacts/123”Intent intent = new Intent( Intent.
ACTION_GET_CONTENT,uri);
Intent Filter: dichiarazione intent gestiti
Corso Android
Componenti e risorse
Broadcast Intent Receiver
✔Gestione di eventi esterni✔Package android.content✔Registrazione su handler di eventi specifci
Service
✔Package android.app✔Gps, rss...
Corso Android
Componenti e risorse
Content Provider
✔Gestione dati (fle, SQLite)✔Package android.content✔Di default una applicazione non può accedere ad db si un'altra
Corso Android
Componenti e risorse
Risorse
✔Assets✔Res
✔ Drawable-hdpi✔ Drawable-ldpi✔ Drawable-mdpi
✔Layout✔Values✔AndroidManifest.xml
✔Rescompilate e accessibili
tramite la classe R
✔Assetsnon compilate e gestite
attraverso la classe AssetManager (android.res)
Corso Android
Componenti e risorse
Tipo
StringString arrayInteger arrayColorColor Drowable
Stili e temiDimensioni
Cartella
/res/values/res/values/res/values/res/values/res/valueso /res/drawable/res/values/res/values
Costanti
R.string.<chiave>R.array.<chiave>R.array.<chiave>R.color.<chiave>R.drawable.<chiave>
R.style.<chiave>R.dimen.<chiave>
Corso Android
Componenti e risorse
Tipo
AnimatorAnimColor listMenuAssetsDrawableXml genericiRaw
Cartella
animatoranim/res/colormenuassets/res/drawable/res/xml/res/raw
Costanti
R.animatorR.anim
R.menuNessunaR.drawable.<flename>R.xml.<flename>R.raw.<flename>
Corso Android
Componenti e risorse
Layout
✔Defniscono l'aspetto UI✔Editor dedicato✔ID@[package:][+]type/name
Risorse
✔String✔String array✔Integer Array
✔public Resources getResources()-getString( R.string.name)-getStringArray( R.array.name)-getIntAray( R.array.name)
Corso Android
Componenti e risorse
✔Color✔ColorStateList✔Dimension[px, in,mm,pt,dp,sp]
✔Stili
Format e Plurali
✔Like printf%[posizione]$[tipodato][posizione]={1:n_runtime}[tipodato]={int:d,
string:s,foat:f,...}
Corso Android
Componenti e risorse
✔NinePatchDrawable✔PictureDrawable✔RotateDrawable✔ScaleDrawable✔ShapeDrawable
Drawable
✔BitmapDrawable✔ClipDrawable✔ColorDrawable✔GradientDrawable✔InsetDrawable✔LayerDrawable
Corso Android
Componenti e risorse
NinePatchDrawable
Corso Android
Componenti e risorse
Assets
✔Non compaiono nella classe R✔Necessita l'utilizzo della classe AssetManager✔Cartella /assets
Corso Android
Activity e Intent
Corso Android
Activity
Activity
✔Le applicazioni android devono sfruttare al meglio le risorse disponibili e dare una buona percezione d'uso all'utente.
✔Devono rispondere immediatamente alle azioni di un utente.
Corso Android
Activity
Stati
✔Active: Activity in cima allo stack, visibile e con il focus;
✔Paused: Activity non attiva ma visibile, non è sensibile agli eventi generati dagli utenti;
✔Stopped: Activity non attiva e non visibile;
✔Inactive: Activity eliminata o non ancora creata.
Corso Android
Activity
Corso Android
Activity
Ciclo di vita
✔onCreate(): Invocata nella creazione dell'Activity, contiene le informazioni di inizializzazione;
✔onStart(): Visualizzazione Activity;
✔onResume(): l'Activity ha il focus ed è in cima allo stack, è nello stato di running;
✔onPause(): l'Activity non è sensibile agli eventi generati dagli utenti;
Corso Android
Activity
Ciclo di vita
✔onRestart(): simile alla onCreate(), si occupa di ripristinare lo stato;
✔onStop(): l'Activity è inattiva
✔onDestroy(): stato di inattività, l'Activity può essere eliminata.
Corso Android
Activity
Processi
✔Foreground: sono quelli in esecuzione (in cima allo stack);✔Visible: eseguono le attività nello stato di Paused, non interagiscono con l'utente;✔Service: processi non associati ad un interfacia grafca;✔Background: processi non visibili all'utente, sui quali è stato invocato il metodo onStop();✔Empty: processi non legati ad alcun componente predefnito della piattaforma.
Corso Android
Intent
✔Intent: strumento per la collaborazione di due o più componenti
✔IntentFilter
✔IntentResolution
Corso Android
Intent
Intent espliciti
Intent intent = new Intent(TestActivity.this,TestSecondActivity.class); startActivity(intent);
Intent intent= new Intent(); ComponentName comp = new ComponentName(TestActivity.this, TestSecondActivity.class)intent.setComponent(comp);startActivity(intent);
Corso Android
Intent
✔Intent esplicite si usano quando si conosce a priori le action da chiamare;
✔Android si basa sull'utilizzo di intent che permettono la comunicazione tra applicazioni diverse in base alle info defnite nell'AndroidManifest.xmlLate Runtime Binding (LRB)
✔Se l'intent non specifca il componentName di destinazione allora è necessario specifcare il tipo di azione da eseguire: Intent setAction(String action)
Corso Android
Intent
Flags-ex FLAG_ACTIVITY_NEW_TASK(android:process=”new_process”)
Intent e Dati
Specifca del tipo di dato:scheme://host:port/path
Authority= Host + PortScheme: identifca il ContentProvider<data> permette di defnire URI e mime-type
Corso Android
Intent
Category
Defnita nell'IntentFilter<category
android:name="android.intent.category.LAUNCHER" />
Extra
Insieme di info che si possono associare ad un Intent oltra a quelle defnite con setData()[ putExtras(), getExtras() ]
Ex Mail: Intent.EXTRA_MAIL e Intent.EXTRA:SUBJECT
Corso Android
View e Layout
Corso Android
View e Layout
•View
•View Group (pattern GoF Composite)
•Adapter
Corso Android
View e Layout
View
•I componenti visuali estendono: android.view.View•Gli aggregatori estendono: android.view.View•Ogni Activity ha una window•Ogni view chiama la setContentView();•R.java è generato automaticamente
Corso Android
View e Layout
View
•Permetono di visualizzare l'informazione e gestire l'interazione con l'utente•Sono descritte tramite xml (infating)•Sono identifcate tramite in id •Dimensione: (Desiderata (measured),Efettiva)
•Le view contengono informazioni sui padding, mentre I layout sui margini
Corso Android
View e Layout
Widget (android.view.View)
•TextView•Button•CheckBox•RadioButton•ToggleButton•ImageView•AnalogClock•DigitalClock•...
Gestione dello Stato
Classe interna: TextView.SavedState
Corso Android
View e Layout
Corso Android
View e Layout
Delegation Model (GoF Observer):•Un componente esegue un azione a seguito di un evento tramite l'entità Adapter che defnisce le operazioni che la sorgente dell'evento chiamerà per la sua notifca.
•ThreadUI (SingleThread Model) •Focus: a seconda che si usi un device con o senza tastiera possono cambiare le modalità (textarea, button,...)
Corso Android
View e Layout
Linear Layout Relative Layout Table Layout
Grid Layout Tab Layout
Linear Layout
List View
Corso Android
View e Layout
View Group
LayoutParamsMarginLayoutParams
layout_height e layout_widthMATCH_PARENT: la view occupa tutto lo spazio disponibileWRAP_CONTENT: la view occupa lo spazio necessario al
proprio contenuto
layout_marginBottom, layout_marginLeft,layout_marginRight, layout_marginTop
Corso Android
View e Layout
Adapter
Componente che permette di disaccoppiare la sorgente dei dati dal componente responsabile per la loro visualizzazione, (android.widget)
DAO (data access object) interfaccia operazioni CRUD
ListAdapter: strumento per visualizzare informazioni sotto forma di lista scrollabile
Corso Android
Toast
Visualizzazione di messaggi temporanei sullo schermo
public void showToast(View view) {
Toast toast = Toast.makeText(Context context, int resourceId, int duration);
toast.show();}
Context context = getApplicationContext();Toast toast = Toast.makeText(context, "Hello toast!",
Toast.LENGTH_SHORT); toast.show();
Corso Android
Menu
•Sistema (File, Edit, View...)•Option menu (specifci dell'applicazione)•Menu contestuali
package android.viewpublic boolean onCreateOptionsMenu(Menu menu)ret: indica se il menu deve essere visualizzato invocato solo la prima volta che è richiesto il menu
public boolean onPrepareOptionsMenu(Menu menu)invocato prima che di ogni visualizzazione del menu,
necessario per modifcarlo dinamicamente
Corso Android
Menu
Ogni elemento di menu (item) è defnito da:
•Un identifcatore di item (itemId)•Un identifcatore di gruppo (groupId)•Una label (title)•Un ordine
•Si può identifcare ed accedere ad un gruppo di itempublic abstract void setGroupVisible(int group, boolean visible)
Corso Android
Menu
Corso Android
Menu
MenuItem
•Intent•OnMenuClickListner•Callback
public boolean onOptionsItemSelected(MenuItem item) { //... return super.onOptionsItemSelected(item);}
Corso Android
Menu
ContextMenu
È legato alla View ma la sua gestione è afdata all'Activity
public void registerForContextMenu(View view)
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo)
Corso Android
Dialog
•Alert•Progress•Date e time picker
public final void showDialog(int id)protected Dialog onCreateDialog(int id)private Dialog createCustomDialog() { Dialog myDialog = new Dialog(this); //... return customDialog;}
Corso Android
Persistenza
Corso Android
Persistenza
Preferences
•Framework per la gestione delle “preferenze” delle applicazioni
public abstract SharedPreferences getSharedPreferences(String name, int mode)
Default Mode: Context.MODE_PRIVATE
Corso Android
Persistenza
Gestione di fle
Java strandard: Stream•Lettura o scrittura su Filesystem o SD card•Lettura fle nel pacchetto apk
•public abstract FileInputStream openFileInput(String name)
•public abstract FileInputStream openOutputInput(String name)
•Java NIO (New I/O) utilizza i bufer
Corso Android
Persistenza
Gestione di fle
String path = Environment. getExternalStorageDirectory(). getAbsolutePath() + “fleName.ext”;
non: “data/data/packageName/fles/fleName.ext”;
<uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE"/>
Corso Android
Persistenza
SQLite
•DBMS compatto (500KB)•Veloce, semplice e portabile•android.database e android.database.sqlite•public static SQLiteDatabase openDataBase(String path, SQLiteDatabase.CursorFactory cursorFactory, •int flags);•String path = /data/data/<packageName>/database/<nameDB.db>•int flags = CREATE_IF_NECESSARY | OPEN_READWRITE
Corso Android
Persistenza
SQLite
•ExecSQL•delete•Insert•update•replace•query
•cursor (Iterator design pattern)
Corso Android
Persistenza
Content Provider
•Repository di informazioni accessibili da applicazioni diverse attraverso modalità standard
URI: content://autority/path/id•prefsso che identifca il content provider•Content provider (www.contentprovider.com:8080)•/data/users•id dell'entità richiesta(opzionale)
Corso Android
Persistenza
Mime-Type
•Composto da type/subtype (text/html, text/pdf...)•Gestito da IANA (Internet Assigned Numbers Authority)
•Su android i Content Provider si identifcano con:•elenco risorse: vnd.android.cursor.dir/vnd.<name>•singola risorsa: vnd.android.cursor.item/vnd.<name>
Corso Android
Handler
Corso Android
Handler
UI Single Thread•Singolo thread in cui sono serializzate le callback di ui e che regolano il ciclo di vita
•Handler•MessageQueue (per ogni thread)•Message (implementa Parcelable)
defnite in android.os.
Corso Android
Handler
private Handler myHandler;
final TextView outputView = (TextView) findViewById(R.id.outView);
myHandler = new Handler() { public void handleMessage(Message msg) { outputView.setText(msg.obj.toString()); }};
Corso Android
Handler
Thread workerThread = new Thread(new Runnable() {public void run() { try { Message messageToSend = myHandler.obtainMessage(); String message = ...; messageToSend.obj = message; myHandler.sendMessage(messageToSend); } catch (Exception e) { Log.e(LOG_TAG, e.getMessage()); } finally { dismissDialog(WAITING_PROGRESS_DIALOG_ID); }}});
Corso Android
WEB
Corso Android
Web
-HttpClient di Apache (org.apache.http.client)
public abstract HttpResponse execute (HttpUriRequest request)
(command pattern)
HttpResponse ha tra le proprietà:•Entity (streamed, self contained, wrapping)•Statusline (Codice risposta, versione protocollo,
descrizione del corrispondente messaggio)
Corso Android
Web
•Get,Put (multipart),Cookie, Autenticazione.
•Xml parser (pull,dom)-next(), getName(), getText()...
<menu id="fle" value="File"> <popup> <menuitem value="New" onclick="CreateNewDoc()" /> <menuitem value="Open" onclick="OpenDoc()" /> <menuitem value="Close" onclick="CloseDoc()" /> </popup></menu>
Corso Android
Web
•Json parser (javascript object notation)
{"menu": { "id": "fle", "value": "File", "popup": { "menuitem": [ {"value": "New", "onclick": "CreateNewDoc()"}, {"value": "Open", "onclick": "OpenDoc()"}, {"value": "Close", "onclick": "CloseDoc()"} ] }}}
Corso Android
Web
WebWiew
Uri uri = Uri.parse("http://www.google.com");WebView webView = (WebView)
findViewById(R.id.webview);webView.getSettings().setLoadWithOverviewMode(true);webView.getSettings().setUseWideViewPort(true);webView.clearCache(true);webView.loadUrl(uri.toString());
<uses-permission android:name="android.permission.INTERNET"/>
Corso Android
Android
grazie...
Recommended