Progra Mobile 041204
Progra Mobile 041204
I.S.P./KASONGO
E-mail: ispkasongo1@[Link]
INSTRODUCTION GENERALE
Quel que soit l’endroit où nous pouvons être et le confort qui peut nous être
procuré, la maison est notre coin du monde, notre seul havre de paix et c’est là que
nous souhaitons avoir le plus de confort possible. Si l’on est bien chez-soi, on est bien
dans notre vie et avec notre entourage.
D’un point de vue scientifique, ce bien-être ne peut être assuré que par le
développement technologique. Ceci se traduit par la création et l’installation de
matériels connectés et programmés selon nos besoins assurant notre confort. De nos
jours, la maison intelligente est devenue le modèle parfait, un paradigme assurant une
vie d’extrême confort et de modernisme.
Ainsi avec le développement que l’électronique et la nanotechnologie ont
connu, tout est devenu miniature et accessible. De plus, avec ce cette Unité
d’Enseignement, nous allons montrer comment avec l’informatique et la
programmation, la programmation mobile a pris de l’ampleur et s’est attaquée à tous
les domaines notamment les Smartphones.
OBJECTIF DU COURS
L’étudiant qui l’aura suivi avec attention, aura des compétences ci-après :
✓ Comprendre les notions de base en programmation Mobile (Android et
Flutter) ;
✓ Appréhender les notions sur la programmation Orienté aux Objets en Dart et
Java ;
✓ Être capable de développer les applications Mobiles ;
✓ Être capable de manipuler une base des données avec une Application Android,
Flutter
~2~
b. Gratuit (presque)
Android est gratuit, autant pour vous que pour les constructeurs. S’il vous
prenait l’envie de produire votre propre téléphone sous Android, alors vous n’auriez
même pas à ouvrir votre porte-monnaie (mais bon courage pour tout le travail à
fournir !). En revanche, pour poster vos applications sur le Play Store, il vous en
coûtera la modique somme de 25$. Ces 25$ permettent de publier autant
d’applications que vous le souhaitez, à vie !
c. Facile à développer
Toutes les API mises à disposition facilitent et accélèrent grandement le travail.
Ces APIs sont très complètes et très faciles d’accès. De manière un peu caricaturale, on
peut dire que vous pouvez envoyer un SMS en seulement deux lignes de code
(concrètement, il y a un peu d’enrobage autour de ce code, mais pas tellement).
Une API, ou « interface de programmation » en français, est un ensemble de
règles à suivre pour pouvoir dialoguer avec d’autres applications. Dans le cas de
Google API, il permet en particulier de communiquer avec Google Maps.
d. Facile à vendre
Le Play Store (anciennement Android Market) est une plateforme immense et
très visitée ; c’est donc une mine d’opportunités pour quiconque possède une idée
originale ou utile.
e. Flexible
Le système est extrêmement portable, il s’adapte à beaucoup de structures
différentes. Les smartphones, les tablettes, la présence ou l’absence de clavier ou de
trackball, différents processeurs...
On trouve même des fours à micro-ondes qui fonctionnent à l’aide d’Android !
Non seulement c’est une immense chance d’avoir autant d’opportunités, mais en plus
Android est construit de manière à faciliter le développement et la distribution en
fonction des composants en présence dans le terminal (si votre application nécessite
d’utiliser le Bluetooth, seuls les terminaux équipés de Bluetooth pourront la voir sur le
Play Store).
d. Ingénieux
L’architecture d’Android est inspirée par les applications composites, et
encourage par ailleurs leur développement. Ces applications se trouvent
~4~
essentiellement sur internet et leur principe est que vous pouvez combiner plusieurs
composants totalement différents pour obtenir un résultat surpuissant. Par exemple, si
on combine l’appareil photo avec le GPS, on peut poster les coordonnées GPS des
photos prises.
I.1.2. Difficultés du développement pour les applications Android
Il existe certaines contraintes pour le développement Android, qui ne
s’appliquent pas au développement habituel !
Prenons un cas concret : la mémoire RAM est un composant matériel
indispensable. Quand vous lancez un logiciel, votre système d’exploitation lui réserve
de la mémoire pour qu’il puisse créer des variables, telles que des tableaux, des listes,
etc.
Ainsi, sur mon ordinateur, j’ai 4 Go de RAM, alors que je n’ai que 512 Mo sur
mon téléphone, ce qui signifie que j’en ai huit fois moins. Je peux donc lancer moins
de logiciels à la fois et ces logiciels doivent faire en sorte de réserver moins de
mémoire.
C’est pourquoi votre téléphone est dit limité, il doit supporter des contraintes
qui font doucement sourire votre ordinateur.
Voici les principales contraintes à prendre en compte quand on développe pour
un environnement mobile :
✓ Il faut pouvoir interagir avec un système complet sans l’interrompre. Android
fait des choses pendant que votre application est utilisée, il reçoit des SMS et
des appels, entre autres. Il faut respecter une certaine priorité dans l’exécution
des tâches. Sincèrement, vous allez bloquer les appels de l’utilisateur pour qu’il
puisse terminer sa partie de votre jeu de sudoku ?
✓ Comme je l’ai déjà dit, le système n’est pas aussi puissant qu’un ordinateur
classique, il faudra exploiter tous les outils fournis afin de débusquer les
portions de code qui nécessitent des optimisations.
✓ La taille de l’écran est réduite, et il existe par ailleurs plusieurs tailles et
résolutions différentes. Votre interface graphique doit s’adapter à toutes les
tailles et toutes les résolutions, ou vous risquez de laisser de côté un bon
nombre d’utilisateurs.
~5~
✓ Autre chose qui est directement lié, les interfaces tactiles sont peu pratiques en
cas d’utilisation avec un stylet et/ou peu précises en cas d’utilisation avec les
doigts, d’où des contraintes liées à la programmation événementielle plus
rigides. En effet, il est possible que l’utilisateur se trompe souvent de bouton.
Très souvent s’il a de gros doigts.
✓ Enfin, en plus d’avoir une variété au niveau de la taille de l’écran, on a aussi
une variété au niveau de la langue, des composants matériels présents et des
versions d’Android.
Il y a une variabilité entre chaque téléphone et même parfois entre certains
téléphones identiques. C’est un travail en plus à prendre en compte. Les conséquences
de telles négligences peuvent être terribles pour l’utilisateur. Saturez le processeur et il
ne pourra plus rien faire excepté redémarrer ! Faire crasher une application ne fera en
général pas complètement crasher le système, cependant il pourrait bien s’interrompre
quelques temps et irriter profondément l’utilisateur.
Il faut bien comprendre que dans le paradigme de la programmation classique
vous êtes dans votre propre monde et vous n’avez vraiment pas grand-chose à faire
du reste de l’univers dans lequel vous évoluez, alors que là vous faites partie d’un
système fragile qui évolue sans anicroche tant que vous n’intervenez pas. Votre but est
de fournir des fonctionnalités de plus à ce système et faire en sorte de ne pas le
perturber.
Bon, cela paraît très alarmiste dit comme ça, Android a déjà anticipé la plupart
des âneries que vous commettrez et a pris des dispositions pour éviter des catastrophes
qui conduiront au blocage total du téléphone. Si vous êtes un tantinet curieux, je vous
invite à lire l’annexe sur l’architecture d’Android pour comprendre un peu pourquoi il
faut être un barbare pour vraiment réussir à saturer le système.
I.1.3. En Résumé
➢ Google n’est pas le seul à l’initiative du projet Android. C’est en 2007 que
l’Open Handset Alliance (OHA) a été créé et elle comptait 35 entreprises à ses
débuts.
➢ La philosophie du système réside sur 6 points importants : il fallait qu’il soit
open source, gratuit dans la mesure du possible, facile à développer, facile à
vendre, flexible et ingénieux.
~6~
➢ Il ne faut jamais perdre à l’esprit que vos Smartphones sont (pour l’instant)
moins puissants et possèdent moins de mémoire que vos ordinateurs !
➢ Il existe un certain nombre de bonnes pratiques qu’il faut absolument respecter
dans le développement de vos applications. Sans quoi, l’utilisateur aura
tendance à vouloir les désinstaller.
➢ Ne bloquez jamais le Smartphone. N’oubliez pas qu’il fait aussi autre chose
lorsque vous exécutez vos applications.
➢ Optimisez vos algorithmes : votre Smartphone n’est pas comparable à votre
ordinateur en termes de performance.
➢ Adaptez vos interfaces à tous les types d’écran : les terminaux sont nombreux.
➢ Pensez vos interfaces pour les doigts de l’utilisateur final. S’il possède des gros
doigts et que vous faites des petits boutons, l’expérience utilisateur en sera
altérée.
➢ Si possible, testez vos applications sur un large choix de Smartphones. Il existe
des variations entre les versions, les constructeurs et surtout entre les matériels.
➢ Une bonne compréhension du langage Java est nécessaire pour suivre ce cours,
et plus généralement pour développer sur Android.
2. Les Outils et Installations
A. Les Outils
❖ IDE :
Un IDE est un logiciel dont l’objectif est de faciliter le développement,
généralement pour un ensemble restreint de langages. En d’autres termes, il vous est
possible de développer sans un IDE, mais en utiliser un est beaucoup plus pratique.
En effet, il contient un certain nombre d’outils, dont au moins un éditeur de
texte – souvent étendu pour avoir des fonctionnalités avancées telles que l’auto-
complétion ou la génération automatique de code - des outils de compilation et un
débogueur.
Dans le cas du développement Android, un IDE est très pratique pour ceux qui
souhaitent ne pas avoir à utiliser les lignes de commande.
Cette U.E se base sur Eclipse : en effet il est fourni par défaut par Google dans le
paquetage que nous téléchargeons. Vous pouvez aussi opter pour d’autres IDE
~7~
compétents tels que IntelliJ IDEA ou NetBeans. Je ne présenterai qu’Eclipse, vous aurez
à explorer vous-mêmes les autres outils si vous êtes intéressé.
Enfin ce que vous devez comprendre, c’est que le code sera pareil quel que soit
l’IDE que vous choisirez, l’IDE n’est qu’un outil, il ne fera pas de travail de
développement à votre place, il ne fera que vous aider dans cette tâche.
❖ JDK (Java Development Kit) :
En tant que développeur Java vous avez certainement déjà installé le JDK (pour
« Java Development Kit »), cependant on ne sait jamais ! Je vais tout de même vous
rappeler comment l’installer. En revanche, si vous l’avez bien installé et que vous êtes
à la dernière version, ne perdez pas votre temps et filez directement à la prochaine
section ! Un petit rappel technique ne fait de mal à personne. Il existe deux
plateformes en Java :
❖ Le JRE (Java Runtime Environment), qui contient la JVM (Java Virtual
Machine, rappelez-vous, j’ai expliqué le concept de machine virtuelle dans le
premier chapitre), les bibliothèques de base du langage ainsi que tous les
composants nécessaires au lancement d’applications ou d’applets Java. En gros,
c’est l’ensemble d’outils qui vous permettra d’exécuter des applications Java.
❖ Le JDK (Java Development Kit), qui contient le JRE (afin d’exécuter les
applications Java), mais aussi un ensemble d’outils pour compiler et déboguer
votre code ! Vous trouverez un peu plus de détails sur la compilation dans
l’annexe sur l’architecture d’Android
❖ SDK C’est-à-dire un kit de développement dans notre langue, c’est un ensemble
d’outils que met à disposition Google afin de vous permettre de développer
des applications pour Android.
❖ Le plugin : est un outil qui permet d’ajouter des fonctions supplémentaires a un
logiciel principal. On le qualifiera aussi de module d’extension ou add-on. Un
plugin ne peut pas fonctionner seul, il est entièrement dépendant de son
logiciel hôte.
❖ Plugin ADT : est une extension d’Eclipse afin de développer des applications
Android ;
A. Configuration de l’IDE
~8~
carrosserie pour la couleur de la carrosserie et qui pourra valoir « rouge », « bleu », que
sais-je ! D’ailleurs, une variable qui représente une couleur ?
Ça ne peut pas être une primitive, ce n’est pas une variable facile ça, une
couleur ! Donc cette variable sera aussi un objet, ce qui signifie qu’un objet peut
contenir des primitives ou d’autres objets. Mais dans le code, comment représenter un
objet ? Pour cela, il va falloir déclarer ce qu’on appelle une classe. Cette classe aura un
nom, pour notre voiture on peut simplement l’appeler Voiture, comme ceci :
Les variables ainsi insérées au sein d’une classe sont appelées des attributs. Il est
possible de donner des instructions à cette voiture, comme d’accélérer ou de s’arrêter.
Ces instructions s’appellent des méthodes, par exemple pour freiner :
s’appellent des paramètres. De plus, je veux que la méthode rende à la fin de son
exécution la nouvelle vitesse.
Cette valeur rendue à la fin de l’exécution d’une méthode s’appelle une valeur de
retour.
Par Exemple :
Parmi les différents types de méthode, il existe un type particulier qu’on appelle les
constructeurs. Ces constructeurs sont des méthodes qui construisent l’objet désigné par
la classe. Par exemple, le constructeur de la classe Voiture renvoie un objet de type
Voiture :
Pour contrôler les capacités des classes à utiliser les attributs et méthodes les unes des
autres, on a accès à trois niveaux d’accessibilité :
✓ Public, pour qu’un attribut ou une méthode soit accessible à tous ;
✓ Protected, pour que les éléments ne soient accessibles qu’aux classes filles ;
✓ Enfin Private, pour que les éléments ne soient accessibles à personne si ce n’est
la classe elle-même.
Enfin, il existe un type de classe mère particulier : les interfaces. Une interface
est impossible à instancier et toutes les classes filles de cette interface devront instancier
les méthodes de cette Interface — elles sont toutes forcément abstract.
➢ Encapsulation
L’encapsulation est la capacité permettant de créer et de contrôler l’accès a un
groupe d’éléments. Les classes fournissent le moyen le plus fiable d’assurer
l’encapsulation. Si nous pennons l’exemple d’un compte bancaire, dans une
programmation classique, il nous faudrait de nombreuses variables et procédures ou
fonctions pour manipuler les informations. La situation serait encore plus complexe si
nous devions gérer simultanément plusieurs comptes bancaires.
~ 14 ~
Il faudrait alors travailler avec des tableaux et jongler avec les index.
L’encapsulation permet de regrouper les informations et le code les manipulant dans
une classe. Si vous devez travailler avec plusieurs comptes bancaires simultanément
vous aurez alors plusieurs instances de la même classe, limitant ainsi le risque d’erreurs.
L’encapsulation assure également un contrôle sur l’utilisation des données et des
procédures ou fonctions. Vous pouvez utiliser les modificateurs d’accès, tels que
Private ou Protected, pour restreindre l’accès à certaines méthodes, propriétés ou
champs. Une règle fondamentale de l’encapsulation stipule que les données d’une
classe ne doivent être manipulées que par le code de la classe (procédures de
propriétés ou méthodes).
Cette technique est parfois appelée dissimulation de données. Elle assure la
sécurité de fonctionnement de votre code en masquant les détails internes de la classe
et en évitant ainsi qu’ils ne soient utilisés de manière inappropriée. Elle autorise aussi la
modification d’une partie du code sans perturber le fonctionnement du reste de
l’application.
➢ Polymorphisme
Le polymorphisme est une autre notion importante de la programmation
orientée objet. Par son intermédiaire, il est possible d’utiliser plusieurs classes de
manière interchangeable même si ces classes implémentent leurs propriétés et
méthodes de manière différente. Ces propriétés et méthodes sont utilisables par le
même nom, indépendamment de la classe à partir de laquelle l’objet a été construit.
Trois autres concepts sont également associés au polymorphisme. La surcharge,
la substitution et le masquage de membres permettent la définition de membres d’une
classe portant le même nom. Il existe cependant quelques petites distinctions entre ces
trois techniques.
La surcharge est utilisée pour concevoir des propriétés ou des méthodes portant
le même nom mais ayant un nombre de paramètres différents ou des types de
paramètres différents.
La substitution permet la redéfinition de méthodes ou propriétés héritées d’une
classe de base. Les membres substituent peuvent accepter le même nombre et type de
paramètres que la méthode ou propriété de la classe de base.
~ 15 ~
d. Renseignez les champs comme dans la figure 3.2b. Vous pourriez choisir
l’utilisation de fragments, mais pour faire simple nous poursuivrons sans
fragments. Chaque activité dispose d’un layout qui définit la façon dont les
composants seront disposés sur l’écran. Une activité peut être divisée en
portions (ou fragments) chacune ayant son propre layout. La notion de
fragment a été introduite pour favoriser la réutilisabilité de morceaux
d’activité (un fragment peut être définit une fois et réutilisé dans plusieurs
activités).
~ 17 ~
Exécution de l’application
Sur un émulateur
Un émulateur permet de reproduire le comportement d’un appareil réel d’une
façon virtuelle. L’utilisation d’un émulateur nous évite d’avoir à charger à chaque fois
~ 18 ~
l’application dans un appareil pour la tester. On pourra ainsi lancer l’application dans
l’IDE et elle s’exécutera sur un appareil virtuel appelé Android Virtual Device AVD qui
émule le comportement d’un téléphone, une tablette ou autre.
Pour configurer un émulateur, allez dans Tools > Android > AVD Manager, un
émulateur existe par défaut, mais vous pourriez rajouter d’autres appareils en cliquant
sur Create Virtual Device. Dans l’exemple de la figure 3.3a nous rajoutons une tablette
Nexus 10 avec une extra haute résolution (xhdpi). Nous sélectionnons ensuite le
processeur qui sera émulé (fig.3.3b). En cochant Show downloadable system images
vous pouvez télécharger d’autres images systèmes avec d’autres versions Android.
En cliquant sur Next Vous avez ensuite la possibilité de configurer d’autres
paramètres. Notez qu’à la création de l’appareil sa résolution vous est signalée. Ceci
est important à noter pour l’intégration d’images dans l’application.
Pour lancer l’exécution sur l’émulateur, appuyez sur le bouton d’exécution
(fig.3.4) et sélectionnez l’émulateur sur lequel vous souhaitez lancer l’application. Vous
pouvez cochez Use same device for future launches pour éviter d’avoir à sélectionner
l’appareil à chaque lancement. L’émulateur se lance, ça peut prendre quelques minutes
soyez patients. Rassurez-vous, vous n’aurez pas à le relancer à chaque fois que vous
compilez votre projet, laissez-le ouvert et à chaque fois que vous compilez et relancez
votre application, elle pourra être chargée dans l’émulateur en cours (il vous le
proposera parmi les Running devices).
~ 19 ~
Par ailleurs, tout ce qui touche à l’interface utilisateur sera intégré dans les sous
dossiers de res, dont voici une brève description : layout regroupe les fichiers XML qui
définissent la disposition des composants sur l’écran. Il contient déjà, dès la création du
projet, le layout de l’activité principale que nous avons créée. Deux fichiers XML sont
créé par Android Studio : activite_principale.xml et content_principale.xml. Le premier
définit l’apparence générale de l’activité : sa disposition, sa taille, sa barre d’outil,
éventuellement des boutons d’action flottant (dans notre cas un bouton email est
rajouté) ainsi que son layout qui n’est autre que content_principale.xml. Ce sera donc
ce dernier que nous manipulerons pour disposer les composants de l’activité et créer
notre interface graphique.
drawable-**** contient tout élément qui peut être dessiné sur l’écran : images
(En PNG de préférence), formes, animations, transitions, etc. Cinq dossiers drawable
permettent aux développeurs de proposer des éléments graphiques pour tout genre
d’appareil Android en fonction de sa résolution. En populant correctement ces dossiers
on peut ainsi créer des applications avec une interface qui s’adapte à chaque résolution
d’écran avec un seul [Link].
ldpi low-resolution dots per inch. Pour des images destinées à des écrans de basse
résolution (~120dpi) mdpi pour des écrans de moyenne resolution (~160dpi) hdpi
pour des écrans de haute résolution (~240dpi) xhdpi pour des écrans ayant une extra
haute résolution (~320dpi) xxhdpi pour des écrans ayant une extra extra haute
résolution (~480dpi).
❖ menu contient les fichiers XML définissant les menus
❖ Mipmap contient les images de l’icône de votre application sous différentes
résolutions.
❖ Values contient les fichiers XML qui définissent des valeurs constantes (des
chaines de caractères, des dimensions, des couleurs, des styles etc.)
❖ Gradle Android Studio utilise un système qu’on appelle Gradle pour compiler
et générer les applications. Pour fonctionner le Gradle a besoin d’un script qui
définit les règles de compilation et génération (configuration et dépendances).
Android Studio crée ainsi un script gradle pour chaque module ([Link]
(Module :app)) du projet ainsi qu’un script pour le projet entier ([Link]
(Project : MonAppli)). Dans le [Link] de l’application on définit entre
~ 22 ~
Les layouts sont des ViewGroup qui sont eux-mêmes des View
Dans le fichier content_principale.xml
✓ Supprimez l’élément <TextView>
✓ Remplacez l’élément <RelativeLayout> par <LinearLayout>
✓ Rajoutez l’attribut android:orientation et mettre sa valeur à “horizontal”
Le code dans le fichier devient ainsi
~ 24 ~
Nous avons ainsi placé un champ de saisie avec les attributs suivants :
android :id permet de donner un identifiant unique à ce View qu’on utilisera pour
référencer cet objet à l’intérieur de notre code.
Le symbol @ est nécessaire pour faire référence à un objet ressource à partir
d’un fichier XML. id est le type de ressource et chp_saisie est le nom qu’on donne à
notre ressource. Le symbole + est utilisé pour définir un ID pour la première fois. Il
indique aux outils du SDK qu’il faudrait générer un ID pour référencer cet objet. Le
symbole + ne doit être utilisé qu’une seule fois au moment où on déclare la ressource
~ 25 ~
pour la première fois. Par la suite si on veut faire référence à cet élément, à partir d’un
XML, il suffira d’écrire @id/chp_saisie.
❖ android :layout_width permet de spécifier la largeur de élément.
❖ “wrap_content” signifie que le View doit être aussi large que nécessaire pour
s’adapter à la taille de son contenu. Si en revanche on précise “match_parent”
comme on l’avait fait pour le LinearLayout, dans ce cas le EditText occuperait
toute la largeur de l’écran puisque sa largeur sera celle de son parent c.-à-d.
❖ le LinearLayout android :layout_height idem que pour le layout_width mais
pour la hauteur
❖ android :hint précise le texte par défaut à afficher dans le champ de saisie
quand il est vide. Nous aurions pu préciser directement la chaine de caractère
ici codée en dur, mais on préfère utiliser plutôt une ressource qu’on définira
dans [Link]. Noter que l’utilisation de + ici n’est pas nécessaire parce qu’on
fait référence à une ressource concrète (qu’on définira dans le fichier xml) et
non pas à un identifiant que le SDK doit créer.
Privilégiez toujours l’utilisation des ressources strings plutôt que des chaines de
caractères codées en dur. Cela permet de regrouper tout le texte de votre interface
dans un seul endroit pour simplifier la recherche et la mise à jour du texte, de plus ceci
est indispensable pour que votre application puisse être multilingue. L’IDE vous
affichera un avertissement en cas de non-respect de cette recommandation.
Après la modification du code que nous venons de faire, quand vous
sauvegarderez le fichier, un message d’erreur vous indiquera que l’identifiant
str_chp_saisie n’est pas connu. Nous allons donc le définir.
✓ Ouvrez le fichier [Link] qui se trouve dans res>values
✓ Rajoutez un nouveau string nommé str_chp_saisie et dont la valeur est “Entrer
un texte”
Votre fichier [Link] ressemblera donc à ceci
~ 26 ~
Lancez l’application. Vous devez voir un bouton à côté du champ de saisie (fig.3.8a).
Si vous souhaitez que votre champ de saisie occupe toute la largeur de l’écran qui reste
après le positionnement du bouton il faut spécifier un poids de 1 au
EditText et une largeur de 0.
~ 27 ~
Il faut absolument respecter cette signature pour la méthode afin que le système
puisse l’associer au nom donné par android:onClick. Le paramètre view est rempli par
le système et correspond à l’élément qui a généré l’évènement (le bouton Envoi dans
notre cas).
Avant d’aller plus loin dans le traitement, vous pouvez déjà tester si l’appel
s’effectue correctement quand le bouton est appuyé. Pour cela, mettez un point
d’arrêt à l’intérieur de la méthode envoiMessage() et lancez l’application en mode
Debug (fig. 3.5).
✓ Dans l’émulateur appuyez sur le bouton Envoi et vérifiez que le programme
entre bien dans la méthode envoiMessage().
~ 28 ~
Ceci est utile pour implémenter le comportement par défaut du bouton retour.
Une fois l’activité créée Android Studio génère :
Une chaine de caractère dans le fichier [Link] correspondant au titre de notre nouvelle
activité.
Lancement de l’activité
Pour faire communiquer les deux activés (l’activité principale et celle que nous
venons de créer) il faut passer par un Intent. Ce dernier représente l’intention de faire
quelque chose, et permet à l’activité principale de lancer l’activité d’affichage.
Créez une intention, Intent intent = new Intent (this, [Link]); sans
oublier d’importer la classe. (l’IDE vous le propose automatiquement Alt+
Import [Link];
A la construction de l’objet intent, nous précisons deux arguments : le premier
est un objet de type Context qui fait référence à l’application qui crée l’intention et le
deuxième précise le nom (de la classe) de l’activité qui reçoit l’intention. Comme le
Intent peut être utilisé pour faire communiquer deux applications, il ne suffit pas de
préciser uniquement le nom de l’activité qui le crée mais il faut également définir
l’application qui l’invoque.
~ 30 ~
✓ Lancez l’activité
startActivity(intent);
Compilez et exécutez l’application et appuyez sur le bouton Envoi. La nouvelle
activité se lance, pour l’instant elle est vide. Notez que le bouton de retour est déjà
fonctionnel et permet de remonter à l’activité principale. Ceci est dû au fait que nous
l’avons indiquée comme activité parent au moment de la création de notre activité
d’affichage.
Communication entre les activités
Envoyer un message
Si nous souhaitons que le texte tapé dans l’activité principale soit affiché dans
l’activité d’affichage, il faut faire communiquer les deux activités de sorte à ce que la
première envoie le texte à la deuxième. Ceci s’effectue en utilisant le même Intent qui
a servi pour le lancement de l’activité. En effet une intention peut aussi transporter un
paquet de données.
Modifier la méthode envoiMessage() pour qu’elle contienne le code ci-dessous, sans
oublier d’importer les classes nécessaires.
transportées par l’intention il faut définir une clé pour ces données moyennant une
constante publique.
Nous définissons donc la constante MESSAGE_SUPP dans la classe Principale.
Ensuite, pour afficher le message nous allons créer un TextView, lui affecter le message
puis le rajouter au layout.
Dans les sections précédentes nous avons appris à créer et rajouter des composants à
partir du fichier xml, ici nous le faisons dans le code.
Voici le code complet de la méthode onCreate()
~ 32 ~
Exécutez l’application, entrez un texte dans le champ de saisie et appuyez sur le bouton Envoi.
Votre texte devrait apparaitre sur l’écran suivant.
QUELQUES EXERCICES
1. Application « Hello word »
2. Sommation de deux nombres saisis dans un champ de texte
3. Elaboration d’une calculatrice avec les teste du signe choisi par l’utilisateur
Objectifs
- Être capable de créer une application iOS et Android ;
Quelques étapes à suivre pour installer et Configurer flutter dans Visual Studio Code
Résultat de la Compilation
Un widget est une description immuable d'une partie d'une interface utilisateur. En
général les widgets sont des éléments de l’interface graphique des utilisateurs.
Les widgets Flutter sont construits à l'aide d'un cadre moderne qui s'inspire de React.
L'idée centrale est que vous construisez votre interface utilisateur à partir de widgets.
Les widgets décrivent à quoi devrait ressembler leur vue compte tenu de leur
configuration et de leur état actuel. Lorsque l'état d'un widget change, le widget
reconstruit sa description, que le Framework diffère de la description précédente afin
de déterminer les changements minimaux nécessaires dans l'arborescence de rendu
sous-jacente pour passer d'un état à l'autre.
- StatefulWidget : Un widget dont l'état est mutable. L'état est une information qui
(1) peut être lue de manière synchrone lorsque le widget est
construit et (2) peut changer pendant la durée de vie du widget. Il est de la
responsabilité de l'implémenteur du widget de s'assurer que l' État est rapidement
notifié lorsqu'un tel état change, à l'aide de [Link] .
Un widget avec état est un widget qui décrit une partie de l'interface utilisateur en
créant une constellation d'autres widgets qui décrivent l'interface utilisateur plus
concrètement. Le processus de construction se poursuit de manière récursive jusqu'à
ce que la description de l'interface utilisateur soit entièrement concrète (par
~ 43 ~
Étant donné qu'un widget avec une GlobalKey peut être utilisé dans au plus un
emplacement dans l'arborescence, un widget qui utilise une GlobalKey a au plus un
élément associé. Le framework tire parti de cette propriété lors du déplacement d'un
widget avec une clé globale d'un emplacement dans l'arborescence à un autre en
greffant le sous-arbre (unique) associé à ce widget de l'ancien emplacement au nouvel
emplacement (au lieu de recréer le sous-arbre au nouvel emplacement). Les objets
State associés à StatefulWidgetsont greffés avec le reste du sous-arbre, ce qui signifie
que l'objet State est réutilisé (au lieu d'être recréé) dans le nouvel emplacement.
Cependant, pour pouvoir être greffé, le widget doit être inséré dans le nouvel
emplacement dans le même cadre d'animation dans lequel il a été supprimé de
l'ancien emplacement. Il existe deux catégories principales de StatefulWidget. Le
~ 44 ~
premier est celui qui alloue des ressources dans [Link] et les supprime dans
[Link] , mais qui ne dépend pas des InheritedWidget ou d'appeler [Link].
❖ Poussez l'état aux feuilles. Par exemple, si votre page a une horloge, plutôt que
de mettre l'état en haut de la page et de reconstruire la page entière à chaque
fois que l'horloge tourne, créez un widget d'horloge dédié qui se met à jour
uniquement ;
❖ Réduisez le nombre de nœuds créés de manière transitoire par la méthode de
construction et les widgets qu'elle crée. Idéalement, un widget avec état ne
créerait qu'un seul widget, et ce widget serait un RenderObjectWidget .
(Évidemment, ce n'est pas toujours pratique, mais plus un widget se rapproche
de cet idéal, plus il sera efficace.)
❖ Si un sous-arbre ne change pas, mettez en cache le widget qui représente ce
sousarbre et réutilisez-le chaque fois qu'il peut être utilisé. Il est massivement
plus efficace pour un widget d'être réutilisé que pour un nouveau widget (mais
configuré de manière identique) à créer. La factorisation de la partie avec état
dans un widget qui prend un argument enfant est une façon courante de le
faire ;
❖ Utilisez des constwidgets dans la mesure du possible. (Cela équivaut à mettre en
cache un widget et à le réutiliser.) ;
~ 45 ~
Exemple 1 : Ceci est un squelette d'une sous-classe de widget avec état appelée
YellowBird. Dans cet exemple. L’État n'a pas d'État réel. L'état est normalement
représenté sous forme de champs de membres privés. De plus, les widgets ont
normalement plus d'arguments de constructeur, chacun correspondant à une finale
propriété.