programmation android l3...

129
Programmation Android L3 informatique Étienne Payet Département de mathématiques et d’informatique Ces transparents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pas d’Utilisation Commerciale - Pas de Modification 3.0 non transcrit. Étienne Payet (DMI) Prog. Android – L3 informatique 1 / 129

Upload: others

Post on 08-Jul-2020

20 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Programmation AndroidL3 informatique

Étienne Payet

Département de mathématiques et d’informatique

Ces transparents sont mis à disposition selon les termes de la Licence Creative Commons Paternité - Pasd’Utilisation Commerciale - Pas de Modification 3.0 non transcrit.

Étienne Payet (DMI) Prog. Android – L3 informatique 1 / 129

Page 2: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 2 / 129

Page 3: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources

http://developer.android.com

Livres : il y en a beaucoup. . .Android Programming : The Big Nerd Ranch Guide (Phillips & Hardy)voir à la BUprivilégiez ceux traitant des dernières versions d’Android

Étienne Payet (DMI) Prog. Android – L3 informatique 3 / 129

Page 4: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Pour pouvoir travailler

Développement :Windows ≥ XP, Mac OS X ≥ 10.5.8 (x86), LinuxJDK ≥ 5,Android SDKau moins une plateforme Android

Recommandé :l’IDE Android Studio (attention : Eclipse+ADT deprecated)

Déploiement :un appareil Android

Étienne Payet (DMI) Prog. Android – L3 informatique 4 / 129

Page 5: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Workflow Android

1. Développement 2. Test 3. Publication

Android StudioÉmulateur ouAppareil mobile

Google Play

Étienne Payet (DMI) Prog. Android – L3 informatique 5 / 129

Page 6: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Voir ici pour une description détaillée

Quelques éléments sont présentés ci-après

Étienne Payet (DMI) Prog. Android – L3 informatique 6 / 129

Page 7: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Applications

Applicationframework

Libraries

Android Runtime

Linux Kernelnoyau Linux 2.6, sécurité, gestionmémoire, gestion processus, . . .

Étienne Payet (DMI) Prog. Android – L3 informatique 7 / 129

Page 8: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Applications

Applicationframework

Libraries

Android Runtimefonctionnalités de la bibliothèqueJava standard, Dalvik VM

Linux Kernelnoyau Linux 2.6, sécurité, gestionmémoire, gestion processus, . . .

Étienne Payet (DMI) Prog. Android – L3 informatique 8 / 129

Page 9: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Applications

Applicationframework

Libraries bibliothèques C/C++

Android Runtimefonctionnalités de la bibliothèqueJava standard, Dalvik VM

Linux Kernelnoyau Linux 2.6, sécurité, gestionmémoire, gestion processus, . . .

Étienne Payet (DMI) Prog. Android – L3 informatique 9 / 129

Page 10: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Applications

Applicationframework

API Java (gestion de fenêtres, detéléphonie, . . . )

Libraries bibliothèques C/C++

Android Runtimefonctionnalités de la bibliothèqueJava standard, Dalvik VM

Linux Kernelnoyau Linux 2.6, sécurité, gestionmémoire, gestion processus, . . .

Étienne Payet (DMI) Prog. Android – L3 informatique 10 / 129

Page 11: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Architecture d’Android

Applicationsdes applications écrites en Java(navigateur Web, contacts, . . . )

Applicationframework

API Java (gestion de fenêtres, detéléphonie, . . . )

Libraries bibliothèques C/C++

Android Runtimefonctionnalités de la bibliothèqueJava standard, Dalvik VM

Linux Kernelnoyau Linux 2.6, sécurité, gestionmémoire, gestion processus, . . .

Étienne Payet (DMI) Prog. Android – L3 informatique 11 / 129

Page 12: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice

Installez sur votre machine un environnement de développement Androidfonctionnel :

JDK

