Programmazione Android - wpage.unina.itwpage.unina.it/m.faella/Didattica/GDD/slides/develop4.pdf ·

35
Programmazione Android

Transcript of Programmazione Android - wpage.unina.itwpage.unina.it/m.faella/Didattica/GDD/slides/develop4.pdf ·

Programmazione Android

processi Android

Tipi di processi

● Activity: una “schermata” di UI

● Service: un'operazione in background

● ad es., scaricare un file

● Content Provider: un fornitore di dati

● ad es., la rubrica del telefono

● Broadcast Receiver: un osservatore di eventi di sistema

Attività e servizi

● Una attività (activity) alla volta è in primo piano

● le altre sono “sospese”● le attività sono classi che estendono Activity

● I servizi (services) eseguono solo in background

● senza UI

Canali di comunicazione

Intenti

● Messaggi finalizzati ad avviare un'applicazione

● Un intento può essere:

● esplicito, se indica il nome dell'attività da avviare

● implicito, se indica solo il tipo di azione da compiere

● Nel secondo caso, l'OS cercherà e lancerà l'applicazione che ritiene più adatta

● Gli intenti sono istanze della classe android.content.Intent

Un intento esplicito

All'interno di una classe che estende Activity,avviamo un'altra activity della stessa applicazione:

Intent intent = new Intent(this, DialogActivity.class);

startActivity(intent);

a questo punto, il chiamante viene sospeso (paused o stopped)

Filtri d’intento

● Le applicazioni dichiarano nel manifest quali intenti impliciti vogliono ricevere, impostando dei filtri d'intento (intent filter)

● I filtri servono a dichiarare che tipo di servizio offre un componente

● I filtri non sono necessari per ricevere intenti espliciti, che sono comunque consegnati al componente (classe) nominato nell'intento

Il filtro MAIN

● Un filtro speciale serve ad indicare che una certa attività è l'entry point di una applicazione

● Tale filtro deve avere azione MAIN e categoria LAUNCHER:

<intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /></intent-filter>

Creare un’attività

Estendere la seguente classe:

public class Activity{ protected void onCreate(Bundle savedInstanceState)

... altri 50 metodi ...}

Il Manifest

● Alla radice di ogni apk deve trovarsi AndroidManifest.xml

● Contiene una serie di dichiarazioni:

● Le activity presenti

● I service presenti

● I permessi richiesti

● Attributi vari

Esempio di Manifest

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.badlogic.androidgames.mrnom" android:versionCode="1" android:versionName="1.0">

<application android:icon="@drawable/icon" android:label="Mr. Nom"> <activity android:name="MrNomGame" android:label="Mr. Nom" android:configChanges="keyboard|keyboardHidden|orientation" android:screenOrientation="portrait"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application>

<uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-sdk android:minSdkVersion="3" android:targetSdkVersion="8"/></manifest>

nome della classe

l’ambiente di sviluppo

Android Studio

● versione modificata di IntelliJ

● richiede Java v7 o superiore (ma il linguaggio è 7)

● comprende un emulatore di device

opzionalmente:

● emulatore più sofisticato: Genymotion

Android Studio

● MAC, Windows, Linux

● Componenti:

○ gradle (build manager)

○ SDK manager (versioni di Android)

○ AVD manager (Android Virtual Devices: emulatori)

○ una GUI per creare layout

Installazione

Scaricare e installare Android Studio

Scaricare una o più versioni di Android SDK

nel SDK manager (Tools -> Android)

Creare un Virtual Device

nel AVD manager (Tools -> Android)

scegliere dimensione schermo e versione Android

Configurazione device

1. sul telefono attivare il menu sviluppatori

a. cliccare 7 volte su “Build number/Numero build”, in “Info sul telefono” -> “Informazioni sul

software”

2. sul telefono attivare “USB debugging” dal menu per sviluppatori

3. collegare il telefono in modalità “invio immagini” (PTP) e non “MTP”

in caso di problemi, provare il collegamento con il comando “adb devices”

Android Debug Bridge

Comando “adb”

Alcuni comandi:

adb devices elenco device (reali e virtuali)

adb shell apre una shell sul device

adb logcat elenca il log del device

struttura di un package

Struttura di un package

Le applicazioni sono strutturate secondo un sistema di directory fisso:

/ manifest, bytecode, risorse compilate

/res risorse standard

/assets risorse non standard

/lib librerie

/META-INF certificati

Risorse e asset

● Risorse standard (cartella res):● layout per GUI● immagini bitmap● icone

nomi standard, struttura cartelle standard

● Risorse non standard (cartella assets):● effetti sonori● musiche● descrizione dei “livelli” del gioco

Risorse standard

res/ drawable/ aereo.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml colors.xml costanti.xml

AndroidBuildProcess

Android asset packaging tool

Inter-Process Communication

Dalvik executable

Risorse standard

res/ drawable/ aereo.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml colors.xml costanti.xml

Accedere alle risorse

All’interno di una Activity:

Resources res = this.getResources();

L’oggetto “res” ha metodi per accedere alle risorse tramite un’identificativo

La classe R (generata automaticamente) contiene gli identificativi:

Drawable disegno = res.getDrawable(R.drawable.aereo);

Risorse grafiche (drawable)

Immagini bitmap in formato png, jpg o gif

oppure file xml che puntano ad immagini bitmap

Risorse stringa

res/ drawable/ aereo.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml colors.xml costanti.xml

Risorse stringa

Il file string.xml contiene un elenco di stringhe, associate a nomi

Utile per la localizzazione (multi-lingua)

<?xml version="1.0" encoding="utf-8"?><resources> <string name="hello">Hello World!</string> <string name="app_name">AndroidGameFrameWork</string></resources>

In Java:String hello = res.getString(R.string.hello);

In altri file xml:@string/hello

Localizzazione

res/ values/ strings.xml values-es/ strings.xml values-it/ strings.xml

codice ISO del paese

Altre costanti

res/ drawable/ aereo.png layout/ main.xml info.xml mipmap/ icon.png values/ strings.xml colors.xml costanti.xml

Costanti intere

in costanti.xml (il nome del file è arbitrario):

<?xml version="1.0" encoding="utf-8"?><resources> <integer name="max_speed">75</integer> <integer name="min_speed">5</integer></resources>

In Java:

int maxSpeed = res.getInteger(R.integer.max_speed);

Altri tipi di risorse

● dimensioni: in pixel, millimetri, etc.

● array di interi

● array di Drawable

● immagini animate

● layout per GUI

● descrizioni di menu

Accedere agli asset

Accedere all’immagine assets/sfondo.png:

AssetManager assets = myActivity.getAssets();

InputStream in = assets.open(“sfondo.png”);

Bitmap bitmap = BitmapFactory.decodeStream(in);

Nota: è necessario gestire delle eccezioni verificate

Immagini come asset o come risorse?

Bitmap

BitmapDrawableBitmapFactory

Drawable

ResourceManager

res/drawable/aereo.png

InputStream

AssetManager

assets/aereo.png

Immagini come asset o come risorse?

res/drawable/aereo.pngassets/aereo.png

Più facili da spostare in memoria esterna (SD card)

Meno limiti di spazio

Supporto built-in a risoluzioni e densità multiple