0% ont trouvé ce document utile (0 vote)
332 vues107 pages

Cours Dev Mobile ENSA 2021 FomrmationContinue

Ce document décrit les concepts de base du développement mobile Android, notamment la structure d'un projet Android, les interfaces graphiques, les intents, la persistance de données et la sécurité. Le document introduit également le monde mobile, l'écosystème Android, la machine virtuelle Dalvik et Android Studio.

Transféré par

Ucef Brouki
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
332 vues107 pages

Cours Dev Mobile ENSA 2021 FomrmationContinue

Ce document décrit les concepts de base du développement mobile Android, notamment la structure d'un projet Android, les interfaces graphiques, les intents, la persistance de données et la sécurité. Le document introduit également le monde mobile, l'écosystème Android, la machine virtuelle Dalvik et Android Studio.

Transféré par

Ucef Brouki
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

DÉVELOPPEMENT MOBILE ANDROID

Pr. Youssef GAHI

18/09/2017

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 1


OBJECTIFS DÉVELOPPEMENT ANDROID

01 > STRUCTURE D’UN PROJET


ANDROID

02 > INTERFACES GRAPHIQUES

03 > LES INTENTS

04 > PERSISTANCE DE DONNÉES

05 > SÉCURITÉ

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 2


INTRODUCTION AU MONDE MOBILE

¤ Un périphérique mobile c'est quoi ?

> Un écran très petit (par rapport à un PC portable)


> Pas de clavier/souris (clavier applicatif)

è L’interface graphique devra être la plus simple possible

> Ressources restreinte


+ Pas de disque dur mais une ROM (Max 256 Go)
+ Fonctionne sur batterie (Max 6h autonomie)
+ Moyens de communication variés: Wifi, Bluetooth, GSM…

Il faut faire très attention lors de la conception et la


réalisation des applications mobiles à cause des
ressources limités

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 3
INTRODUCTION AU MONDE MOBILE

¤ Secteur en pleine explosion


> juillet 2011: 550 000 utilisateurs actifs
> décembre 2011: 700 000 utilisateurs actifs
> sept. 2012: 1.3 millions utilisateurs actifs
> avril 2013: 1.5 millions utilisateurs actifs
> Août 2017: 2 billions d’utilisateurs actifs

¤ Tendance à remplacer les ordinateurs fixes et même portables dans


le futur.

¤ Une grande population à cibler lors de la soumission des applications


> L’approche UX

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 4
INDISPENSABLE

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


UN MODE DE VIE

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 6


LE MONDE MOBILE A ATTAQUÉ TOUS LES SECTEURS

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 7


01 STRUCTURE D’UN PROJET
ANDROID

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


LE PREMIER TÉLÉPHONE ANDROID: HTC DREAM (SEP 2008)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 9


RELEASES ANDROID

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 10
IMPORTANT A CONSIDÉRER LORS DU CHOIX DU NIVEAU API

¤ Lors de la création d’un nouveau projet Android, il est obligatoire de préciser la version
minimale à supporter.
¤ Les versions récentes de l’API Android ont connu un changement important que les
versions antérieurs ne supportent pas forcement.
¤ L’installation des versions récentes d’Android est fortement lié aux modèles des
téléphones.
¤ Population des utilisateurs Android par niveau API
> API 16 è 99.2 % des téléphones Android
> API 18 è 91.4 % des téléphones Android
> API 21 è 71.3 % des téléphones Android
> API 23 è 39.3 % des téléphones Android
> API 25 è 1.5 % des téléphones Android

Il est important de faire attention lors du choix des


composants (techniques) à utiliser pour cibler le
maximum des appareils

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 11
ÉCOSYSTÈME ANDROID

¤ L’écosystème d'Android s'appuie sur deux piliers:


> Le langage Java
> Le SDK qui permet d'avoir un environnement de développement facilitant
la tâche du développeur
¤ Le kit de développement donne accès à des exemples, de la
documentation mais surtout à l'API de programmation du système et
à un émulateur pour tester ses applications.
¤ Stratégiquement, Google utilise la licence Apache pour Android ce
qui permet la redistribution du code sous forme libre ou non et d'en
faire un usage commercial.
¤ Le plugin Android Development Tool permet d'intégrer les
fonctionnalités du SDK à Eclipse. Il faut l'installer comme un plugin
classique en précisant l'URL du plugin. Ensuite, il faut renseigner
l'emplacement du SDK (préalablement téléchargé et décompressé)
dans les préférences du plugin ADT ou dans Android Studio.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 12
ANDROID OS

¤ Android est en fait un système de la famille des Linux, pour une fois
sans les outils GNU. L'OS s'appuie sur:
> un noyau Linux (et ses drivers)
> un couche d'abstraction pour l'accès aux capteurs (HAL)
> une machine virtuelle: Dalvik Virtual Machine (avant Lollipop)
> un compilateur de bytecode vers le natif Android Runtime (pour
Lollipop)
> des applications (navigateur, gestion des contacts, application de
téléphonie...)
> des bibliothèques (SSL, SQLite, OpenGL ES, etc...)
> des API d'accès aux services Google
¤ Anatomie d'un déploiement:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 13
DAVLIK VS ART

¤ [Dalvik] est le nom de la machine virtuelle open-source utilisée sur les


systèmes Android. Cette machine virtuelle exécute des fichiers .dex,
plus ramassés que les .class classiques. Ce format évite par exemple
la duplication des String constantes. La machine virtuelle utilise elle-
même moins d'espace mémoire et l'adressage des constantes se fait
par un pointeur de 32 bits.

¤ [Dalvik] n'est pas compatible avec une JVM du type Java SE ou


même Java ME. La librairie d'accès est donc redéfinie entièrement
par Google.

¤ A partir de Lollipop, Android dispose d'ART (Android Runtime) qui


compile l'application au moment du déploiement (Ahead-of-time
compilation).
¤ Just In Time vs Ahead of Time

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 14
ECLISPE ADT / ANDROID STUDIO

¤ Deux plateformes supportaient la création de projets Android: Eclipse et Android Studio

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 15
ECLIPSE ADT N’EST PLUS UNE PLATEFORME SUPPORTÉ

¤ Plusieurs développeurs android utilisent toujours l’Eclipse ADT

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 16
INSTALLATION ANDROID STUDIO

¤ Android Studio est une plateforme très riche qui permet de créer des projets Android
pour tout type d’appareils très rapidement

¤ Android Studio est disponible pour les plateformes Windows, MAC et Linux. Il est
téléchargeable depuis le lien suivant:
> https://developer.android.com/studio/index.html

¤ Android studio fournit une plateforme d’émulation très puissante pour tester
l’application sur plusieurs configurations.

¤ Android studio fournit des mécanisme pour mesurer la performance des applications:
fuites mémoire, consommation CPU et batterie…

¤ Android studio fournit un support et integration rapides des librairies et produit Google

Un bon développeur est celui qui maitrise ses outils


de développements.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 17
UN NOUVEAU PROJET ANDROID
Le nom de l’application et le nom du package

¤ Pour créer un nouveau projet Android il faut aller au menu suivant:


> Fichier à Nouveau à Nouveau Projet

¤ Le bouton suivant mène à la prochaine étape dans la création du projet Android

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 18


UN NOUVEAU PROJET ANDROID
Les appareils cibles et la version minimum du SDK

¤ La deuxième étape consiste à définir les appareils ciblés par le projet à créer.
¤ Android studio permet de créer des application android pour:
> Phone et Tablet, SmartWatch, Android TV, et Android Cars

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 19


UN NOUVEAU PROJET ANDROID
Une première Acitivity

¤ La troisième étape permet de choisir le type de la première activité (Ecran) de


l’application.
¤ Il est possible de choisir une activité vide (aucun compostant à l’intérieur). Quoique,
Android propose quelques modèles d’activités prédéfinies pour des besoins récurrents.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 20


UN NOUVEAU PROJET ANDROID
Dernière étape

¤ La dernière étape consiste à donner un nom à l’activité (une classe Java) et à sa


représentation graphique (layout XML)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 21


STRUCTURE D’UN PROJET ANDROID STUDIO

