Cours android

Cours d’apprentissage langage programmation application Android


Télécharger Cours d’apprentissage langage programmation application Android

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


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

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

Ressources

Livres : il y en a beaucoup. . .

Android Programming : The Big Nerd Ranch Guide (Phillips & Hardy) voir à la BU

privilégiez ceux traitant des dernières versions d’Android

Pour pouvoir travailler

Développement :

Windows ? XP, Mac OS X ? 10.5.8 (x86), Linux

JDK ? 5,

Android SDK

au moins une plateforme Android Recommandé :

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

Déploiement :

un appareil Android

Workflow Android

1. Développement

2. Test

3. Publication

Android Studio

Émulateur ou Appareil mobile

Google Play


Voir icipour une description détaillée Quelques éléments sont présentés ci-après Applications

Application framework

Libraries

Android Runtime

 

noyau Linux 2.6, sécurité, gestion mémoire, gestion processus, . . .

Applications

Application framework

Libraries

 

fonctionnalités de la bibliothèque Java standard, Dalvik VM

noyau Linux 2.6, sécurité, gestion mémoire, gestion processus, . . .

Applications

Application framework

 

bibliothèques C/C++

fonctionnalités de la bibliothèque Java standard, Dalvik VM

noyau Linux 2.6, sécurité, gestion mémoire, gestion processus, . . .

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

bibliothèques C/C++

fonctionnalités de la bibliothèque Java standard, Dalvik VM

noyau Linux 2.6, sécurité, gestion mémoire, gestion processus, . . . des applications écrites en Java (navigateur Web, contacts, . . . )

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

bibliothèques C/C++

fonctionnalités de la bibliothèque Java standard, Dalvik VM

noyau Linux 2.6, sécurité, gestion mémoire, gestion processus, . . .


Exercice

Installez sur votre machine un environnement de développement Android fonctionnel :

JDK

Android Studio (voir )

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

Développement d’une application Android

Code source :

écrit en Java

compilé en Dalvik bytecode (.dex) Dalvik bytecode 6= Java bytecode

Configuration :  fichier

Ressources :

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

certaines peuvent être décrites en XML

Compilation et exécution

 

Exécution

Chaque application tourne :

dans son propre processus sur sa propre machine virtuelle isolément des autres applications (bac-à-sable de sécurité)

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

 ···

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

Composants d’une application

Quatre types de composants :

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

Composants d’une application :

 

particulière à fournir)

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

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

Activité

Activité : squelette minimal

 

Activité : cycle de vie

États principaux :

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

 suspendue (paused) : l’activité est en partie visible et ne détient pas le focus (méthode onPause)  arrêtée (stopped) : l’activité n’est pas visible (méthode onStop)

Activité : cycle de vie

 

Service

Composant qui fonctionne en tâche de fond

Ne fournit pas d’interface utilisateur (invisible)

Sous-classe de .Service

Exemple : musique en tâche de fond

Un service pourrait jouer de la musique en tâche de fond pendant que l’utilisateur est dans une application différente.

Fournisseur de contenu

Permet de gérer et de partager des données

Sous-classe de android.content.ContentProvider

Exemple : liste de contacts

La liste de contacts de l’utilisateur est gérée par un fournisseur de contenu auquel toute application ayant les droits appropriés peut envoyer des requêtes de lecture/écriture.

Récepteur

Permet de réagir à la diffusion de messages

Sous-classe de android.content.BroadcastReceiver


 

(variante 1)

 

(variante 2)

La couleur du texte change à chaque

affichage


Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques



Présentation sous forme de listes

Communication entre activités

Persistance des données

Au préalable

  : 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é)

Depuis Android Studio

Comme avec l’émulateur :

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

Exercice

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

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

Ressources

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

Dossier res/ du projet

Structure habituelle du dossier res

 

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

Ressources alternatives

 

Ressources alternatives

 

Ressources : chaînes de caractères

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

 

Ressources : interfaces graphiques Dans le dossier res/layout (et ses variantes)

 

Ressources : utilisation dans le code

 

Ressources : utilisation dans le code

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

 

Ressources : utilisation dans d’autres ressources

:

 

Ressources systèmes Dans le code :

 

Dans une autre ressource :

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

<EditText id="text" xmlns:android="; android:layout_width="match_parent" android:layout_height="match_parent" android:text="@android:string/unknownName"/>

Exercice : Hello World!

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

 

Exercice : Hello World!

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

 

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

Description des interfaces graphiques

