UPMC/Licence/Info/2I013 Flowdroid Android. Janvier 2015. Exemple de mise en œuvre



Documents pareils
Tutoriel Android. Pour démarrer la programmation d'applications Android

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Créer des applications Android

TP SIN Programmation sur androïde Support : eclipse

TP au menu «UI ANDROID»

SOMMAIRE

Programmation Android L3 informatique

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

Tutoriel Android - TP de prise en main

Programmation Mobile Android Master CCI

Les fondamentaux du développement d applications Java

Encore plus de widgets et de conteneurs

Programmer en JAVA. par Tama

Tutorial pour une application simple

1.3 Gestion d'une application

Introduction ANDROID

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

De Java à Android version 0.1

Projet Android (LI260) Cours 2

Gestion des différentes tailles d écran

Développement sous Android

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Développement mobile MIDP 2.0 Mobile 3D Graphics API (M3G) JSR 184. Frédéric BERTIN

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Un ordonnanceur stupide

Warren PAULUS. Android SDK et Android x86

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Développement Android. J.-F. Couchot

Education Delivery Intelligent Tool

Module Architecture des systèmes mobiles : Android première partie Didier FERMENT - UPJV

Programmation mobile avec Android

TP2 : Client d une BDD SqlServer

Premiers Pas en Programmation Objet : les Classes et les Objets

Projet de programmation (IK3) : TP n 1 Correction

INITIATION AU LANGAGE JAVA

Interfaces graphiques avec l API Swing

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Auto-évaluation Programmation en Java

Développement Logiciel

Synchro et Threads Java TM

Threads. Threads. USTL routier 1

Génie Logiciel et Interaction Homme-Machine PROJET UCAMPUS

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

Bases Java - Eclipse / Netbeans

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Épisode 2 : Les outils de développement Alain Menu édition 2.1, septembre 2013

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

as Architecture des Systèmes d Information

Programmation avec des objets : Cours 7. Menu du jour

Programmation par les Objets en Java

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Introduction à la programmation concurrente

RAPPELS SUR LES METHODES HERITEES DE LA CLASSE RACINE Object ET LEUR SPECIALISATION (i.e. REDEFINITION)

Une introduction à la technologie EJB (2/3)

Corrigé des exercices sur les références

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

La programmation orientée objet et le langage C++

Introduction au langage C

Cours 1: Java et les objets

TP1 : Initiation à Java et Eclipse

Programmation Par Objets

Optimiser pour les appareils mobiles

Développement d un logiciel de messagerie instantanée avec Dotnet (version simplifiée)

TD3: tableaux avancées, première classe et chaînes

Utilisation d objets : String et ArrayList

NFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007

J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation

Cours de Systèmes d Exploitation

Développement d'applications pour Android. M. Dalmau IUT de Bayonne Pays Basque

Android UIThread, Thread, Handler et AsyncTask

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

LMI 2. Programmation Orientée Objet POO - Cours 9. Said Jabbour. jabbour@cril.univ-artois.fr

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

Création d un service web avec NetBeans 5.5 et SJAS 9

Eclipse atelier Java

Remote Method Invocation Les classes implémentant Serializable

Android 4 Les fondamentaux du développement d'applications Java

Info0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java

TD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting

2. Comprendre les définitions de classes

Bases de données et fournisseurs de contenu

Les connexions sans fil avec Android. JMF (Tous droits réservés) 1

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

PROGRAMMATION PAR OBJETS

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Java Licence Professionnelle CISII,

Applet pour visualiser les variables «automate» notifiées

Java Licence Professionnelle CISII, Cours 2 : Classes et Objets

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction

Table des matières. Partie I Concepts de base Préface... VII

Objets et Programmation. origine des langages orientés-objet

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

Programme Compte bancaire (code)

Java Licence Professionnelle Cours 7 : Classes et méthodes abstraites

Android 101. Rémi Forax

Plan du cours. Historique du langage Nouveautés de Java 7

Transcription:

UPMC/Licence/Info/2I013 Flowdroid Android Janvier 2015 Exemple de mise en œuvre

Un jeu pour les enfants programmeurs Une variante du taquin Une grille 9x9 dont les cases contiennent les chiffres de 1 à 9 dans un ordre aléatoire. Remettre les nombres dans l ordre en échangeant les cases contigües. Actions de jeu : 1. poser le doigt sur une case 2. le glisser jusqu à une case voisine 3. quand on lève le doigt, le contenu des deux cases sont inversés

Un modèle du jeu public class GaminModel Fin de partie (les chiffres sont dans l ordre) public boolean isachieved() Sélection d une première case public boolean actionselect(int x, int y) Inversion de la case(x,y) avec la case sélectionnée public boolean actionswap(int x, int y) Nouvelle distribution aléatoire public void renew() Contenu de la case(x,y) public int get(int x, int y)