Android Studio (voir http://developer.android.com)

Étienne Payet (DMI) Prog. Android – L3 informatique 12 / 129

Page 13: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 13 / 129

Page 14: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Développement d’une application Android

Code source :écrit en Javacompilé en Dalvik bytecode (.dex)Dalvik bytecode 6= Java bytecode

Configuration :fichier AndroidManifest.xml

Ressources :chaînes de caractères, images, audio, interfaces graphiques, . . .certaines peuvent être décrites en XML

Étienne Payet (DMI) Prog. Android – L3 informatique 14 / 129

Page 15: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Compilation et exécution

Étienne Payet (DMI) Prog. Android – L3 informatique 15 / 129

Page 16: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exécution

Chaque application tourne :

dans son propre processussur sa propre machine virtuelleisolément des autres applications (bac-à-sable de sécurité)

Étienne Payet (DMI) Prog. Android – L3 informatique 16 / 129

Page 17: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

AndroidManifest.xml

Décrit :

les composants de l’application

les permissions requises par l’application (accès à Internet,lecture-écriture dans la liste de contacts, géo-localisation, . . . )

les besoins matériels et logiciels de l’application (appareil photo,Bluetooth, . . . )

· · ·

Étienne Payet (DMI) Prog. Android – L3 informatique 17 / 129

Page 18: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Composants d’une application

Un composant = un point d’entrée potentiel dans l’application

Une application peut lancer un composant d’une autre application

⇒ Plusieurs points d’entrée potentiels(pas de méthode main)

6= application Java classique

Étienne Payet (DMI) Prog. Android – L3 informatique 18 / 129

Page 19: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Composants d’une application

Quatre types de composants :

activités (activities)services (services)fournisseurs de contenu (content providers)récepteurs de diffusion (broadcast receivers)

Étienne Payet (DMI) Prog. Android – L3 informatique 19 / 129

Page 20: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Composants d’une application : AndroidManifest.xml

<activity android:name=".HelloWorldActivity"android:label="@string/app_name">

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

</intent-filter></activity>

Action MAIN = un point d’entrée principal (pas d’informationparticulière à fournir)

Catégorie LAUNCHER = point d’entrée apparaissant dans le lanceur

Étienne Payet (DMI) Prog. Android – L3 informatique 20 / 129

Page 21: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Activité

Un écran avec une interface utilisateur graphique

Structurée par une hiérarchie de vues et de contrôles

des éléments définis par du code Java dans l’activitédes éléments définis dans des fichiers XML (ressources)

Sous-classe de android.app.Activity

Étienne Payet (DMI) Prog. Android – L3 informatique 21 / 129

Page 22: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Activité

Exemple : application EmailUne activité afficherEmails,une activité composerEmail,une activité lireEmail

Une application Photo pourra lancer l’activité composerEmail pour envoyerune photo.

Étienne Payet (DMI) Prog. Android – L3 informatique 22 / 129

Page 23: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Activité : squelette minimal

import android.app.Activity;import android.os.Bundle;

public class HelloWorldActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(...);

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 23 / 129

Page 24: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Activité : cycle de vie

États principaux :

active (active) : l’activité est visible et détient le focus (méthodeonResume)

suspendue (paused) : l’activité est en partie visible et ne détient pas lefocus (méthode onPause)

arrêtée (stopped) : l’activité n’est pas visible (méthode onStop)

Étienne Payet (DMI) Prog. Android – L3 informatique 24 / 129

Page 25: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Activité : cycle de vie

Étienne Payet (DMI) Prog. Android – L3 informatique 25 / 129

Page 26: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Service

Composant qui fonctionne en tâche de fondNe fournit pas d’interface utilisateur (invisible)Sous-classe de android.app.Service

Exemple : musique en tâche de fondUn service pourrait jouer de la musique en tâche de fond pendant que l’uti-lisateur est dans une application différente.

Étienne Payet (DMI) Prog. Android – L3 informatique 26 / 129

Page 27: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Fournisseur de contenu

Permet de gérer et de partager des donnéesSous-classe de android.content.ContentProvider

Exemple : liste de contactsLa liste de contacts de l’utilisateur est gérée par un fournisseur de contenuauquel toute application ayant les droits appropriés peut envoyer des requêtesde lecture/écriture.

Étienne Payet (DMI) Prog. Android – L3 informatique 27 / 129

Page 28: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Récepteur

Permet de réagir à la diffusion de messagesSous-classe de android.content.BroadcastReceiver

Exemples d’annonces systèmeL’écran s’est éteintLa batterie est faible

Étienne Payet (DMI) Prog. Android – L3 informatique 28 / 129

Page 29: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Hello World !

Étienne Payet (DMI) Prog. Android – L3 informatique 29 / 129

Page 30: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Hello World ! (variante 1)

Étienne Payet (DMI) Prog. Android – L3 informatique 30 / 129

Page 31: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Hello World ! (variante 2)

La couleur du texte change à chaqueaffichage

Étienne Payet (DMI) Prog. Android – L3 informatique 31 / 129

Page 32: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 32 / 129

Page 33: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Au préalable

AndroidManifest.xml : application debuggable

Sur l’appareil Android :autoriser Unknown sources(Settings→ Applications)

autoriser USB debugging(Settings→ Applications→ Development)

L’ordinateur doit détecter l’appareil Android(adb devices dans le terminal pour vérifier si connecté)

Étienne Payet (DMI) Prog. Android – L3 informatique 33 / 129

Page 34: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Depuis Android Studio

Comme avec l’émulateur :

bouton Run

choisir l’appareil dans le Device Chooser qui apparaît

Étienne Payet (DMI) Prog. Android – L3 informatique 34 / 129

Page 35: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice

Déployez vos applications Hello World ! sur un appareil Android.

Étienne Payet (DMI) Prog. Android – L3 informatique 35 / 129

Page 36: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 36 / 129

Page 37: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources

Chaînes de caractères, images, audio, interfaces graphiques, . . .

Dossier res/ du projet

Étienne Payet (DMI) Prog. Android – L3 informatique 37 / 129

Page 38: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Structure habituelle du dossier res

MonProjet/

src/MonActivite.java

res/drawable/

icon.pnglayout/

main.xmlvalues/

strings.xml

Étienne Payet (DMI) Prog. Android – L3 informatique 38 / 129

Page 39: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : séparées du code source

Externalisation :

maintenance indépendante du code source

ressources alternatives pour des configurations spécifiques (langues,tailles d’écran, . . . )

Étienne Payet (DMI) Prog. Android – L3 informatique 39 / 129

Page 40: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources alternatives

Étienne Payet (DMI) Prog. Android – L3 informatique 40 / 129

Page 41: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources alternatives

MonProjet/src/

MonActivite.javares/

drawable/icon.png

drawable-hdpi/icon.png

layout/main.xml

layout-land/main.xml

values/strings.xml

values-fr/strings.xml

Étienne Payet (DMI) Prog. Android – L3 informatique 41 / 129

Page 42: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : chaînes de caractères

Fichier strings.xml dans le dossier res/values (et ses variantes)

<resources><string name="app_name">Exercice HelloWorld</string><string name="hello">Hello World!</string>

</resources>

Étienne Payet (DMI) Prog. Android – L3 informatique 42 / 129

Page 43: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : interfaces graphiques

Dans le dossier res/layout (et ses variantes)

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout ...

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/msgText"/>

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 43 / 129

Page 44: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : utilisation dans le code

Classe R :générée automatiquement à la compilationcontient l’ID de chaque ressource

public final class R {public static final class drawable {

public static final int icon=0x7f020000; }

public static final class id {public static final int msgText=0x7f050000; }

public static final class layout {public static final int main=0x7f030000; }

public static final class string {public static final int app_name=0x7f040001;public static final int hello=0x7f040000; }

}

Étienne Payet (DMI) Prog. Android – L3 informatique 44 / 129

Page 45: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : utilisation dans le code

Plusieurs méthodes acceptent un ID de ressource en paramètre

import android.app.Activity;import android.os.Bundle;import android.widget.TextView;

public class HelloWorldActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

String maChaine = getString(R.string.hello);

TextView message = (TextView) findViewById(R.id.msgText);message.setText(R.string.hello);

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 45 / 129

Page 46: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources : utilisation dans d’autres ressources

res/layout/main.xml :

<?xml version="1.0" encoding="utf-8"?><LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/hello"/>

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 46 / 129

Page 47: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Ressources systèmes

Dans le code :

android.R.string.unknownName

Dans une autre ressource :

<?xml version="1.0" encoding="utf-8"?><EditText id="text"

xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:text="@android:string/unknownName"/>

Étienne Payet (DMI) Prog. Android – L3 informatique 47 / 129

Page 48: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Hello World !

L’affichage change en fonction de la langue du terminal :

Étienne Payet (DMI) Prog. Android – L3 informatique 48 / 129

Page 49: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Hello World !

La disposition des drapeaux change en fonction de l’orientation de l’écran :

Étienne Payet (DMI) Prog. Android – L3 informatique 49 / 129

Page 50: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 50 / 129

Page 51: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Description des interfaces graphiques

Deux possibilités :

description déclarative en XML (dossier res/layout/)

en Java

Étienne Payet (DMI) Prog. Android – L3 informatique 51 / 129

Page 52: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Vue

Composant élémentaire des interfaces graphiques sous Android :

instance de la classe View

rectangle où on peut dessiner, sensible aux événements

tous les composants graphiques (widgets) d’Android sont des vues :boutons, étiquettes, zones de texte. . .

Étienne Payet (DMI) Prog. Android – L3 informatique 52 / 129

Page 53: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Organisation hiérarchique des vues

La classe ViewGroup (hérite de View) permet de regrouper des vues

Étienne Payet (DMI) Prog. Android – L3 informatique 53 / 129

Page 54: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Associer une hiérarchie de vues à une activité

Appeler la méthode setContentView :

dans onCreate

paramètre = une référence à la racine de la hiérarchie

Étienne Payet (DMI) Prog. Android – L3 informatique 54 / 129

Page 55: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Layout

C’est une organisation particulière d’un groupe de vues

Sous-classe de ViewGroup

Android fournit plusieurs layouts

Étienne Payet (DMI) Prog. Android – L3 informatique 55 / 129

Page 56: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Quelques layouts fournis par Android

FrameLayout : le plus basique, chaque élément est positionné dans lecoin en haut à gauche, par-dessus les éléments ajoutés avant

usage : affichage d’un seul élément

LinearLayout : les éléments sont positionnés les uns à la suite desautres, de gauche à droite et de haut en bas

TableLayout : les éléments sont positionnés dans un tableau

RelativeLayout : les éléments sont positionnés les uns par rapportaux autres

Étienne Payet (DMI) Prog. Android – L3 informatique 56 / 129

Page 57: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Layout : exemple

res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/hello"/>

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/coucou"/>

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 57 / 129

Page 58: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Layout : taille

Les attributs layout_width et layout_height peuvent contenir :

une taille précise (unités : dp, sp, pt, px, mm, in)

l’une des constantes :

match_parent : prendre toute la place disponible

(fill_parent dans les versions d’Android < 2.2)

wrap_content : ne prendre que la place nécessaire

Étienne Payet (DMI) Prog. Android – L3 informatique 58 / 129

Page 59: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en XML

Chaque fichier XML décrivant l’interface :

doit être placé dans le dossier res/layout

a un identifiant unique :

généré automatiquement(ex : monLayout.xml → R.layout.monLayout)

permet de faire référence au fichier dans le code(ex : setContentView(R.layout.monLayout))

Étienne Payet (DMI) Prog. Android – L3 informatique 59 / 129

Page 60: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en XML

res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent">

<TextViewandroid:layout_width="match_parent"android:layout_height="wrap_content"android:id="@+id/msgText"/>

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 60 / 129

Page 61: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en XML

Attribut id :

associe un identifiant unique à une vue

le signe + dans @+id signifie qu’il s’agit d’un nouveau nom deressource, à créer et à ajouter à la classe R

identifiants fournis par le système :

android:id="@android:id/empty"

Étienne Payet (DMI) Prog. Android – L3 informatique 61 / 129

Page 62: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en XML

import android.app.Activity;import android.os.Bundle;import android.widget.TextView;

public class HelloWorldActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

TextView message = (TextView) findViewById(R.id.msgText);message.setText("Hello, World!");

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 62 / 129

Page 63: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en Java

Pour obtenir le même résultat que précédemment, en Java uniquement :

import android.app.Activity;import android.os.Bundle;import android.widget.TextView;

public class HelloWorldActivity extends Activity {/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

TextView message = new TextView(this);message.setText("Hello, World!");setContentView(message);

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 63 / 129

Page 64: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface en Java : layouts

import android.app.Activity; import android.os.Bundle;import android.widget.LinearLayout;import android.widget.TextView;

public class HelloWorldActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

LinearLayout mLayout = new LinearLayout(this);mLayout.setOrientation(LinearLayout.VERTICAL);

TextView message1 = new TextView(this);TextView message2 = new TextView(this);message1.setText("Hello, World!");message2.setText("Bonjour tout le monde !");

mLayout.addView(message1); mLayout.addView(message2);

setContentView(mLayout);}

}