Deux possibilités : description déclarative en XML (dossier res/layout/) en Java

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

Organisation hiérarchique des vues

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

 

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

Layout

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

Sous-classe de ViewGroup

Android fournit plusieurs layouts

Quelques layouts fournis par Android

 FrameLayout : le plus basique, chaque élément est positionné dans le coin 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 des autres, 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 rapport aux autres

Layout : exemple

 

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


Chaque fichier XML décrivant l’interface :

doit être placé dans le dossier res/layout a un identifiant unique :

généré automatiquement

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


 

Attribut id :

associe un identifiant unique à une vue

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

   

Définition d’une interface en Java

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

 

Définition d’une interface en Java : layouts

import .Activity; import .Bundle; import android.widget.LinearLayout; import android.widget.TextView; public class HelloWorldActivity extends Activity {

@Override public 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);

}

}

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

 Interface en XML : séparation stricte de la présentation et de la logique 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 une vue, un attribut, une constante. . . en Java

Gestion des événements : attribut XML

Attribut android:onClickde la classe View

 

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énement survient  les événements interceptés et les méthodes associées sont prédéfinis ex : événement onClick? méthode onClick()

Gestion des événements : écouteurs

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

 

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

 

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

 

Dizainier



 

Nuancier RVB

 

Nuancier RVB

Les boutons colorés en haut de l’écran occupent toujours toute la largeur 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 et Pénultième sont affichés pour indiquer la signification de chaque bouton coloré

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


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

Construire ses propres vues : exemple

 

Scroll : classes ScrollView et HorizontalScrollView

 

créer une classe CerclesView compléter onDraw : dessiner 20 cercles gris, position au hasard, rayon croissant, épaisseur du trait : 5 pixels  un tap sur l’écran efface les cercles et en dessine 20 nouveaux  scroll vertical et horizontal

(variante)

 

(variante)

l’utilisateur ne doit pouvoir entrer que des nombres entiers d’au plus 3 chiffres (voir attributs XML android:inputType et android: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 un changement d’orientation voir le premier chapitre du cours de M1 zoom ?


Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

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

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

Cellules à 1 ligne

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

 

Cellules à 1 ligne

 

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>(); ("ligne1", "Prendre une douche"); ("ligne2", "priorité: 0"); (maplist); maplist = new HashMap<String, String>(); ("ligne1", "Faire une sieste"); ("ligne2", "priorité: 2"); (maplist);

String[] from = { "ligne1", "ligne2" };

int[] to = { .text1, .text2 }; SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, from, to);

setListAdapter(adapter);

}

Cellules personnalisées

:

 

Cellules personnalisées

 

     

Exercice : Tâches

créer une classe Tache :

String titre int priorite (? [0,4])

créer un type de cellule personnalisé  créer un adaptateur personnalisé

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

Créer un menu pour une activité : exemple

 

Créer un menu pour une activité : exemple

fichier :

 

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)


   

fichier :

 

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 de l’adaptateur (l’affichage est rafraîchi automatiquement)

Exercice : Tâches

 

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

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é

Démarrer une activité de façon explicite

 

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 :

@Override protected voidonActivityResult(int requestCode, int resultCode, Intent data) {

switch(requestCode) { case ACTIVITE_A_DEMARRER: switch(resultCode) { case RESULT_OK: case RESULT_CANCELED:



Démarrer une activité et obtenir un retour

dans l’activité appelée :

 

É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

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

Exercice : Tâches

 item ajouter (menu option) : lance une activité permettant à l’utilisateur de saisir une nouvelle tâche (titre et priorité) et intégrant un 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égrant

un bouton OK et un bouton Annuler

Exercice

 

Plan

Introduction

Anatomie d’une application Android

Déploiement d’une application

Ressources

Éléments de base des interfaces graphiques

Présentation sous forme de listes

Communication entre activités

Persistance des données

Sauvegarde de données

trois possibilités :

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

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

voir

SQLite

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

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, . . . des données dans la base

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

Classe adaptateur : exemple

public class MyDBAdapter {

public static final int DB_VERSION = 1; public static final String DB_NAME = "";

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

Classe adaptateur : exemple

 

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 )

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

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 la colonne et XXX est le type de la valeur fermeture d’un curseur : close()


on suppose écrite une classe Client de la forme :

 

suite de la classe MyDBAdapter :

   

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

Classe adaptateur : exemple

 

Classe adaptateur : exemple

 

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

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

 

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

 

Exercices tutoriel sur

application Tâches : rendez les tâches persistantes



38