Les classes pour Android Contient le modèle du jeu : création et accès public class TheApplication extends Application L activité principale (et unique) : présente l écran du jeu, définit la réaction aux boutons NEW et EXIT public class GaminActivity extends Activity La grille interactive du jeu : définit l affichage l état de la grille, réagit aux événements tactiles, lié au thread d affichage. public class GameView extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener Le thread d afficage : actualise périodiquement le dessin de la grille class GameViewThread extends Thread

Le fichier AndroidManifest.xml Description des composants de l application : engendré par l IDE puis modifié <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="eleph.android.games.gamin"> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:name="theapplication"> <activity android:name="gaminactivity"> <intent-filter> <action android:name="android.intent.action.main"/> <category android:name="android.intent.category.launcher"/> </intent-filter> </activity> </application> </manifest> Ajout : android:name="theapplication"

Que dit le «manifeste»? Balise manifest C est un manifeste pour les android packages (applications Android) xmlns:android="http://schemas.android.com/apk/res/android" Les composants JAVA de l application sont dans le package JAVA package="eleph.android.games.gamin" Balise application L application possède sa propre (sous)classe de Application android:name="theapplication" Le nom publié de l application («écran des applications») est défini dans les ressources values/strings.xml android:label="@string/app_name" L icone de l application est dans les ressources drawable* android:icon="@drawable/ic_launcher"

Que dit le «manifeste»? Balise activity L application contient l activité GaminActivity android:name="gaminactivity" Balise intent-filter Elle est déclarée comme étant l activité principale action android:name="android.intent.action.main" Elle est exécutable depuis «l écran des applications» category android:name="android.intent.category.launcher"

Lancement d une application Android Lorsque l application est lancée (pression sur l icône de l application dans «l écran des applications») 1. Le fichier manifeste est lu par le système. 2. Il crée une instance de TheApplication et invoque sa méthode oncreate Cette instance persiste en mémoire tant que l utilisateur ne quitte pas «explicitement» l application ou que le système ne «récupère» pas la mémoire allouée. 3. Il crée une instance de l activité principale GaminActivity et invoque sa méthode oncreate, puis sa méthode onstart. L écran d accueil définit pour l activité devient visible. Cette instance est suspendue, arrêtée ou détruite lorsque l application invoque une autre activité (écran) ou que l utilisateur n invoque pas une autre application.

Cycle de vie d une activité http ://developer.android.com/training/basics/activity-lifecycle/starting.html