¤ Manifests
> AndroidManifest: le cœur d’une application android. Ce
fichier contient la déclaration de toutes les activités et
services de l’application ainsi que toutes les
permissions requises par l’application.
¤ Java
> Le code source de l’application: Activités, Services,
classes utilitaires…
¤ Res
> Drawable: les images et icones de l’application
Layout: la définition graphiques des écrans.
>
> Menu: les menu de l’application
> Mipmap: l’icone (logo) de l’application
> Values
+ Colors: la définition des couleurs à utiliser par
l’application
+ Dimens: les dimensions utilisés par l’application
+ Strings: les chaines de caractes (messages) à utiliser
dans l’application
¤ Gradle: dependences et parametres de l’application

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 22
LES ÉLÉMENTS D'UNE APPLICATION

¤ Une application Android peut être composée des éléments suivants:


> des activités (android.app.Activity): il s'agit d'une partie de l'application
présentant une vue à l'utilisateur
> des services (android.app.Service): il s'agit d'une activité tâche de fond
sans vue associée
> des fournisseurs de contenus (android.content.ContentProvider):
permet le partage d'informations au sein ou entre applications
> des widgets (android.appwidget.*): une vue accrochée au Bureau
d'Android
> des Intents (android.content.Intent): permet d'envoyer un message pour
un composant externe sans le nommer explicitement
> des récepteurs d'Intents (android.content.BroadcastReceiver): permet
de déclarer être capable de répondre à des Intents
> des notifications (android.app.Notifications): permet de notifier
l'utilisateur de la survenue d'événements

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 23
LE MANIFEST DE L'APPLICATION

Pour choisir l’activité à lancer en premier. Il faut ajouter dans


sa définition un Intent Filter avec l’action MAIN et la catégorie
LAUNCHER
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA
ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 24
LES RESSOURCES
La classe R

¤ Les ressources de l'applications sont utilisées dans le code au travers de la classe


statique R.
¤ Android studio re-génère automatiquement la classe statique R à chaque changement dans
le projet.
¤ Toutes les ressources sont accessibles au travers de R, dés qu'elles sont déclarées dans le
fichier XML ou que le fichier associé est déposé dans le répertoire adéquat. Les ressources
sont utilisées de la manière suivante:

> android.R.type_ressource.nom_ressource qui est de type int.

¤ Il s'agit en fait de l'identifiant de la ressource. On peut alors utiliser cet identifiant ou


récupérer l'instance de la ressource en utilisant la classe Resources:
> Resources res = getResources();
> String hw = res.getString(R.string.hello);
> XXX o = res.getXXX(id);

¤ Une méthode spécifique pour les objets graphiques permet de les récupérer à partir de leur
id, ce qui permet d'agir sur ces instances même si elles ont été créées via leur définition
XML:
> TextView texte = (TextView)findViewById(R.id.le_texte); texte.setText("Here we go !");

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 25


LES RESSOURCES
Les chaines de caractères

¤ Les chaines constantes de l'application sont situées dans res/values/strings.xml.


L'externalisation des chaines permettra de réaliser l'internationalisation de l'application.
Voici un exemple:

¤ La récupération de la chaine se fait via le code: R.string.hello

Il est strictement déconseillé de définir des chaines de


caractères à l’intérieur du code Java ou dans les fichiers XML

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 26


LES RESSOURCES
Internationalisation

¤ Le système de ressources permet de gérer très facilement l'internationalisation d'une


application. Il suffit de créer des répertoires values-XX où XX est le code de la langue
que l'on souhaite implanter. On place alors dans ce sous répertoire le fichier
xml strings.xml contenant les chaines traduites associées aux même clefs que
dansvalues/strings.xml. On obtient par exemple pour les
langues es et fr l'arborescence:

¤ MyProject/
> res/
+ values/
◦ strings.xml
+ values-es/
◦ strings.xml
+ values-fr/
◦ strings.xml

¤ Android chargera le fichier de resources approprié en fonction de la langue du


système.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 27


LES RESSOURCES
Les couleurs

¤ Les couleurs utilisés à l’intérieur de l’application doivent être déclarées dans le fichier
ressources colors.xml

¤ La récupération d’une couleur se fait via la classe R : R.color.colorBlue

Il est strictement déconseillé de définir des couleurs à


l’intérieur du code Java ou dans les fichiers XML

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 28


LES RESSOURCES
Les styles

¤ Les styles qui décrivent les écrans de l’application doivent être déclarées dans le fichier
ressources styles.xml

¤ La récupération d’un style se fait via: android:theme="@style/AppTheme"

Il est strictement déconseillé de définir des styles à l’intérieur


du code Java ou dans les fichiers XML

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 29


LES RESSOURCES
Les dimensions

¤ Toutes les dimensions utilisées dans l’application doivent être déclarées dans un fichier
dimens.xml

¤ La récupération d’un style se fait via : @dimen/ ou R.dimen

Il est strictement déconseillé de définir les tailles: textes ou


margins directement dans le code source Java ou XML

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 30


LES ACTIVITÉS
Créer une nouvelle activité

¤ Pour créer une nouvelle activité:


> Aller dans le dossier Java et cliquer en bouton droit sur un package
> Aller vers Nouveau à Activity à Choisir un type d’activité

¤ Il est fortement recommandé que


le nom de la classe activité se
termine avec le mot Activity

¤ Il est fortement recommandé que


le nom du fichier XML qui
contient la définition graphique
commence par activity

¤ L’option ‘Launcher Acitivty’


permet de rendre cette nouvelle
activité comme activité principale

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 31


LES ACTIVITÉS

¤ Une activité hérite d’Activity directement ou indirectement


(FragmentActivity, AppCompatActivity…)
¤ Une activité Android passe par plusieurs états durant son
cycle de vie:
> OnCreate: permet de gérer les opérations à faire avant
l'affichage de l'activité. Dans ce stade l’application n’est
toujours visible pour l’utilisateur.
> OnStart: Cette méthode est invoquée quand l’application
devienne visible pour l’utilisateur mais pas encore utilisable
(cliquable).
> OnResume: l’application est visible et prête pour utilisation.
> OnPause: une activité peut rester visible mais être mise en
pause par le fait qu'une autre activité est en train de démarrer.
> OnStop: l’application n’est plus visible.
> OnDestroy: l’application est détruite complètement.
> onRestart: cette méthode supplémentaire est appelée quand
on relance une activité qui est passée par onStop().
Puis onStart() est aussi appelée. Cela permet de différencier le
premier lancement d'un re-lancement.

Il faut éviter de charger les deux


méthodes onCreate et onPause par des
traitements supplémentaires
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA
ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 32
CYCLE DE VIE D'UNE ACTIVITÉ (2)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 33
SAUVEGARDE DES INTERFACES D'ACTIVITÉ

¤ L'objet Bundle passé en paramètre de la méthode onCreate permet de


restaurer les valeurs des interfaces d'une activité qui a été déchargée de la
mémoire. En effet, lorsque l'on appuie par exemple sur la touche Home, en
revenant sur le bureau, Android peut-être amené à déchargé les éléments
graphiques de la mémoire pour gagner des ressources. Si l'on rebascule sur
l'application (appui long sur Home)

¤ Pour forcer Android à décharger les valeurs, il est possible d'aller dans
"Development tools > Development Settings" et de cocher "Immediately
destroy activities ».

¤ Si une zone de texte n'a pas d'identifiant, Android ne pourra pas la sauver et
elle ne pourra pas être restaurée à partir de l'objet Bundle.
¤ Si l'application est complètement détruite (tuée), rien n'est restauré.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 34
PACKAGING ET DÉPLOIEMENT

¤ Une application android est un fichier avec une extension .apk

¤ Une application pourrait être installé soit en double cliquant sur le fichier apk
ou bien en téléchargeant l’application depuis les store.

¤ Il y a deux types de store:


> Store Public è PlayStore
> Store Entreprise è Appalooza, Fabric,…

Le fichier apk doit être signé avec un certificat avant la


soumission vers les stores. Pour cela, il faut générer une
application signé

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA


ENSAKENITRA
KENITRA––UNIVERSITÉ
UNIVERSITÉIBN
IBNTOUFAIL
TOUFAIL 35
PACKAGING ET DÉPLOIEMENT
Générer une Application signé

¤ Pour générer une application signée, il faut aller vers le menu: Build à
Generate Signed APK

¤ Apres avoir choisi l’application à signer, la fenêtre suivante s’affichera pour


renseigner les paramètres de signature.

¤ La première option permet


d’indiquer le chemin du
certificat ou bien de créer un
nouveau
¤ Les trois options: keystore
passowrd, key alias, key
password permettent de
paramétrer le certificat crée
¤ En cliquant sur suivant,
l’assistant demande de choisir
le chemin où va générer l’apk
signé

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 36


02 ANDROID:
INTERFACES GRAPHIQUES

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES
L'éditeur de mise en page

¤ Android Studio nous fournit un outil qui permet d'effectuer nos mises en page de
manière graphique. Cet outil s'appelle Layout Editor

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 38


INTERFACES GRAPHIQUES
L'éditeur de mise en page (2)

¤ Cet outil aide à mettre en place les vues directement dans le layout de l'application par
un simple drag and drop.

¤ Il faut par la suite gérer le positionnement des composants graphiques dans l’écran
selon le besoin.

L’éditeur de mise en page propose une liste d’options très riche


pour développer des applications de haut niveau. Il faut avoir
l’habitude d’utiliser les options présentes dans la barre suivante:

Cette barre permet de simuler (du gauche à droite)


- Les deux modes: landscape et portrait
- Les tailles et résolutions de l’écran
- Le niveau API
- Les différents thème possibles
- L’internationalisation
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 39
INTERFACES GRAPHIQUES
Représentation graphique

¤ Les actions (représentations) graphique génère des balises XML avec certaines attributs.
¤ Chaque composant graphique a une représentation XML associée

¤ La balise racine possède deux lignes:


xmlns:android=http://schemas.android.com/apk/res/android
xmlns:tools=http://schemas.android.com/tools
qui permettent d'utiliser des attributs spécifiques à Android.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 40


INTERFACES GRAPHIQUES
Layout

¤ Un Layout (Gabaris) définit la structure visuelle d'une interface utilisateur, telle que
l'interface utilisateur d'un widget d'activité ou d'application. Vous pouvez déclarer un
layout de deux façons:
> XML : Android fournit un vocabulaire XML simple qui correspond aux classes et
sous-classes View, telles que celles des widgets et des gabaris.
> Runtime: Votre application peut créer des objets View, ViewGroup, et implicitement
des gabaris (et manipuler leurs propriétés) par code java.

¤ Le framework Android vous donne la possibilité d'utiliser l'une de ces méthodes ou les
deux pour déclarer et gérer l'interface utilisateur de votre application.
¤ Les éléments graphiques héritent de la classe View. On peut regrouper des éléments
graphiques dans une ViewGroup. Des ViewGroup particuliers sont prédéfinis: ce sont
des gabarits (layout) qui proposent une prédispositions des objets graphiques:

Il est fortement conseillé de déclarer les layout dans


la partie XML, pour respecter une bonne séparation
entre la présentation graphique le code java qui
gère le comportemental
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 41
INTERFACES GRAPHIQUES
VUES et LAYOUT

¤ Il y a plusieurs types de layout qui proposent une prédispositions des objets


graphiques:

> LinearLayout: dispose les éléments de gauche à droite ou du haut vers le


bas
> RelativeLayout: les éléments enfants sont placés les uns par rapport aux
autres
> TableLayout: disposition matricielle
> FrameLayout: disposition en haut à gauche en empilant les éléments
> GridLayout: disposition matricielle avec N colonnes et un nombre infini de
lignes
> ConstraintLayout permet de créer des mises en page volumineuses et
complexes avec une hiérarchie de vue plate (aucun groupe de vue
imbriqué).

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 42


INTERFACES GRAPHIQUES
LinearLayout

¤ Ce layout se charge de mettre les vues sur une même ligne, selon une certaine
orientation.

¤ L'attribut pour préciser cette orientation est android:orientation. On peut lui donner
deux valeurs :
> Vertical pour que les composants soient placés de haut en bas (en colonne) ;
> Horizontal pour que les composants soient placés de gauche à droite (en ligne).

¤ LinearLayout exige également deux autres attributs : layout_width et layout_height

¤ Pour préciser la hauteur ou la largeur d’un layout, il est possible de faire 3 façons:
> Une valeur absolue en dp
> match_parent: remplir la taille du parent
> wrap_content: considérer la taille réelle: la somme des composants

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 43


INTERFACES GRAPHIQUES
RelativeLayout

¤ Ce layout propose de placer les composants les uns par rapport aux autres.

¤ Les deux attributs requis pour utiliser un RelativeLayout sont: layout_width et


layout_height

¤ Si on veut placer une vue au centre d'un RelativeLayout, on peut passer à cette vue
l'attribut android:layout_centerInParent="true".

¤ Il est aussi possible d'utiliser android:layout_centerHorizontal="true" pour centrer, mais


uniquement sur l'axe horizontal, de même avec android:layout_centerVertical="true" pour
centrer sur l'axe vertical.

¤ Il existe d'autres contrôles pour situer une vue par rapport à un RelativeLayout:
> android:layout_alignParentBottom="true" pour aligner le plancher d'une vue au
plancher du RelativeLayout ;
> android:layout_alignParentTop="true" pour coller le plafond d'une vue au plafond
du RelativeLayout ;
> android:layout_alignParentLeft="true" pour coller le bord gauche d'une vue avec le
bord gauche du RelativeLayout ;
> android:layout_alignParentRight="true" pour coller le bord droit d'une vue avec le bord
droit du RelativeLayout.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 44


INTERFACES GRAPHIQUES
Charger un écran (Layout)

¤ Lorsque vous compilez votre application, chaque fichier de présentation XML est
compilé dans une ressource View.

¤ Pour charger un écran, Il faut charger la ressource layout à partir du code de votre
application dans votre implémentation de la méthode onCreate (). Pour ce faire, il faut
appeler la méthode setContentView (), en lui passant la référence à votre ressource
layout sous la forme de: R.layout.layout_file_name.

Afin de mieux organiser son projet, le nom de


fichier layout qui correspond à un écran doit
commencer par activity_
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 45
INTERFACES GRAPHIQUES
Attributs