Étienne Payet (DMI) Prog. Android – L3 informatique 64 / 129

Page 65: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Définition d’une interface : XML ou Java ?

Interface en XML : séparation stricte de la présentation et de lalogique fonctionnelle de l’application

⇒ c’est la meilleure pratique en général

Ce qui est faisable en XML est faisable en Java

À chaque vue, attribut, constante. . . utilisé en XML correspond unevue, un attribut, une constante. . . en Java

Étienne Payet (DMI) Prog. Android – L3 informatique 65 / 129

Page 66: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : attribut XML

Attribut android:onClick de la classe View

res/layout/main.xml<Button ... android:onClick="sayHello" .../>

HelloWorldActivity.javapublic class HelloWorldActivity extends Activity {

private TextView helloLabel;@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setContentView(R.layout.main);helloLabel = (TextView) findViewById(R.id.hello_label);

}public void sayHello(View v) {

helloLabel.setText(R.string.hello);}

}

Étienne Payet (DMI) Prog. Android – L3 informatique 66 / 129

Page 67: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : écouteurs

Écouteur (listener) :

au cœur du mécanisme d’interception des événements

associe un événement à une méthode à appeler lorsque l’événementsurvient

les événements interceptés et les méthodes associées sont prédéfinis

ex : événement onClick → méthode onClick()

