corso android

73
Corso Android Android Corso teorico pratico

Upload: andrea-putzu

Post on 17-May-2015

2.513 views

Category:

Technology


0 download

DESCRIPTION

Corso teorico pratico

TRANSCRIPT

Page 1: Corso Android

Corso Android

Android

Corso teorico pratico

Page 2: Corso Android

Corso Android

WHOAMI

Andrea Putzu[Software Engineer]

Page 3: Corso Android

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/)

Page 4: Corso Android

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

Page 5: Corso Android

Corso Android

Introduzione

Page 6: Corso Android

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)

Page 7: Corso Android

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

Page 8: Corso Android

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

Page 9: Corso Android

Corso Android

Introduzione

Page 10: Corso Android

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

Page 11: Corso Android

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à

Page 12: Corso Android

Corso Android

Introduzione

QVGA

HVGA

WVGA

Page 13: Corso Android

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

Page 14: Corso Android

Corso Android

Anatomia di un'applicazione

✔Android Debug Bridge (adb)✔adb shell✔adb install ✔adb uninstall✔…

Page 15: Corso Android

Corso Android

Componenti e risorse

✔Activity✔Intent e Intent Filter✔Broadcast Intent Provider✔Content Provider✔Services

Page 16: Corso Android

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

Page 17: Corso Android

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...

Page 18: Corso Android

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

Page 19: Corso Android

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)

Page 20: Corso Android

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>

Page 21: Corso Android

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>

Page 22: Corso Android

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)

Page 23: Corso Android

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,...}

Page 24: Corso Android

Corso Android

Componenti e risorse

✔NinePatchDrawable✔PictureDrawable✔RotateDrawable✔ScaleDrawable✔ShapeDrawable

Drawable

✔BitmapDrawable✔ClipDrawable✔ColorDrawable✔GradientDrawable✔InsetDrawable✔LayerDrawable

Page 25: Corso Android

Corso Android

Componenti e risorse

NinePatchDrawable

Page 26: Corso Android

Corso Android

Componenti e risorse

Assets

✔Non compaiono nella classe R✔Necessita l'utilizzo della classe AssetManager✔Cartella /assets

Page 27: Corso Android

Corso Android

Activity e Intent

Page 28: Corso Android

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.

Page 29: Corso Android

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.

Page 30: Corso Android

Corso Android

Activity

Page 31: Corso Android

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;

Page 32: Corso Android

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.

Page 33: Corso Android

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.

Page 34: Corso Android

Corso Android

Intent

✔Intent: strumento per la collaborazione di due o più componenti

✔IntentFilter

✔IntentResolution

Page 35: Corso Android

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);

Page 36: Corso Android

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)

Page 37: Corso Android

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

Page 38: Corso Android

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

Page 39: Corso Android

Corso Android

View e Layout

Page 40: Corso Android

Corso Android

View e Layout

•View

•View Group (pattern GoF Composite)

•Adapter

Page 41: Corso Android

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

Page 42: Corso Android

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

Page 43: Corso Android

Corso Android

View e Layout

Widget (android.view.View)

•TextView•Button•CheckBox•RadioButton•ToggleButton•ImageView•AnalogClock•DigitalClock•...

Gestione dello Stato

Classe interna: TextView.SavedState

Page 44: Corso Android

Corso Android

View e Layout

Page 45: Corso Android

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,...)

Page 46: Corso Android

Corso Android

View e Layout

Linear Layout Relative Layout Table Layout

Grid Layout Tab Layout

Linear Layout

List View

Page 47: Corso Android

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

Page 48: Corso Android

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

Page 49: Corso Android

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();

Page 50: Corso Android

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

Page 51: Corso Android

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)

Page 52: Corso Android

Corso Android

Menu

Page 53: Corso Android

Corso Android

Menu

MenuItem

•Intent•OnMenuClickListner•Callback

public boolean onOptionsItemSelected(MenuItem item) { //... return super.onOptionsItemSelected(item);}

Page 54: Corso Android

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)

Page 55: Corso Android

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;}

Page 56: Corso Android

Corso Android

Persistenza

Page 57: Corso Android

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

Page 58: Corso Android

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

Page 59: Corso Android

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"/>

Page 60: Corso Android

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

Page 61: Corso Android

Corso Android

Persistenza

SQLite

•ExecSQL•delete•Insert•update•replace•query

•cursor (Iterator design pattern)

Page 62: Corso Android

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)

Page 63: Corso Android

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>

Page 64: Corso Android

Corso Android

Handler

Page 65: Corso Android

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.

Page 66: Corso Android

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()); }};

Page 67: Corso Android

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); }}});

Page 68: Corso Android

Corso Android

WEB

Page 69: Corso Android

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)

Page 70: Corso Android

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>

Page 71: Corso Android

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()"} ] }}}

Page 72: Corso Android

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"/>

Page 73: Corso Android

Corso Android

Android

grazie...