1. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
Examen Java Avancé - Correction
Support de cours et notes manuscrites sur papier blanc autorisés.
I - Les réseaux téléphoniques (1 point)
Question 1) Quels sont les deux technologies qui sont en concurrence pour la 4G ? Citez
au moins une caractéristique principale de la technologie 4G.
Réponse :
Les deux technologies en concurrence pour la 4G sont le Long Term Evolution Advanced
(LTE-A) et le WiMax.
En caractéristiques, nous acceptions :
● Tout IP ;
● Moins coûteux (que l’UTMS) ;
● Rapidité.
II - Les design patterns (4.5 points)
Question 2) Expliquez, de façon précise, l’intérêt et les enjeux du modèle MVC.
Évidemment, il ne s’agit pas de recopier les diapositives du cours. (1 point)
Réponse :
Nous vous demandions de mettre en avant les trois composants du patron de conception,
en expliquant ce que chacun des composants réalise comme tâche. Ce patron de
conception est très utilisé dans la réalisation d’interfaces homme-machine.
D’autre part, nous souhaitions que vous parliez de l’indépendance de la vue par rapport
au modèle : ainsi, il est aisé de changer la vue sans toucher aux couches plus basses du
modèle.
Question 3) Que se passe-t-il si une tâche longue est directement exécutée dans le thread
de l’interface utilisateur ? (1 point)
Réponse :
Si une tâche longue est directement exécutée dans le thread de l’interface, l’affichage va se
bloquer le temps de la tâche.
Question 4) Comment y remédier ? (1 point)
Réponse :
Il faut faire exécuter la tâche longue dans un thread dédié.
Attention à bien utiliser les threads dédiés aux IHMs, comme SwingWorker dans Swing.
Question 5) Comment adapteriez-vous le design pattern Factory afin de ne fournir qu’une
seule instance d’un objet lorsqu’il est demandé, au lieu d’en fournir une nouvelle à chaque
fois ? Illustrez votre réponse à l'aide d'un exemple en Java. (1.5 point)
Réponse :
1/13
2. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
Nous acceptions toute implémentation et idée basée sur la description de la question :
● utiliser une variable dans la Factory qui stockerait les instances ;
● utiliser le patron de conception Singleton pour les instances fournies par la Factory.
● Exemple 1 : Utiliser une variable pour stocker les instances
public class MyAnimalFactory {
public static Map<String, Animal> instances = new HashMap<String, Animal>();
public MyAnimalFactory() {
}
public Animal instantitateAnimal(String breed) throws IllegalArgumentException {
if (instances.containsKey(breed)) {
return (Animal) instances.get(breed);
} else if (breed.equals(“cat”)) {
return new Cat();
} else if (breed.equals(“dog”)) {
return new Dog();
} else {
throw new IllegalArgumentException(
breed + “ breed not implemented”);
}
}
}
public interface Animal {
// Methods
}
public class Cat implements Animal {
// Methods
}
public class Dog implements Animal {
// Methods
}
● Exemple 2 : Les objets manipulés par la Factory sont des Singletons
Cette solution est moins élégante, mais acceptée.
public class MyAnimalFactory {
public MyAnimalFactory() {
}
public Animal instantitateAnimal(String breed) throws IllegalArgumentException {
2/13
3. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
if (breed.equals(“cat”)) {
return Cat.getInstance();
} else if (breed.equals(“dog”)) {
return Dog.getInstance();
} else {
throw new IllegalArgumentException(
breed + “ breed not implemented”);
}
}
}
public interface Animal {
// Methods
}
public class Cat implements Animal {
private static Cat instance;
private Cat() {
}
private static Cat getInstance() {
if (instance == null) {
instance = new Cat();
}
return instance;
}
// Methods
}
public class Dog implements Animal {
private static Dog instance;
private Dog() {
}
private static Dog getInstance() {
if (instance == null) {
instance = new Dog();
}
return instance;
}
// Methods
}
III - J2ME (2.5 points)
Question 6) Dans MIDP, quel est l’intérêt d’utiliser l’API de haut niveau (Screen), plutôt
que l’API de bas niveau (Canvas) ? Soyez précis dans votre réponse et ne recopiez pas
simplement vos diapositives. (1.5 point)
Réponse :
3/13
4. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
Nous attendions de vous que vous expliquiez le principe de ces deux APIs :
● l’API Screen permettant de créer des formulaires et interface basiques rapidement ;
● l’API Canvas permettant de créer des interfaces plus complexes, mais avec un code
plus conséquent.
Nous souhaitions que vous nous disiez, avec vos mots, ce que vous avez compris de ces
APIs.
Question 7) Quels sont les quatre domaines de sécurité vus dans le cours J2ME, et quelles
sont leurs caractéristiques ? (1 point)
Réponse :
Les domaines de sécurité sont appliqués à une MIDlet. Chaque domaine bénéficie d’un
ensemble de permissions sur l’API :
● Les Manufacturer et Operator domains possèdent toutes les permissions ;
● Le Third-Party domain où les permissions vont être demandées à l’utilisateur ;
● Les MIDlets de Untrusted domain ne vont pouvoir effectuer que les opérations ne
nécessitant pas de permissions particulières.
IV - Android (12 points)
A - Fonctionnement général
Question 8) Expliquez comment se passent les phases de compilation, de conversion et de
packaging d'une application Android, et le lien entre les différents étapes. (1 point)
Réponse :
Nous vous demandions le cycle de vie de votre application pendant le processus de
développement. C’est à dire à minima :
* développement de l’application avec du code source Java utilisant l’API Android ;
* compilation de l’application avec le compilateur java ;
* conversion de chaque fichier “class” au format “dex” adapté à la machine virtuelle Android ;
* packaging des fichiers “dex” dans un Android PacKage (APK) ;
* éventuellement la signature pour la mise en production.
En résumé :
java -> class -> dex -> apk (-> apk signé)
Question 9) Expliquez, au niveau système, comment est gérée une application Android vis-
à-vis du système Dalvik et de l’environnement Linux. (1 point)
Réponse :
Ici, il était essentiellement nécessaire de dire que chaque application Android se retrouve
isolée des autres.
Chaque instance d’application s’exécute dans un processus avec sa propre instance
de machine virtuelle de Dalvik. Bref un processus et une machine virtuelle Dalvik par
application.
Question 10) Comment sont gérées les activités lorsqu'on utilise
Context.startActivity() et le bouton retour ? (1 point)
Réponse :
4/13
5. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
Cette question vous demandait d’expliciter la slide 28 du cours sur Android.
Le fait de lancer une nouvelle activité avec Context.startActivity() va la mettre dans la stack
des activités Android ; le fait d’appuyer sur le bouton retour va détruire l’activité la plus
récente de la stack des activités et repasser à l’activité précédente.
B - IHM
Question 11) À partir de l’image suivante, écrire le fichier “layout.xml” correspondant (et
bien évidemment tous les autres fichiers dont vous aurez besoin en précisant leurs chemins
d'accès). Écrivez également l’activité permettant d’utiliser et d’afficher ce layout. (5 points)
Veillez également à respecter les consignes.
Réponse :
Le contenu du fichier layout.xml est donné à la fin de ce document.
L’activité permettant d’utiliser ce layout peut tout simplement être :
public class MarouActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.oncreate(savedInstanceState);
setContentView(R.layout.main);
}
}
5/13
6. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
Consignes :
● L’affichage peut être plus grand que la taille de l’écran. À vous de trouver une
solution afin de permettre à l’utilisateur de voir tout le contenu ;
● Utilisez le système d’internationalisation d’Android pour stocker les chaînes de
caractères (nous ne vous demandons pas de gérer le français) ;
● Images :
○ la première image a pour chemin d’accès : res/drawable/chatmignon.jpg
○ la seconde image : res/drawable/homeworkcat.jpg
● Le cadre à côté de la première image est en rouge, vous pouvez utiliser le code
hexadécimal #aa0000 ;
● Dans le fichier res/values/strings.xml, vous avez accès à cette définition :
6/13
7. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
<? xml version="1.0" encoding="utf-8"?>
<resources>
<string name="app_name">Java Avance Examen</string>
<string name="lorem">Accedebant enim eius asperitati, ubi inminuta vel laesa amplitudo imperii
dicebatur, et iracundae suspicionum quantitati proximorum cruentae blanditiae exaggerantium
incidentia et dolere inpendio simulantium, si principis periclitetur vita, a cuius salute velut filo
pendere statum orbis terrarum fictis vocibus exclamabant.</string>
</resources>
res/values/strings.xml
C - Android pratique
Question 12) Le programme Android suivant comporte 6 erreurs (bien qu'il compile),
corrigez les. (4 points)
Réponses :
1-2 Il manque l’appel à super.onCreate(savedInstanceState) dans les deux activités (deux
erreurs) ;
3 Il manque l’appel à setContentView(R.layout.main) dans la première activité afin de définir
l’interface ;
4 Il manque l’appel à setContentView(R.layout.kitteh) dans la seconde activité afin de définir
l’interface ;
5 Il manque l’accès aux permissions réseau dans le fichier AndroidManifest.xml :
<uses-permission android:name=”android.permission.INTERNET”/>
6 La déclaration de l’activité KittehActivity dans le fichier AndroidManifest.xml.
package fr.unilim.hellocat;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class HellocatActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
final Button button = (Button) findViewById(R.id.seeKitteh);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(v.getContext(), KittehActivity.class));
}
});
}
}
HellocatActivity.java
7/13
9. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
android:versionCode="1"
android:versionName="1.0">
<uses-sdk android:minSdkVersion="10" />
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".HellocatActivity"
android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
AndroidManifest.xml
Annexe
Attributs XML relatifs au
RelativeLayout
Attribute Name Related
Method
Description
android:layout_above Positions the bottom edge of this view above
the given anchor view ID.
android:layout_alignBaseline Positions the baseline of this view on the
baseline of the given anchor view ID.
android:layout_alignBottom Makes the bottom edge of this view match the
bottom edge of the given anchor view ID.
android:layout_alignLeft Makes the left edge of this view match the left
edge of the given anchor view ID.
android:layout_alignParentBottom If true, makes the bottom edge of this view
match the bottom edge of the parent.
android:layout_alignParentLeft If true, makes the left edge of this view match
the left edge of the parent.
android:layout_alignParentRight If true, makes the right edge of this view match
the right edge of the parent.
android:layout_alignParentTop If true, makes the top edge of this view match
the top edge of the parent.
android:layout_alignRight Makes the right edge of this view match the
right edge of the given anchor view ID.
android:layout_alignTop Makes the top edge of this view match the top
edge of the given anchor view ID.
9/13
10. Université de Limoges
Faculté des Sciences et Techniques
Master 1 Informatique
Semestre 7 – première session
2011
android:layout_below Positions the top edge of this view below the
given anchor view ID.
android:layout_centerHorizontal If true, centers this child horizontally within its
parent.
android:layout_centerInParent If true, centers this child horizontally and
vertically within its parent.
android:layout_centerVertical If true, centers this child vertically within its
parent.
android:layout_toLeftOf Positions the right edge of this view to the left
of the given anchor view ID.
android:layout_toRightOf Positions the left edge of this view to the right
of the given anchor view ID.
V - Question bonus (0 point) COBAGBTDBCOIAGT !
Question 11 : layout.xml
<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content" >
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
10/13