Étienne Payet (DMI) Prog. Android – L3 informatique 67 / 129

Page 68: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : écouteurs

res/layout/main.xml<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center_vertical|center_horizontal">

<Buttonandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/mButton"android:text="@string/ok"/>

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 68 / 129

Page 69: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : écouteurs, solution 1

public class MyListener implements OnClickListener {@Overridepublic void onClick(View v) {

Toast.makeText(this, "click", Toast.LENGTH_LONG).show();}

}

public class MyActivity extends Activity {

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);Button b = (Button) findViewById(R.id.mButton);b.setOnClickListener(new MyListener());

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 69 / 129

Page 70: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : écouteurs, solution 2

public class MyActivity extends Activity {

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);Button b = (Button) findViewById(R.id.mButton);b.setOnClickListener(new OnClickListener() {

@Overridepublic void onClick(View v) {

Toast.makeText(MyActivity.this, "click",Toast.LENGTH_LONG).show();

}});

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 70 / 129

Page 71: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion des événements : écouteurs, solution 3

public class myActivity extends Activity implements OnClickListener {

@Overridepublic void onCreate(Bundle savedValues) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);Button b = (Button) findViewById(R.id.mButton);b.setOnClickListener(this);

}

@Overridepublic void onClick(View v) {

Toast.makeText(this, "click", Toast.LENGTH_LONG).show();}

}

Étienne Payet (DMI) Prog. Android – L3 informatique 71 / 129

Page 72: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Dizainier

Étienne Payet (DMI) Prog. Android – L3 informatique 72 / 129

Page 73: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Nuancier RVB

Étienne Payet (DMI) Prog. Android – L3 informatique 73 / 129

Page 74: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Nuancier RVB

Les boutons colorés en haut de l’écran occupent toujours toute lalargeur de l’écran

Le titre des boutons colorés doit toujours être lisible (noir si fond clair,blanc si fond sombre, voir ici)

Lorsque l’appareil est en mode portrait, les labels Actuel, Précédent etPénultième sont affichés pour indiquer la signification de chaquebouton coloré

Bien gérer l’orientation de l’écran : la couleur des boutons, lespourcentages affichés, . . . doivent être identiques avant et après unchangement d’orientation

Étienne Payet (DMI) Prog. Android – L3 informatique 74 / 129

Page 75: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Construire ses propres vues

Créer une classe héritant de View (ou d’une de ses sous-classes)

3 constructeurs :public MyView(Context context, AttributeSet attrs, int defStyle)public MyView(Context context, AttributeSet attrs)

public MyView(Context context)

Le paramètre attrs sert lors de définitions XML d’interfaces

Affichage :

protected void onDraw(Canvas canvas)

Forcer le rafraîchissement :

void invalidate()

Étienne Payet (DMI) Prog. Android – L3 informatique 75 / 129

Page 76: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Construire ses propres vues : exemple

package com.example;

public class MyView extends View {

public MyView(Context context, AttributeSet attrs) {super(context, attrs);...

}

protected void onDraw(Canvas canvas) {int x = getWidth();int y = getHeight();

Paint paint = new Paint();paint.setColor(android.graphics.Color.WHITE);

canvas.drawLine(0, 0, x, y, paint);

super.onDraw(canvas);}

}

