Corso Android

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