¤ Chaque objet View et ViewGroup prend en charge leur propre variété d'attributs XML.
Certains attributs sont spécifiques à un objet View (par exemple, TextView prend en
charge l'attribut textSize), mais ces attributs sont également hérités par les objets View
qui peuvent étendre cette classe. Certains sont communs à tous les objets View, car ils
sont hérités de la classe View racine (comme l'attribut id).

¤ ID: Tout objet View peut être associé à un identifiant entier, afin d'identifier de manière
unique la vue dans l'arborescence.

¤ L’ID unique pourrait être utilisé pour associé un objet graphique XML à un objet Java.

Afin de faciliter la gestion et surtout la localisation des


identifiants, il faut bien choisir l’id des éléments graphiques.
Une règle très utilise consiste à commencer par le nom de
l’activité: activityname_widgettype_role
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 46
INTERFACES GRAPHIQUES
La classe ressource R

¤ Une interface graphique définie en XML sera aussi générée comme une ressource
dans la classe statique R.

¤ Toute modification dans le dossier res/ engendre une pré-compilation de la classe R.

¤ Toutes les ressources: images, icons, layout, widgets… sont accessbles depuis la
classe R.

¤ Chaque ressource est representé par un entier unique dans la classe R.

Des fois le projet android trouve des difficultés pour régénérer


la classe R automatiquement et cela cause que certaines
ressources ne sont pas accessible. Pour résoudre un tel
comportement, il suffit de compiler le projet manuellement

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 47


INTERFACES GRAPHIQUES
Démarrer une autre activité

¤ Pour démarrer une autre activité depuis l’activté en cours d’execution il faut utiliser la
méthodes startActivity

¤ La méthode startActivity prend comme paramètre un objet Intent

¤ L’objet Intent accepte deux paramètres:


> Le content qui va lancer la nouvelle activité
> Le nom de la classe de l’activité à lancer

L’objet Intent est principalement utilisé pour transmettre


des messages entre les activités (Voir Ch3)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 48


INTERFACES GRAPHIQUES
Les widgets: Label de texte (TextView)

¤ Un élément d'interface utilisateur qui permet d'afficher une chaîne de caractères que
l'utilisateur ne peut modifier.
¤ Ce composant supporte plusieurs attributs XML qui permettent de personnaliser le
label.

¤ La taille du texte doit être précisé en sp


¤ Il est possible de modifier les valeurs d’un TextView depuis une classe java (après le
mapping via findViewById)
¤ Pour manipuler le compostant TextView depuis une classe Java, Il faut utiliser la classe
TextView comme suit: TextView text = (TextView) findViewById(R.id.text)

Il est possible d’insérer des chaînes de caractères


formatées, à l'aide de balises HTML, en utilisant l’attribut
HTMLTextView,
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 49
INTERFACES GRAPHIQUES
Les widgets: Zone de texte (EditText)

¤ Ce composant est utilisé pour permettre à l'utilisateur d'écrire des textes. Il s'agit en fait
d'un TextView éditable. Ce composant supporte plusieurs attributs XML qui permettent
de personnaliser la zone du texte.
¤ Le composatnt EditText possede un attribut: android:inputType qui permet de définir le
type du contenu: texte, numerique, email, mot de passe….

¤ Il est possible de modifier les valeurs d’un EditText depuis une classe java (après le
mapping via findViewById)
¤ Pour manipuler le compostant TextView depuis une classe Java, Il faut utiliser la classe
TextView comme suit: EditText text = (EditText) findViewById(R.id.text)

EditText hérite de TextView, ce qui signifie qu'il peut


prendre les mêmes attributs que TextView en XML et
qu'on peut utiliser les mêmes méthodes Java.
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 50
INTERFACES GRAPHIQUES
Les widgets: Zone de texte (EditText)

¤ Pour intercepter les évènements liés à EditText, on rajoute un listener sur ce


composant:

¤ La méthode OnLoginTextChanged sera invoquée à chaque fois un évènement est


produit

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 51


INTERFACES GRAPHIQUES
Les widgets: Les images (ImageView)

¤ Pour inclure des images dans un layout android, on utilise le composant: ImageView

¤ L’attribut src permet de définir l’image à charger.


¤ Le composant graphique pourrait être instancié depuis une classe Java comme suit:
> ImageView imgLogo = (ImageView) activity.findViewById(R.id.imageView);
¤ Pour modifier une image depuis la classe Java, il faut utiliser la méthode
setImageRessource

Il faut faire attention si on décide d’utiliser l’attribut


android:bakground pour charger une image. Cela pourrait
causer des problèmes de tailles d’images et de remplacement

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 52


INTERFACES GRAPHIQUES
Les widgets: Les boutons (Button)

¤ Un élément d'interface utilisateur que l'utilisateur peut appuyer ou cliquer pour effectuer
une action.
¤ Un simple bouton est un TextView cliquable.

1. Le composant Button hérite de TextView, ce qui signifie qu'il peut


prendre les mêmes attributs que TextView en XML.
2. Par défaut, le texte dans un bouton est écrit en MAJ. Pour
désactiver ce comportement il faut mettre l’attribut textAllCaps à
false
3. Pour personnaliser le design d’un bouton (les coins…), il faut defnir
le style dans un drawable xml et le définir dans l’attribut background
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 53
INTERFACES GRAPHIQUES
Les widgets: Les boutons (Button)

¤ Pour intercepter les évènements liés à un bouton, on rajoute un listener sur ce


composant:

¤ La méthode OnClickListener sera invoquée à chaque fois on clique sur le bouton:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 54


INTERFACES GRAPHIQUES
Le plugin Butter Knife en utilisant annotationProcessor

¤ ButterKnife est une libraire android qui permet d’associer une variable Java à sa
définition XML d’une manière très lisible.

¤ ButterKnife permet également de bien gérer la gestion des listeners.

¤ Pour utiliser le plugin butterknife dans projet android studio, il faut télécharger ses
dépendance en ajoutant les deux lignes suivantes dans le fichier build.gradle associé
au module (une resynchronisation du fichier gradle est requise)

¤ Ensuite, il faut lier ButterKnife à l’activité comme suit:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 55


INTERFACES GRAPHIQUES
Le plugin Butter Knife en déclarant un classpath

¤ Dans certains cas, si par exemple l’application sera packagé en AAR (libraire android)
à réutiliser, l’annontationProcessor n’est pas la bonne façon pour ajouter la
dépendance ButterKnife. Dans ce cas il faut suivre les étapes suivantes:
> Ajouter le plugin au buildscript dans le fichier gradle projet

> Appliquer le plugin dans le build.gradle associé au module

> Ajouter les dépendances dans le build.gradle associé au module

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 56


INTERFACES GRAPHIQUES
Le plugin Butter Knife

¤ Avec le plugin ButterKnife, la liaison entre l’objet XML et la variable Java se fait au
moment de la déclaration, en utilisant la méthode BindView et sans passer directement
par la méthode findViewById. Cette liaison est faite comme suit:

¤ ButterKnife permet de gérer facilement les évènements onClick (Listeners) :

¤ Il est possible de charger également les string déclarées dans le fichier string.xml

Dans le cas ou ButterKnife est utilisé dans librairie android, il est


recommandé d’utiliser le R2 pour accéder aux ressources (R2.id.)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 57


INTERFACES GRAPHIQUES
Inclusions de layout
¤ Les interfaces peuvent aussi inclure d'autres interfaces, permettant de factoriser des
morceaux d'interface. On utilise dans ce cas le mot clef include:

¤ Si le gabarit correspondant à titlebar.xml contient lui aussi un LinearLayout, on risque


d'avoir deux imbrications de LinearLayout inutiles car redondant:
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 58
INTERFACES GRAPHIQUES
Positionnement avancé

¤ Pour obtenir une interface agréable, il est souvent nécessaire de réaliser


correctement le positionnement des éléments graphiques. La difficulté est
d'arriver à programmer un placement qui n'est pas dépendant de l'orientation
ou de la taille de l'écran.

¤ Le principe réside dans l'imbrication de LinearLayout:


> Un premier layout contiendra l'ensemble des éléments. Son orientation
doit être horizontal et sa gravité (gravity) center. On inclut ensuite le texte.

> Puis, l'image étant censée être à droite, il faut créer


un LinearLayout consécutif au texte et préciser que la gravité (gravity)
est right. Pour aligner les éléments, il faut préciser que la gravité du layout
(layout_gravity) est center.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 59


INTERFACES GRAPHIQUES
Les listes: introduction

¤ Android ListView est une vue qui regroupe plusieurs éléments et les affiche dans une
liste déroulante verticale.
¤ Les éléments de liste sont automatiquement insérés dans la liste à l'aide d'un
adaptateur qui extrait le contenu d'une source telle qu'un tableau ou une base de
données.
¤ Un adaptateur établit un pont entre les composants de l'interface utilisateur et la source
de données qui remplit les données dans le composant de l'interface utilisateur.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 60


INTERFACES GRAPHIQUES
Les listes: principe

¤ La vue (view) peut prendre les données de l'affichage de l'adaptateur (adapter) et


affiche les données sur différentes vues comme Spinner, ListView, ou GridView.

¤ La gestion des listes se divise en deux parties distinctes:


> Les adaptateurs (Adapters), qui sont les objets qui gèrent les données, mais pas leur affichage
ou leur comportement en cas d’interaction avec l'utilisateur. On peut considérer un adaptateur
comme un intermédiaire entre les données et la vue qui représente ces données.
> Les AdapterView, qui gérent l'affichage et l'interaction avec l'utilisateur, mais sur lesquels on ne
peut pas effectuer d'opération de modification des données.

¤ Les ListView et GridView sont des sous-classes de AdapterView et ils peuvent être
alimentées en les liant à un adaptateur, qui récupère des données d'une source
externe et crée une vue qui représente chaque entrée de données.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 61


INTERFACES GRAPHIQUES
Les adapters

¤ Android propose plusieurs sous-classes d'adaptateur qui sont utiles pour récupérer
différents types de données et créer des vues pour un AdapterView (par exemple
ListView ou GridView)

¤ Les adaptateurs les plus utilisés sont ArrayAdapter, CursorAdapter, SimpleAdapter,


SpinnerAdapter et WrapperListAdapter.

¤ Tous les adapteurs étendent la classe BaseAdapter et permettent de redéfinir plusieurs


méthodes pour gérer et manipuler le contenu d’une ListView. Les méthodes les plus
utilisées sont:
> getCount: Combien d'éléments se trouvent dans l'ensemble de données représenté par cet
adaptateur.
> getItem: Récupère l'élément de données associé à la position spécifiée dans l'ensemble de
données.
> getView: Obtenez une vue qui affiche les données à la position spécifiée dans l'ensemble de
données.

Adapter n'est en fait qu'une interface qui définit les comportements généraux
des adaptateurs. Cependant, si vous voulez un jour construire un adaptateur,
faites le dériver de BaseAdapter.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 62


INTERFACES GRAPHIQUES
Les adapters : ArrayAdapter

¤ ArrayAdapter crée une vue en appelant toString () sur chaque objet de données de la
collection que vous fournissez et place le résultat dans un TextView. Vous pouvez
également personnaliser le type de vue utilisé pour l'objet de données dans la collection.

¤ Pour construire une vue personnalisée pour un objet de données, il faut redéfinir la méthode
getView (int, View, ViewGroup) en choisissant la définition graphique à adopter (layout) et
les différents traitements à appliquer à la vue avant le chargement.

¤ L’ArrayAdapter propose plusieurs constructeurs pour faire le lien entre la vue et les données:
> ArrayAdapter(Context context, int resource)
> ArrayAdapter(Context context, int resource, int textViewResourceId)
> ArrayAdapter(Context context, int resource, T[] objects)
> ArrayAdapter(Context context, int resource, int textViewResourceId, T[] objects)
> ArrayAdapter(Context context, int resource, List<T> objects)
> ArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects)
+ context: Le contexte courant, généralement l'instance de votre activité.
+ resource: L’ID du fichier layout associé à la vue (cellule)
+ textViewResourceId: L'identifiant de la ressource de la vue qui recevra les données "reformatées"
+ objects: Les données sous forme de tableau ou une liste des données.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 63


INTERFACES GRAPHIQUES
Les adapters : ArrayAdapter à méthodes

¤ ArrayAdapter dispose de plusieurs méthodes qui permettent de gréer la liaison entre


donnes et cellules:
> public void add (T object) pour ajouter un objet à la fin de la liste
> public void addAll (Collection<? extends T> collection) (API 11) pour ajouter une collection à la
fin de la liste
> public void addAll (T... items) (API 11) pour ajouter un ensemble d'items à la fin de la liste.
> public void insert (T object, int index) pour insérer un objet à un index spéicifié
> public void remove (T object) pour supprimer un objet.
> public void clear () pour effacer toutes les données de la liste.
> public void notifyDataSetChanged (): Cette méthode est déclenchée lorsqu'une modification a eu
lieu dans les données de l'adaptateur (add/remove/insert ou clear()) et que le flag
notifyOnChange est positionné à vrai.
> public void setNotifyOnChange (boolean notifyOnChange): Cette méthode permet le lancement
automatique de notifyDataSetChanged () lorsqu'un changement sur les données à lieu
(add/remove/insert ou clear()).

Un appel direct à la méthode notifyDataSetChanged change


automatiquement à vrai le flag notifyOnChange

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 64


INTERFACES GRAPHIQUES
Les adapters : SimpleAdapter

¤ Un adaptateur facile pour mapper des données statiques à des vues définies dans un
fichier XML. Vous pouvez spécifier les données sauvegardant la liste en tant que
ArrayList de Maps. Chaque entrée dans ArrayList correspond à une ligne de la liste.

¤ Les Maps (structure de données) contiennent les données pour chaque ligne. Vous
spécifiez également un fichier XML qui définit les vues utilisées pour afficher la ligne et
un mappage des clés de la maps vers des vues spécifiques.

¤ SimpleAdapter propose le constrcuteur suivant:


> SimpleAdapter(Context context, List<? extends Map<String, ?>> data, int
resource, String[] from, int[] to)
+ Context: Le contexte courant, généralement l'instance de votre activité.
+ Data: Une liste de maps. Chaque entrée de la liste correspond à une ligne de la liste. Les
maps contiennent les données pour chaque ligne et doivent inclure toutes les entrées
spécifiées dans "from"
+ Resource: L’ID du fichier layout associé à la vue (cellule)
+ From: Une liste de noms de colonnes qui seront ajoutés à la map associée à chaque
élément.
+ To: Les vues qui doivent afficher la colonne dans le paramètre "from". Ceux-ci devraient tous
être TextViews. Les premières N vues de cette liste reçoivent les valeurs des N premières
colonnes du paramètre from.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 65


INTERFACES GRAPHIQUES
Les adapters : CursorAdapter

¤ Lorsque nous voulons que les données de la liste proviennent directement d'une
requête de base de données SQLite, nous pouvons utiliser un CursorAdapter.

¤ Un curseur de base de données est une structure de contrôle qui permet la traversée
des enregistrements dans une base de données.

SQLiteDatabase db = handler.getWritableDatabase();
Cursor todoCursor = db.rawQuery("SELECT * FROM todo_items", null);

¤ Le CursorAdapter s'insère entre un curseur (source de données de la requête SQLite)


et la ListView (représentation visuelle) et configure deux aspects:
> Quel modèle de présentation (layout) est associé pour chaque élément de la liste
> Les champs du curseur à lier aux vues du modèle

¤ CursorAdapter dispose de troisméthodes essentielles à redefnir pour lier une listview à


un cursor d’une base de données. Ces methodes sont:
> newView: cette méthode est redéfinie pour spécifié le alyout à charger pour chaque element.
> bindView: La méthode bindView est utilisée pour lier toutes les données à une vue donnée
> changeCursor: quipermet delier la liste à un nouveau cursor d’une base de données

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 66


INTERFACES GRAPHIQUES
Les listes déroulantes

Liste déroulante simple Liste déroulante complexe

¤ Une seule cellule contient plusieurs composants


graphique.
¤ Un adapter par défaut ne pourra pas créer la cellule
¤ Contient une zone de texte
automatiquement
¤ Ce n’est pas obligatoire de redéfinir un adapter pour
¤ Il faut redéfinir un adapter et préciser dans la
créer les cellules
méthode getView comment la cellule sera crée.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 67


INTERFACES GRAPHIQUES
Les listes simples

¤ Pour créer une liste où chaque cellule contient une zone de texte, il faut passer par
quatre étapes:
> Ajouter un composant graphique « ListView » au layout de l’activité concernée.
> Créer un nouveau layout pour définir la zone de texte à afficher dans la cellule.
> Instancier un adapter par défaut (par exemple un ArrayAdapter ou Simpleadapter si
on a besoin de remplir plus d’un seul champ texte dans une seule cellule) en lui
passant les bons paramètres.
> Associer l’adapter à la liste à l’aide de la méthode: setAdapter

Il est possible de créer une listview via la classe Java sans


passer par les layout XML

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 68


INTERFACES GRAPHIQUES 1 2 3 4
Les listes simples: ajouter le composant graphique listview

¤ Pour inclure une ListView dans une activité, il faut ajouter le composant graphique
dans la définition XML (layout) associé à cette activité.

¤ Le composant ListView est identifié par son id unique, qui sert à faire la liaison avec la
classe Java afin de manipuler la listeview.
¤ Deux arguments sont obligatoires dans la définition d’une listeview: la hauteur et la
largeur.

Pour définir une listview en mode full screen il suffit de préciser de


l’attacher directement au layout racine et de préciser que sa hauteur
et sa largeur soir en match_parent
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL
INTERFACES GRAPHIQUES 1 2 3 4
Les listes simples: définir un layout pour la ou les cellules

¤ Le design du contenu de la cellule ou bien de chaque cellule doit être déclaré dans un
layout séparé.

¤ Ce layout sera par la suite indiqué au moment de l’instanciation de l’adapter

Le layout qui définit le contenu d’un élément d’une liste simple ne


doit pas inclus dans une balise layout

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4

Les listes simples: Instancie un adapter

¤ Pour pouvoir manipuler la liste depuis une classe java, il faut associer le composant
XML à une variable ListView déclarée dans l’acitivté.
¤ Il faut aussi définir le tableau depuis lequel l’adapter va charger le contenu qui à
afficher dans la liste.

¤ L’objet adapter par défaut accepte trois paramètres: le contexte qui charge la liste (this
dans ce cas), le layout qui definit le contenu de la cellule, et le tableau qui contient la
donnée

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4
Les listes simples: Associer un adapter à la liste

¤ Pour associer un adapter à une liste, il faut faire appelle à la méthode setAdapter.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES
Les listes complexes

¤ Lorsque les listes contiennent un layout plus complexe qu'un texte, il faut étendre la
classe ArrayAdapter.
¤ Pour créer une liste où chaque cellule contient plusieurs éléments graphiques, il faut
passer par cinq étapes:
> Ajouter un composant graphique « ListView » au layout de l’activité concernée.
> Créer un nouveau layout pour définir le contenu graphique de la cellule.
> Etendre une classe ArrayAdapter (ou autre adapter) pour redéfinir la méthode
getView. Des fois Il faut également créer une classe specifique pour gérer le
contenu de la liste (Dans ce cours, on donne l’exemple d’une classe qui contient
deux attributs (Image et Title) pour gérer le contenu d’une liste de films)
> Instancier la nouvelle classe Adapter
> Associer l’adapter à la liste à l’aide de la méthode: setAdapter

Pour créer une liste de contenu complexe, Il est possible


d’étendre n’importe quel autre type d’adapter selon le besoin

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 73


INTERFACES GRAPHIQUES 1 2 3 4 5
Les listes complexes à ajouter le composant graphique listview

¤ Pour inclure une ListView dans une activité, il faut ajouter le composant graphique
dans la définition XML (layout) associé à cette activité.

¤ Le composant ListView est identifié par son id unique, qui sert à faire la liaison avec la
classe Java afin de manipuler la listeview.
¤ Deux arguments sont obligatoires dans la définition d’une listeview: la hauteur et la
largeur.

Pour définir une listview en mode full screen il suffit de préciser de


l’attacher directement au layout racine et de préciser que sa hauteur
et sa largeur soir en match_parent
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL
INTERFACES GRAPHIQUES 1 2 3 4 5
Les listes complexes à définir un layout pour la ou les cellules

¤ Le design du contenu de la cellule ou bien de chaque cellule doit être déclaré dans un
layout séparé.

¤ Les composants graphiques doivent être regroupés dans un layout racine

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5

Les listes complexes à Etendre la classe ArrayAdapter et créer la classe Movie

¤ Pour créer d‘une façon avancé le contenu d’une liste, il faut faire cela dans la méthode
getView qui fait partie de la classe ArrayAdapter (Interface Adapter)
¤ La méthode getView est utilisée afin de créer la liste ou encore la mettre à jour. Cette
méthode à plusieurs paramètres qui sont très utiles pour créer chaque cellule:
> Position: représente l’index de l’élément (cellule) en cours de création.
> ConvertView: c’est la vue qui est en train d’être créé, si cette dernière existe déjà (en cas de
mise à jour de la liste par exemple), il suffit de la récupérer. Après, on récupère tout simplement
l’ImageView et le TextView décalrés dans le layout associé à la cellule qu’on pourra les modifie
afin d’afficher les valeurs d’un objet Movie.
> Parent: c’est le conteneur de la vue convertView.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5

Les listes complexes à Etendre la classe ArrayAdapter et créer la classe Movie

¤ Pour remplir le contenu de la liste, il faut donner à l’ArrayAdapter un tableau d’objets


(dans notre cas c’est un tableau d’objets Movie).
¤ Au moment de la création d’un adapter personnalisé (MovieAdapter dans notre cas) il
faudra spécifier le type d’objets à charger: ArrayAdapter <Movie>

¤ La classe qui définit le type d’objets à charger doit suivre la définition du layout des
cellules. Dans notre cas, la classe Movie doit contenir deux arguments: une image et un
texte. Comme une ImageView est représenté par un ID (un entier) dans un contexte
Android, notre classe Movie va définir deux attributs : un entier et une chaine de
caractères.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5

Les listes complexes à Etendre la classe ArrayAdapter créer la classe Movie

¤ La tableau des objets à charger est généralement transmis via le constructeur au moment
de l’instanciation de la nouvelle classe Adapter

¤ La méthode redéfinit getView utilise par la suite ce tableau d’objets pour remplir ou mettre
à jour la liste.

¤ La méthode getView a besoin de connaître également le layout qui définit le contenu de la


cellule. Pour cela on lui donne dans un objet inflater qu’on associe au convertView

¤ Un inflater a pour rôle d’instancier un layout XML et le mettre dans un objet View

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5

Les listes complexes à Etendre la classe ArrayAdapter créer la classe Movie

¤ Une fois l’objet convertView est lié au layout de la cellule, il devient possible de
modifier/remplir le contenu en faisant un bind depuis la vue convertView avec les
composants xml concerné.

¤ Chaque cellule est normalement associé à un élément du tableau d’objets. Il suffit donc
de récupérer le bon objet en se basant sur l’attribut position pour remplir la cellule.

Chaque cellule pourra inclure un layout diffèrent. Pour cela, il suffit


de de charger des layout différents dans le inflater selon la position

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5

Les listes complexes à Utiliser la nouvelle classe adapter

¤ Le nouveau adapter pourrait être utiliser pour charger une liste d’objets Movie comme
suit:

¤ La liste des movies est attachée à l’adapter via son constructeur pour que cela soit
consommé depuis la méthode getView

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES 1 2 3 4 5
Les listes complexes à Associer le nouveau adapter à la liste

¤ La dernière étape consiste à associer le nouveau adaptateur au composant graphique


listView en utilisant la méthode setAdapter.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


INTERFACES GRAPHIQUES
Les listes complexes à évènement sur le click

¤ ListView permet aux développeurs de gérer les cliques de l'utilisateur en attachant le


OnItemClickListener et en surchargeant l'événement onItemClick.

¤ Ou d’une façon beaucoup plus simple en utilisant le plugin ButterKnife

Il faut faire attention que si les éléments de la cellule sont


focusable/clickable cela pourrait empêcher que la cellule soit
clickable
COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 82
INTERFACES GRAPHIQUES
Les listes à RecyclerView

¤ Dans les dernières version d'Android, un nouveau mécanisme permet de gérer des listes
volumineuses pour lesquelles on recycle les éléments graphiques dynamiquement lorsque la
liste est parcourue. Il s'agit de la classe RecyclerView.

¤ Comme pour une ListView il faut un Adapter. Il faut en plus un layout manager qui va gérer
le recyclage des éléments graphiques.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 83


INTERFACES GRAPHIQUES
Les listes à RecyclerView

¤ Pour ajouter un RecyclerView à une activité. Il suffit d’ajouter le composant à la


définition graphique de l’activité.

¤ Pour faire le mapping entre le composant XML et la variable Java il faut déclarer un
objet RecyclerView et l’associer au composant XML.

¤ L’objet recyclerView doit être rattaché à un adapter et un layoutManager

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 84


INTERFACES GRAPHIQUES
Les listes à RecyclerView: Adapter

¤ RecyclerView inclut un nouveau type d'adaptateur. C'est une approche similaire à celles
utilisées pour les listView, mais avec quelques particularités, comme le principe du
ViewHolder.
¤ Un ViewHolder décrit une vue d'objet et des métadonnées sur sa place dans le
RecyclerView.

¤ Vous devrez remplacer deux méthodes principales: une pour inflater la vue et son layout
XML associé, et une autre pour lier les données à la vue. La bonne chose à ce sujet est
que la première méthode est appelée uniquement lorsque nous avons vraiment besoin de
créer une nouvelle vue. Pas besoin de vérifier si c'est recyclé.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 85


INTERFACES GRAPHIQUES
Les listes à RecyclerView: Adapter

¤ Voici un exemple d’adapter d’unrecyclerView

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 86


INTERFACES GRAPHIQUES
Les Fragments

¤ A partir d'Android 3.0, on dispose d'un composant graphique similaire aux Activity:
les Framents. Un fragment est une sorte de sous activité qui possède son propre cycle
de vie. On peut intégrer plusieurs fragments dans une activités, et changer un fragment
par un autre dynamiquement, sans changer l'activité principale. Cela rend la
programmation graphique dynamique plus aisée.

¤ Un fragment est dépendant d'une activité:


> si l'activité passe en pause, les fragments aussi
> si l'activité est détruite, les fragments aussi

¤ Mais le but d'un fragment est d'être réutilisable dans plusieurs activités !

¤ Les changements de fragments au sein d'une activité peuvent être enregistré dans
la back stack (notion de transaction). Ainsi, si l'on presse le bouton retour, la
transaction est annulée et on retrouve le fragment précédent.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 87


INTERFACES GRAPHIQUES
Les Fragments fixes

¤ On peut intégrer un Fragment dans le layout de l'activité à l'aide du tag fragment. Il faut
placer ce fragment dans un ViewGroup (i.e. un LinearLayout, RelativeLayout, etc.).
L'id permet de cibler le fragment à l'exécution, et le tag name permet de spécifier la classe à
utiliser à l'instanciation, si on le sait à l'avance à la conception:

¤ android:name contient le chemin de la classe qui définit le fragment

¤ La classe MonFragmentStatic contient le code permettant de générer la View representé par


le fragment.

¤ La classe MonFragmentStatic devrait hérité de la classe mère Fragment et definit les


methodes suivantes:
> Deux constructeur: un sans paramètres qui sert à la sérialisation et un autre pour trasmettre les
parametres depuis la classe qui consomme le Fragment.
> onCreate: est invoquée au début de la création du fragment
> onCreateView: permet d’associer une layout XML à la vue du fragment.
> onAttach: une méthode de callback au moment de l’attachement du fragment
> onDetach: est invoquée au moment où le fragment est détaché de l’activité

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 88


INTERFACES GRAPHIQUES
Les Fragments à Exemple d’une classe fragment

¤ Pour créer un nouveau fragment, il faut aller au menu: File à New à Fragment
¤ Cette action va créer deux fichier: un fichier Java qui contient le traitement et un fichier
layout XML qui contient la définition XML du fragment

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 89


INTERFACES GRAPHIQUES
Fragments dynamique

¤ Les fragments fixes sont simples à implémenter. A partir du moment où le fragment est
codé, il suffit de l’indiquer dans des fichiers XML d’affichage à désérialiser dans une
activité sans rien indiquer en plus. Se limiter à ce type de fragment ne permettrait pas
de satisfaire ses promesses de flexibilité et de maintenance.

¤ Le framework Android fournit une API pour gérer les fragments pendant l’exécution
d’une application, le FragmentManager

¤ il est possible de remplacer un fragment par un autre aisément et, par la même
occasion, afficher une nouvelle portion d’interface.

¤ Pour inclure dynamiquement un fragment dans une activité. Il faut que cette lui
dernière réserve de l’espace dans son layout XML. L’id de ce conteneur va être
renseigné au FragmentManager pour embarqué le fragment dedans.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 90


INTERFACES GRAPHIQUES
Fragment Manager

¤ Le Fragment Manager permet de gérer les fragments d'une activité. Les principales
utilisations sont:
> ajouter, enlever, remplacer un fragment dans une activité
> retrouver un fragment par son id dans l'activité (findFragmentById())
> sauvegarder un état d'un ou plusieurs fragments (addToBackStack())
> restaurer un état sauvegardé précédemment d'un ou plusieurs fragments
(popBackStack())
> ajouter un écouteur de changement d'état (addOnBackStackChangedListener())

¤ Pour que la restauration fonctionne, en préparant une transaction, et avant d'avoir


appelé commit il faut explicitement enregistré l'état courant dans la pile à l'aide
d'addToBackStack(). Dans ce cas, il est sauvegardé, et si l'utilisateur appuie sur la
touche retour, il retrouvera l'interface précédente. Cela peut donner par exemple:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 91


INTERFACES GRAPHIQUES
Cycle de vie d'un fragment

¤ Différentes callbacks sont appelées en fonction de l'état de


l'activité principale. Un fragment est d'abord attaché à
l'activité, puis créé, puis sa vue est créée. On peut même
intercaler du code quand l'activité est créée.

¤ Les différents états (Start ou Resume / Pause / Stop)


correspondent aux états liés à l'activité:
> Resume/Start: le fragment est visible et l'activité s'exécute
> Pause: une autre activité est au premier plan mais
l'activité qui contient le fragment est encore visible, par
transparence par exemple
> Stop: le fragment n'est plus visible: il peut avoit été enlevé
de l'activité par exemple, mais ajouté dans la back stack

¤ Comme pour les activités, si le fragment est tué, son état


peut être sauvé avec un Bundle en
surchargeant onSaveInstanceState(), puis en rechargeant
l'état depuis le Bundle dans onCreate().

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 92


INTERFACES GRAPHIQUES
Callback d'un fragment vers l'activité
¤ Pour faire communiquer fragments et activités, il faut réaliser une callback vers
l'activité dans le fragment, afin que de pouvoir notifier l'activité depuis le fragment. Le
fragment devra juste appeler la callback dans son code, ce qui provoquera l'exécution
d'une méthode de l'activité avec d'éventuelles paramètres
¤ Une interface de communication doit être définie, par exemple:

¤ Puis, lorsque le fragment est associée à une activité, la méthode onAttach permet
d'enregistrer l'activité:

¤ L’activité doit implémenter à son tour l’interface du callBack

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 93


03 LES INTENTS

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


LES INTENTS
Utilisation
¤ Un INTENT est un objet de communication que vous pouvez utiliser pour demander
une action à partir d'un autre composant d'application.
¤ Les INTENTS ont plusieurs utilisation:
> Démarrer une activité
+ Une activité représente un seul écran dans une application. Vous pouvez démarrer
une nouvelle instance d'une activité en transmettant une intention à startActivity ().
L'intention décrit l'activité à démarrer et transmet toutes les données nécessaires.
+ Si vous souhaitez recevoir un résultat à la fin, appelez startActivityForResult.
> Démarrer un service
+ Vous pouvez démarrer un service en transmettant un INTENT à startService ().
L'intention décrit le service à démarrer et transporte les données nécessaires.
+ Un service est un composant qui effectue des opérations en arrière-plan sans
interface utilisateur. Avec Android 5.0 (niveau API 21) et versions ultérieures, vous
pouvez démarrer un service avec JobScheduler.
> Envoyer un boradcast
+ Un boradcast est un message que toute application peut recevoir. Vous pouvez
diffuser un boradcast vers d'autres applications en transmettant un intent à
sendBroadcast ()

Les Inents sont utiliser pour utiliser les fonctionnalités System et


communiquer avec d’autres applications d’Android (GPS, GMAIL, Youtube…)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 95


LES INTENTS
Les types d’intents

¤ Il y a deux types d’INTENTS:


> INTENT explicite
+ spécifiez le composant pour commencer par le nom (le nom de classe
pleinement qualifié).
+ Vous utiliserez généralement une intention explicite pour démarrer un composant
dans votre propre application, car vous connaissez le nom de la classe de
l'activité ou du service que vous souhaitez démarrer. Par exemple, vous pouvez
démarrer une nouvelle activité en réponse à une action de l'utilisateur ou
démarrer un service pour télécharger un fichier en arrière-plan.

> INTENT implicite


+ ne nommez pas un composant spécifique, mais déclarez plutôt une action
générale à effectuer, ce qui permet à un composant d'une autre application de le
gérer. Par exemple, si vous souhaitez afficher un emplacement sur une carte,
vous pouvez utiliser une intention implicite pour demander qu'une autre
application capable affiche un emplacement spécifié sur une carte.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 96


LES INTENTS
contenu
¤ Un objet Intent contient les information suivantes:
> le nom du composant ciblé (facultatif)
> l'action à réaliser, sous forme de chaine de caractères
> les données: contenu MIME et URI
> des données supplémentaires sous forme de paires clef/valeur
> une catégorie pour cibler un type d'application
> des drapeaux (informations supplémentaires)

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 97


LES INTENTS
Ajouter des informations

¤ Les Intent permettent de transporter des informations à destination de l'activité cible.


On appelle ces informations des Extra: les méthodes permettant de les manipuler
sont getExtra et putExtra. Lorsqu'on prépare un Intent et que l'on souhaite ajouter une
information de type "clef -> valeur" on procède ainsi:

¤ Du côté de l'activité recevant l'Intent, on récupère l'information de la manière suivante:

Si vous voulez transmettre un objet complexe via l’objet, il faut que


cet objet implémente la classe Serialisable ou Parcelable

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 98


LES INTENTS
Types d’INTENTS: Action

¤ Le premier paramètre de construction de l'Intent est le type de l'action véhiculé par cet
Intent. Ces types d'actions peuvent être les actions natives du système ou des actions
définies par le développeur.
¤ Plusieurs actions natives existent par défaut sur Android. La plus courante est
l'action Intent.ACTION_VIEW qui permet d'appeler une application pour visualiser un
contenu dont on donne l'URI.
¤ Voici un exemple d'envoi. Dans ce cas ou l'on utilise l'action native, il faut ajouter des
informations supplémentaires à l'aide de putExtra:

¤ Pour définir une action personnalisé, il suffit de créer une action unique à communiquer
aux autres activités qui veulent communiquer à travers cet Intent:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 99


LES INTENTS
Types d'Intent: catégories

¤ Les catégories d'Intent permettent de grouper les applications par grands types de
fonctionnalités (clients emails, navigateurs, players de musique, etc...). Par exemple,
on trouve les catégories suivantes qui permettent de lancer:

> DEFAULT: catégorie par défaut


> BROWSABLE: une activité qui peut être invoquée depuis un clic sur un navigateur
web, ce qui permet d'implémenter des nouveaux types de lien, e.g. foo://truc
> APP_MARKET: une activité qui permet de parcourir le market de télécharger des
applications
> APP_MUSIC: une activité qui permet de parcourir et jouer de la musique

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 100
LES INTENTS
Lancer une nouvelle activité

¤ Il y a plusieurs façons de créer l'objet de type Intent (plusieurs constructeurs) qui


permettra de lancer une nouvelle activité. Si l'on passe la main à une activité interne à
l'application, on peut créer l'Intent et passer la classe de l'activité ciblée par l'Intent:

¤ Le premier paramètre de construction de l'Intent est le contexte de l'application. Dans


certain cas, il ne faut pas mettre this mais faire appel à getApplicationContext() si
l'objet manipulant l'Intent n'hérite pas de Context.

¤ S'il s'agit de passer la main à une autre application, on donne au constructeur de


l'Intent les données et l'URI cible: l'OS est chargé de trouver une application pouvant
répondre à l'Intent en se basant sur le nom de l’action.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 101
LES INTENTS
Retour d’une activité
¤ Démarrer une nouvelle activité ne doit pas nécessairement être à sens unique. Vous
pouvez également démarrer une autre activité et recevoir un résultat. Pour recevoir un
résultat, appelez startActivityForResult () (au lieu de startActivity ()).

¤ L’application peut démarrer une application de caméra et recevoir la photo capturée en


conséquence. Ou elle peut démarrer l'application Contacts pour que l'utilisateur
sélectionne un contact et l’activité parente reçoit les coordonnées en conséquence.

¤ Le filtrage dans la classe parente permet de savoir qui avait appelé cette activité enfant
et permet de lire aussi les données retournée via l’attribut intent data :

102

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL


LES INTENTS
Broadcaster des informations

¤ Il est aussi possible d'utiliser un objet Intent pour broadcaster un message à but
informatif. Ainsi, toutes les applications pourront capturer ce message et récupérer
l'information s’elles sont abonnées à l’action envoyée par l’Intent.

¤ Les applications Android peuvent envoyer ou recevoir des messages diffusés à partir
du système Android et d'autres applications Android.

¤ Le système envoie automatiquement les diffusions lorsque divers événements du


système se produisent, par exemple lorsque le système bascule ou non en mode
avion. Les diffusions système sont envoyées à toutes les applications qui sont
abonnées pour recevoir l'événement.

Le nom de l’action devrait être une information unique qui différencie


un boradcast par rapport aux autres

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 103
LES INTENTS
Recevoir et filtrer les Intents

¤ Etant donné la multitude de messages véhiculés par des Intent, chaque application doit
pouvoir facilement "écouter" les Intents dont elle a besoin. Android dispose d'un
système de filtres déclaratifs permettant de définir dans le Manifest des filtres.
> Un filtre peut utiliser plusieurs niveaux de filtrage:
> action: identifie le nom de l'Intent. Pour éviter les collisions, il faut utiliser la
convention de nommage de Java
> category: permet de filtrer une catégorie d'action (DEFAULT, BROWSABLE, ...)
> data: filtre sur les données du message par exemple en utilisant android:host pour
filtrer un nom de domaine particulier
¤ En déclarant un filtre au niveau du tag activity, l'application déclare les types de
messsage qu'elle sait gérer et qui l'invoquent.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 104
LES INTENTS
Réception par un BroadcastReceiver d’une façon statique

¤ Les messages broadcastés par les applications sont réceptionnées par une classe
héritant de BroadcastReceiver. Cette classe doit surcharger la méthode onReceive.
Dans le Manifest, un filtre doit être inséré dans un tag receiver qui pointe vers la
classe se chargeant des messages.
¤ Dans le Manifest:

¤ La classe héritant de BroadcastReceiver:

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 105
LES INTENTS
Réception par un BroadcastReceiver d’une façon dynamique

¤ Il est possible de créer un récepteur et d'installer le filtre correspondant


dynamiquement. Pour cela il faut appeler la méthode registerReceiver en lui passant
un intent avec le bon nom d’action et un objet filtre d’une classe qui hérite de
BoradCatReceiver et redefinie la méthode onReceive

¤ Lorsque ce receiver n'est plus utile, il faut le désenregistrer pour ainsi libérer les
ressources:

¤ C'est particulièrement important puisque un filtre de réception reste actif même si


l'application est éteinte (elle peut être relancée si un message la concernant survient).

Il est possible de définir une variable BoradCastRecevier à l’intérieur


de l’activité pour implémenter la méthode onReceive.

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 106
LES INTENTS
Les messages natifs

¤ Un certain nombre de messages sont diffusés par l'OS:


> ACTION_BOOT_COMPLETED: diffusé lorsque le système a fini son boot
> ACTION_SHUTDOWN: diffusé lorsque le système est en cours d'extinction
> ACTION_SCREEN_ON / OFF: allumage / exctinction de l'écran
> ACTION_POWER_CONNECTED / DISCONNECTED: connexion / perte de
l'alimentation
> ACTION_TIME_TICK: une notification envoyée toutes les minutes
> ACTION_USER_PRESENT: notification recue lorsque l'utilisateur délock son
téléphone

¤ Tous les messages de broadcast se trouvent dans la documentation des Intents.

¤ D'autres actions permettent de lancer des applications tierces pour déléguer un


traitement:
> ACTION_CALL (ANSWER, DIAL): passer/réceptionner/afficher un appel
> ACTION_SEND: envoyer des données par SMS ou E-mail
> ACTION_WEB_SEARCH: rechercher sur internet

COURS DÉVELOPPEMENT MOBILE 2017-2018 ENSA KENITRA – UNIVERSITÉ IBN TOUFAIL 107

Vous aimerez peut-être aussi