Étienne Payet (DMI) Prog. Android – L3 informatique 76 / 129

Page 77: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Scroll : classes ScrollView et HorizontalScrollView

<ScrollViewandroid:layout_width="match_parent"android:layout_height="match_parent" >

<HorizontalScrollViewandroid:layout_width="match_parent"android:layout_height="wrap_content" >

<LinearLayoutandroid:layout_width="wrap_content"android:layout_height="match_parent"android:orientation="horizontal" >

<com.example.MyViewandroid:layout_width="2000dp"android:layout_height="3000dp" />

</LinearLayout>

</HorizontalScrollView>

</ScrollView>

Étienne Payet (DMI) Prog. Android – L3 informatique 77 / 129

Page 78: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Cercles

créer une classe CerclesView

compléter onDraw : dessiner 20cercles gris, position au hasard,rayon croissant, épaisseur dutrait : 5 pixels

un tap sur l’écran efface lescercles et en dessine 20nouveaux

scroll vertical et horizontal

Étienne Payet (DMI) Prog. Android – L3 informatique 78 / 129

Page 79: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Cercles (variante)

Étienne Payet (DMI) Prog. Android – L3 informatique 79 / 129

Page 80: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Cercles (variante)

l’utilisateur ne doit pouvoir entrer que des nombres entiers d’au plus 3chiffres (voir attributs XML android:inputType etandroid:maxLength)

gérer le cas où l’utilisateur a laissé une zone de texte vide

anglais par défaut + proposer une version française

tenir compte des changements d’orientation de l’écran :le nombre et l’épaisseur des cercles ne doivent pas changer après unchangement d’orientation

voir le premier chapitre du cours de M1

zoom?

Étienne Payet (DMI) Prog. Android – L3 informatique 80 / 129

Page 81: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 81 / 129

Page 82: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Listes

créer une instance de ListActivity, qui intègre automatiquement :

une vue, instance de la classe ListView

un adaptateur, instance d’une implémentation de ListAdapter

Étienne Payet (DMI) Prog. Android – L3 informatique 82 / 129

Page 83: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Adaptateurs

réalisent l’interfaçage entre l’affichage (widgets) et les données

pour l’interfaçage avec une ListView : interface ListAdapter

implémentations de ListAdapter, selon la source de données :

ArrayAdapter : données stockées dans un tableau

CursorAdapter : données de type Cursor

SimpleCursorAdapter : sur-couche de CursorAdapter

. . .

Étienne Payet (DMI) Prog. Android – L3 informatique 83 / 129

Page 84: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Cellules à 1 ligne

les données à afficher (tableau de chaînes de caractères) :

res/values/strings.xml<?xml version="1.0" encoding="utf-8"?><resources>

...

<string-array name="systems"><item>Android</item><item>iOS</item><item>BlackBerry</item><item>Bada</item>

</string-array></resources>

Étienne Payet (DMI) Prog. Android – L3 informatique 84 / 129

Page 85: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Cellules à 1 ligne

public class MyListActivity extends ListActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

String[] systems = getResources().getStringArray(R.array.systems);setListAdapter(new ArrayAdapter<String>(this,

android.R.layout.simple_list_item_1, systems));}

@Overrideprotected void onListItemClick(ListView l, View v, int position, long id) {

super.onListItemClick(l, v, position, id);Toast.makeText(this, "item " + id + " clicked", Toast.LENGTH_SHORT).show();

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 85 / 129

Page 86: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Cellules à 2 lignes

public class MyListActivity extends ListActivity {public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);ArrayList<Map<String,String>> list = new ArrayList<Map<String,String>>();

Map<String, String> maplist;maplist = new HashMap<String, String>();maplist.put("ligne1", "Prendre une douche");maplist.put("ligne2", "priorité: 0");list.add(maplist);maplist = new HashMap<String, String>();maplist.put("ligne1", "Faire une sieste");maplist.put("ligne2", "priorité: 2");list.add(maplist);

String[] from = { "ligne1", "ligne2" };int[] to = { android.R.id.text1, android.R.id.text2 };SimpleAdapter adapter = new SimpleAdapter(this, list,

android.R.layout.simple_list_item_2, from, to);setListAdapter(adapter);

}

Étienne Payet (DMI) Prog. Android – L3 informatique 86 / 129

Page 87: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Cellules personnalisées

res/layout/cell_layout.xml :

<?xml version="1.0" encoding="utf-8"?><LinearLayout

xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:layout_height="wrap_content" >

<ImageView android:id="@+id/image"android:layout_width="wrap_content"android:layout_height="fill_parent"android:src="@drawable/icon" />

<TextView android:id="@+id/label"android:layout_width="wrap_content"android:layout_height="wrap_content"android:textSize="20dp" />

</LinearLayout>

Étienne Payet (DMI) Prog. Android – L3 informatique 87 / 129

Page 88: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Cellules personnalisées

public class MyListActivity extends ListActivity {

public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

String[] values = new String[] { "Android", "iOS","Blackberry", "Bada" };

ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.cell_layout, R.id.label, values);

setListAdapter(adapter);}

}

Étienne Payet (DMI) Prog. Android – L3 informatique 88 / 129

Page 89: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Adaptateurs personnalisés