TheApplication Redéfinition de oncreate et définition de getgame public class TheApplication extends Application { GaminModel thegame; @Override public void oncreate() { super.oncreate(); thegame = new GaminModel(); GaminModel getgame() { return thegame;

GaminActivity public class GaminActivity extends Activity { // référence sur (l instance de) l application TheApplication app; // visualisation et m-à-j réf. application @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); // Visualisation app = (TheApplication)this.getApplication(); // Réactions aux boutons de l activité public void onclickexit(view view) { finish(); public void onclicknew(view view) { app.getgame().renew();

Composants de l interface graphique LinearLayout TextView LinearLayout Button GameView

Fichier main.xml Structure XML Structure d emboîtements graphiques <LinearLayout [...] > <TextView [...] /> <LinearLayout [...] > <Button [...] /> <Button [...] /> </LinearLayout> <eleph.android.games.gamin.gameview [...] /> </LinearLayout> Balises XML Sous classes JAVA (View)

Composant principal Contient tous les autres objets graphiques alignés verticalement Emplit la totalité de l écran en largeur et en hauteur <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" >

Composant texte Ajusté en largeur et en hauteur autour de son contenu Centré dans son conteneur Le texte est défini dans les ressources values/string.xml <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:text="@string/main_message" />

Une zone pour les boutons Contient des objets alignés horizontalement Centré dans son conteneur Ajusté en largeur et en hauteur autour de son contenu <LinearLayout android:orientation="horizontal" android:layout_gravity="center" android:layout_width="wrap_content" android:layout_height="wrap_content" >

Un bouton Identifié dans l application par new_button S affiche avec l intitulé NEW Ajusté autour de son contenu (texte) Centré dans son conteneur Marges internes et externes Couleur de fond : vert Géré par la méthode onclicknew <Button android:id="@+id/new_button" android:text="new" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:padding="6dp" android:layout_margin="12dp" android:background="#0f0" android:onclick="onclicknew" />

La grille de jeu Composant définit par le programmeur sous le nom GameView (package eleph.android.games.gamin) Identifié dans l application par gameview (l identifiant est engendré à la compilation) Centré dans son conteneur De la largeur et hauteur fixées <eleph.android.games.gamin.gameview android:id="@+id/gameview" android:layout_gravity="center" android:layout_width="150dp" android:layout_height="150dp" />

La «surface» de jeu Une sous-classe de SurfaceView qui implémente View.OnTouchListener pour réagir aux événements tactile qui implémente SurfaceHolder.CallBack pour interagir avec un thread d affichage public class GameView extends SurfaceView implements SurfaceHolder.Callback, View.OnTouchListener

Ressource de la surface de jeu Variables d instances app : référence vers l application gameviewthread : le thread pour l affichage paint : contexte graphique (style et couleur) pour le dessin de la grille canvaswidth : largeur (en pixels) de la surface d affichage cellwidth largeur (en pixels) de chaque case de la grille de jeu TheApplication app; GameViewThread gameviewthread; Paint paint = new Paint(); int canvaswidth; int cellsize;

Création de la surface de jeu Constructueur public GameView(Context context, AttributeSet attrs) { super(context, attrs); getholder().addcallback(this); this.getapp(context); getholder().addcallback(this) est nécessaire pour que l objet soit avisé de la création effective de sa surface d affichage à l écran getapp donne initialise la référence de l application (voir ci-dessous) final void getapp(context context) { app = (TheApplication) (context.getapplicationcontext()) NB : «final» car appelée dans un constructeur.

Création de la surface de jeu : post-traitement Méthode invoquée lorsque la surface a été effectivement allouée sur l écran : on peut alors commencer à dessiner et interagir tactilement public void surfacecreated(surfaceholder holder) { gameviewthread = new GameViewThread(getHolder(), this); gameviewthread.setrunning(true); gameviewthread.start(); setontouchlistener(this); 1. le thread gameviewthread est créé et «lancé» c est un processus parallèle au processus de l application qui appelle périodiquement la méthode de dessin de l instance de GameView qui l a créé et lancé 2. l instance «s abonne» aux événements tactiles

Destruction de la surface de jeu, pré-traitement Arrêter le thread de dessin avant la destruction public void surfacedestroyed(surfaceholder holder) { boolean retry = true; gameviewthread.setrunning(false); while (retry) { try { gameviewthread.join(); retry = false; catch (InterruptedException e) { Signale au thread sa fin et attend qu il ait effectivement terminé.

Interactions de jeu Méthode de traitement des événements tactiles : par cas, selon la position de l événement public boolean ontouch(view view, MotionEvent event) { int x = (int) event.getx(); int y = (int) event.gety(); int action = event.getaction(); GaminModel thegame = app.getgame(); switch (action) { case MotionEvent.ACTION_DOWN: { return thegame.actionselect(x/cellsize, y/cellsize); case MotionEvent.ACTION_MOVE: { return true; // on pourrait faire des trucs ici :) case MotionEvent.ACTION_UP: { return thegame.actionswap(x/cellsize, y/cellsize); default: return false;

Définition de dessin de l affichage Méthode public void ondraw(canvas canvas) 1. initialisations 2. couleur de fond (jaune si partie finie, gris, sinon) 3. traits de séparations des cases 4. placement des chiffres

Dessin 1 : initialisations largeur de la surface de dessin on en déduit la largeur des cases réinitialisation contexte de dessin état du modèle du jeu canvaswidth = canvas.getwidth(); cellsize = canvaswidth / 3; //! Constante paint.reset(); GaminModel thegame = app.getgame();

Dessin 2 : couleur de fond Méthodes de dessin de la classe Canvas if (thegame.isachieved()) canvas.drawcolor(color.yellow); else canvas.drawcolor(color.gray);

Dessin 3 : traits de séparation Définition de la couleur des traits, boucle pour les verticales, boucle pour les horizontales paint.setcolor(color.black); for (int x = 0; x < canvaswidth; x += cellsize) { canvas.drawline(x, 0, x, canvaswidth, paint); for (int y = 0; y < canvaswidth; y += cellsize) { canvas.drawline(0, y, canvaswidth, y, paint);

Dessin 4 : les chiffres Taille des caractères et «anti-aliasing», boucle de dessin des chiffres contenu dans le modèle (boucle sur les indices du modèle, calcul de positionnement en mileu de case) //! Constantes un peu partout paint.settextsize(50); paint.setflags(paint.anti_alias_flag); for (int x = 0; x < 3; x++) { for (int y = 0; y < 3; y++) { canvas.drawtext(integer.tostring(thegame.get(x, y)), (x * cellsize) + 11, (cellsize + y * cellsize) - 6, paint);

Réalisation du dessin : GameViewThread Le dessin est réalisé par appel de la méthode ondraw de GameView. L appel de la méthode ondraw est déléguée à un processus autonome (thraed) lancé lorsque la surface d affiche est créée. L appel à ondraw est placé dans la mathode run du thread. @Override // version simplifiée public void run() { Canvas c = null; while(running) { try { c = this.surfaceholder.lockcanvas(null); synchronized (this.surfaceholder) { if ((c!= null) && (running)) this.thegame.ondraw(c); finally { if (c!= null) this.surfaceholder.unlockcanvasandpost(c);