public class MyArrayAdapter extends ArrayAdapter<String> {

private final Context context;

public MyArrayAdapter(Context context, String[] values) {super(context, R.layout.cell_layout, values);this.context = context;

}

public View getView(int position, View convertView, ViewGroup parent){

View cellView = convertView;if (cellView == null) {

LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

cellView = inflater.inflate(R.layout.cell_layout, parent, false);}...

Étienne Payet (DMI) Prog. Android – L3 informatique 89 / 129

Page 90: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Adaptateurs personnalisés

...

TextView textView = (TextView)cellView.findViewById(R.id.label);ImageView imageView = (ImageView)cellView.findViewById(R.id.image);

String s = getItem(position);textView.setText(s);if (s.startsWith("B"))

imageView.setImageResource(R.drawable.icon0);else imageView.setImageResource(R.drawable.icon1);

return cellView;

} // fin de la méthode getView

} // fin de la classe MyArrayAdapter

Étienne Payet (DMI) Prog. Android – L3 informatique 90 / 129

Page 91: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Adaptateurs personnalisés

public class MyListActivity extends ListActivity {

private String tasks[] = { "Prendre une douche", "Faire une sieste" };

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);setListAdapter(new MyArrayAdapter(this, tasks));

}

...

}

Étienne Payet (DMI) Prog. Android – L3 informatique 91 / 129

Page 92: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Tâches

créer une classe Tache :String titreint priorite (∈ [0, 4])

créer un type de cellulepersonnalisé

créer un adaptateur personnalisé

Étienne Payet (DMI) Prog. Android – L3 informatique 92 / 129

Page 93: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Créer un menu pour une activité

dans l’activité, implémenter les méthodes suivantes :

pour créer les éléments du menu :

public boolean onCreateOptionsMenu(Menu menu)

pour réagir aux clics sur les éléments du menu :

public boolean onOptionsItemSelected(MenuItem item)

dans res/menu créer un fichier xml décrivant les items du menu

Étienne Payet (DMI) Prog. Android – L3 informatique 93 / 129

Page 94: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Créer un menu pour une activité : exemple

public class MyActivity extends Activity {...@Overridepublic boolean onCreateOptionsMenu(Menu menu) {

getMenuInflater().inflate(R.menu.optionsmenu, menu);return true;

}

@Overridepublic boolean onOptionsItemSelected(MenuItem item) {

switch(item.getItemId()) {case R.id.action_settings:

...return true;

}return super.onOptionsItemSelected(item);

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 94 / 129

Page 95: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Créer un menu pour une activité : exemple

fichier optionsmenu.xml :

<menu ...>

<itemandroid:id="@+id/action_settings"android:orderInCategory="100"android:title="@string/action_settings"/>

</menu>

Étienne Payet (DMI) Prog. Android – L3 informatique 95 / 129

Page 96: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Menu contextuel pour une activité

dans l’activité, implémenter les méthodes suivantes :

pour créer les éléments du menu :

public boolean onCreateContextMenu(ContextMenu menu,View v,ContextMenuInfo menuInfo)

pour réagir aux clics sur les éléments du menu :

public boolean onContextItemSelected(MenuItem item)

et dans onCreate enregistrer les vues réagissant au menu :

registerForContextMenu(une vue)

Étienne Payet (DMI) Prog. Android – L3 informatique 96 / 129

Page 97: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Menu contextuel pour une activité : exemple

public class MyListActivity extends ListActivity {

private ArrayAdapter<String> adapter;

@Overridepublic void onCreate(Bundle savedInstanceState) {

...adapter = ...;setListAdapter(adapter);registerForContextMenu(getListView());

}

...

Étienne Payet (DMI) Prog. Android – L3 informatique 97 / 129

Page 98: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Menu contextuel pour une activité : exemple

...@Overridepublic void onCreateContextMenu(ContextMenu menu, View v,

ContextMenuInfo menuInfo) {super.onCreateContextMenu(menu, v, menuInfo);getMenuInflater().inflate(R.menu.contextmenu, menu);

}

@Overridepublic boolean onContextItemSelected(MenuItem item) {

AdapterContextMenuInfo menuInfo =(AdapterContextMenuInfo) item.getMenuInfo();

switch(item.getItemId()) {case R.id.action_delete:

adapter.remove(adapter.getItem(menuInfo.position));return true;

}return super.onContextItemSelected(item);

}...

Étienne Payet (DMI) Prog. Android – L3 informatique 98 / 129

Page 99: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Menu contextuel pour une activité : exemple

fichier contextmenu.xml :

<menu ...><item

android:id="@+id/action_delete"android:orderInCategory="100"android:title="@string/action_delete"/>

</menu>

Étienne Payet (DMI) Prog. Android – L3 informatique 99 / 129

Page 100: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Tâches

menus permettant :d’ajouter une tâche (titre et priorité fixés)

de supprimer une tâche sélectionnée

de quitter l’application

utiliser les méthodes de la classe ArrayAdapter :add

remove

pour ajouter et supprimer un élément de la source de données del’adaptateur (l’affichage est rafraîchi automatiquement)

Étienne Payet (DMI) Prog. Android – L3 informatique 100 / 129

Page 101: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Tâches

Étienne Payet (DMI) Prog. Android – L3 informatique 101 / 129

Page 102: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 102 / 129

Page 103: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Navigation entre écrans

un écran = une activité

passage d’un écran à un autre = une activité en démarre une autre

objet de la classe Intent pour le démarrage d’une activité

Étienne Payet (DMI) Prog. Android – L3 informatique 103 / 129

Page 104: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Démarrer une activité de façon explicite

déclarer l’activité à démarrer dans AndroidManifest.xml :

<application ...><activity android:name=".ActiviteADemarrer" ...>

démarrage de l’activité appelée dans l’activité appelante :

Intent intent = new Intent(this, ActiviteADemarrer.class);startActivity(intent);

Étienne Payet (DMI) Prog. Android – L3 informatique 104 / 129

Page 105: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Démarrer une activité et obtenir un retour

identification de l’activité appelée dans l’activité appelante :

private static final int ACTIVITE_A_DEMARRER = 1;

démarrage de l’activité appelée dans l’activité appelante :

Intent intent = new Intent(this, ActiviteADemarrer.class);startActivityForResult (intent, ACTIVITE_A_DEMARRER);

traitement du retour dans l’activité appelante :

@Overrideprotected void onActivityResult (int requestCode,

int resultCode, Intent data) {switch(requestCode) {case ACTIVITE_A_DEMARRER:

switch(resultCode) {case RESULT_OK: ...case RESULT_CANCELED: ...

Étienne Payet (DMI) Prog. Android – L3 informatique 105 / 129

Page 106: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Démarrer une activité et obtenir un retour

dans l’activité appelée :

@Overridepublic void onClick(View v) {

switch (v.getId()) {case R.id.buttonOK:

setResult(RESULT_OK);finish();break;

case R.id.buttonCancel:setResult(RESULT_CANCELED);finish();break;

}}

Étienne Payet (DMI) Prog. Android – L3 informatique 106 / 129

Page 107: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Échange de données entre activités

association d’une clé (chaîne de caractères) à la donnée à échanger

ajouter une donnée à une instance de Intent :

méthode putExtra(clé, donnée)

récupérer une donnée intégrée à une instance de Intent :

intent.getExtras().getXXX(clé) où XXX est le type de la donnée

Étienne Payet (DMI) Prog. Android – L3 informatique 107 / 129

Page 108: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Échange de données entre activités

envoyer des données à l’activité appelée :

startActivity(Intent intent)

startActivityForResult(Intent intent, int requestCode)

méthode getIntent() de la classe Activity

envoyer des données à l’activité appelante :

setResult(int resultCode, Intent data)

onActivityResult(int requestCode, int resultCode, Intent data)

Étienne Payet (DMI) Prog. Android – L3 informatique 108 / 129

Page 109: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice : Tâches

item ajouter (menu option) : lance une activité permettant àl’utilisateur de saisir une nouvelle tâche (titre et priorité) et intégrantun bouton OK et un bouton Annuler

item éditer (menu contextuel) : lance une activité permettant àl’utilisateur de modifier la tâche sur laquelle il a appuyé et intégrantun bouton OK et un bouton Annuler

Étienne Payet (DMI) Prog. Android – L3 informatique 109 / 129

Page 110: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercice

Étienne Payet (DMI) Prog. Android – L3 informatique 110 / 129

Page 111: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Plan

1 Introduction

2 Anatomie d’une application Android

3 Déploiement d’une application

4 Ressources

5 Éléments de base des interfaces graphiques

6 Présentation sous forme de listes

7 Communication entre activités

8 Persistance des données

Étienne Payet (DMI) Prog. Android – L3 informatique 111 / 129

Page 112: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Sauvegarde de données

trois possibilités :

classe SharedPreferences : sauvegarde d’une petite quantité depaires (clé,valeur) dans un fichier spécial (par ex. sauvegarde dumeilleur score d’un jeu)

sauvegarde dans un fichier

sauvegarde dans une base de données relationnelle (méthode décritedans ce chapitre)

voir http://developer.android.com/training/basics/data-storage/index.html

Étienne Payet (DMI) Prog. Android – L3 informatique 112 / 129

Page 113: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

SQLite

système de gestion de bases de données relationnelles

http://www.sqlite.org

Étienne Payet (DMI) Prog. Android – L3 informatique 113 / 129

Page 114: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion d’une base de données

créer une classe adaptateur qui :

encapsule la base de données (instance de SQLiteDatabase)

encapsule une instance de SQLiteOpenHelper

propose des méthodes pour l’ouverture et la fermeture de la base

propose des méthodes pour obtenir, ajouter, supprimer, . . . desdonnées dans la base

Étienne Payet (DMI) Prog. Android – L3 informatique 114 / 129

Page 115: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

classe SQLiteOpenHelper

aide à créer, ouvrir et mettre à jour une base de données SQLite :

public void onCreate(SQLiteDatabase db)

public void onUpgrade(SQLiteDatabase db,int oldVersion, int newVersion)

public SQLiteDatabase getReadableDatabase()

public SQLiteDatabase getWritableDatabase()

Étienne Payet (DMI) Prog. Android – L3 informatique 115 / 129

Page 116: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

public class MyDBAdapter {

public static final int DB_VERSION = 1;public static final String DB_NAME = "clients_database.db";

private static final String TABLE_CLIENTS = "table_clients";public static final String COL_ID = "_id";public static final String COL_NAME = "name";public static final String COL_ADDR = "address";

private static final String CREATE_DB ="create table " + TABLE_CLIENTS + " ("+ COL_ID + " integer primary key autoincrement, "+ COL_NAME + " text not null, "+ COL_ADDR + " text not null);";

private SQLiteDatabase mDB;private MyOpenHelper mOpenHelper; // MyOpenHelper : voir plus bas

Étienne Payet (DMI) Prog. Android – L3 informatique 116 / 129

Page 117: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

...

public MyDBAdapter(Context context) {mOpenHelper = new MyOpenHelper(context, DB_NAME,

null, DB_VERSION);}

public void open() {mDB = mOpenHelper.getWritableDatabase();

}

public void close() {mDB.close();

}

Étienne Payet (DMI) Prog. Android – L3 informatique 117 / 129

Page 118: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Requête de sélection sur une table

méthode query de la classe SQLiteDatabase :

public Cursor query ( String table,String[] columns,String where,String[] whereArgs,String groupBy,String having,String orderBy )

Étienne Payet (DMI) Prog. Android – L3 informatique 118 / 129

Page 119: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Requête de sélection sur une table

la méthode query renvoie une instance de la classe Cursor qui

permet de gérer un ensemble de données fournies par une requête

intègre une gestion optimisée des ressources

Étienne Payet (DMI) Prog. Android – L3 informatique 119 / 129

Page 120: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Gestion d’un curseur

méthodes de la classe Cursor :

navigation dans un curseur : moveToFirst(), moveToLast(),moveToNext(), moveToPrevious(), . . .

informations sur un curseur : getCount(), . . .

extraction de valeurs d’un curseur : getXXX(i) où i est l’indice de lacolonne et XXX est le type de la valeur

fermeture d’un curseur : close()

Étienne Payet (DMI) Prog. Android – L3 informatique 120 / 129

Page 121: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

on suppose écrite une classe Client de la forme :

public class Client {private long id;private String name;private String address;

public Client(long id, String name, String address) { ... }

...}

Étienne Payet (DMI) Prog. Android – L3 informatique 121 / 129

Page 122: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

suite de la classe MyDBAdapter :

...

public Client getClient(long id) throws SQLException {Client cl = null;

Cursor c = mDB.query(TABLE_CLIENTS,new String [] {COL_ID, COL_NAME, COL_ADDR},COL_ID + " = " + id, null, null, null, null);

if (c.getCount() > 0) {c.moveToFirst();cl = new Client(c.getLong(0), c.getString(1), c.getString(2));

}c.close();

return cl;}

Étienne Payet (DMI) Prog. Android – L3 informatique 122 / 129

Page 123: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

...

public List<Client> getAllClients() {List<Client> clients = new ArrayList<Client>();

Cursor c = mDB.query(TABLE_CLIENTS,new String[] {COL_ID, COL_NAME, COL_ADDR},null, null, null, null, null);

c.moveToFirst();while (!c.isAfterLast()) {

clients.add(new Client(c.getLong(0), c.getString(1), c.getString(2)));

c.moveToNext();}c.close();

return clients;}

Étienne Payet (DMI) Prog. Android – L3 informatique 123 / 129

Page 124: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Insertion et modification d’une ligne

on utilise une instance de la classe ContentValues

permet de spécifier les valeurs de la ligne

encapsule une collection de couples (nom de colonne, valeur)

méthode put pour indiquer la valeur d’une colonne

Étienne Payet (DMI) Prog. Android – L3 informatique 124 / 129

Page 125: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

...public long insertClient(String name, String address) {

ContentValues values = new ContentValues();values.put(COL_NAME, name);values.put(COL_ADDR, address);return mDB.insert(TABLE_CLIENTS, null, values);

}

public int updateClient(long id, String name, String address) {ContentValues values = new ContentValues();values.put(COL_NAME, name);values.put(COL_ADDR, address);return mDB.update(TABLE_CLIENTS, values, COL_ID + "=" + id, null);

}

public int removeClient(long id) {return mDB.delete(TABLE_CLIENTS, COL_ID + " = " + id, null);

}

Étienne Payet (DMI) Prog. Android – L3 informatique 125 / 129

Page 126: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Classe adaptateur : exemple

...private class MyOpenHelper extends SQLiteOpenHelper {

public MyOpenHelper(Context context, String name,CursorFactory cursorFactory, int version) {

super(context, name, cursorFactory, version);}@Overridepublic void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_DB);}@Overridepublic void onUpgrade(SQLiteDatabase db,

int oldVersion, int newVersion) {db.execSQL("drop table " + TABLE_CLIENTS + ";");onCreate(db);

}}

} // fin de la classe MyDBAdapter

Étienne Payet (DMI) Prog. Android – L3 informatique 126 / 129

Page 127: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Afficher les données d’une table sous forme de liste

on procède comme précédemment (voir chapitre 6)

public class MyListActivity extends ListActivity {

private MyDBAdapter dbAdapter;

@Overridepublic void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

dbAdapter = new MyDBAdapter(this);dbAdapter.open();

setListAdapter(new MyArrayAdapter(this, dbAdapter.getAllClients()));

}

Étienne Payet (DMI) Prog. Android – L3 informatique 127 / 129

Page 128: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Afficher les données d’une table sous forme de liste

...

@Overridepublic void onDestroy() {

dbAdapter.close();super.onDestroy();

}

} // fin de la classe MyListActivity

Étienne Payet (DMI) Prog. Android – L3 informatique 128 / 129

Page 129: Programmation Android L3 informatiquelim.univ-reunion.fr/.../L3/slides_Android_L3info.pdfArchitectured’Android Applications Application framework Libraries AndroidRuntime LinuxKernel

Exercices

tutoriel Notepad Tutorial sur http://developer.android.com

application Tâches : rendez les tâches persistantes

Étienne Payet (DMI) Prog. Android – L3 informatique 129 / 129