13
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

Correction examen-java-avancé-1

Embed Size (px)

Citation preview

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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 SingletonsCette solution est moins élégante, mais acceptée. public class MyAnimalFactory {

public MyAnimalFactory() {}

public Animal instantitateAnimal(String breed) throws IllegalArgumentException {

2/13

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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éralQuestion 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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 - IHMQuestion 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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 pratiqueQuestion 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 7 – première session

2011

package fr.unilim.hellocat; import android.app.Activity;import android.os.Bundle;import android.webkit.WebView; public class KittehActivity extends Activity {

WebView wv;

@Overridepublic void onCreate(Bundle savedInstanceState) {

wv = (WebView) findViewById(R.id.kittehWebView);wv.getSettings().setJavaScriptEnabled(true);wv.loadUrl("http://bit.ly/oKwSY5");

}}

KittehActivity.java

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <WebView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/kittehWebView"></WebView></LinearLayout>

kitteh.xml

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <Button android:layout_height="wrap_content" android:id="@+id/seeKitteh" android:layout_width="wrap_content" android:text="Button"></Button></LinearLayout>

main.xml

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.unilim.hellocat"

8/13

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 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

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 7 – première session

2011

android:orientation="vertical" > <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <TextView android:id="@+id/formlabel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Authentication form" /> <TextView android:id="@+id/login" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignRight="@+id/password" android:layout_below="@+id/formlabel" android:text="Login:" android:textSize="25px" /> <EditText android:id="@+id/loginentry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/login" android:layout_alignTop="@+id/login" android:layout_toRightOf="@+id/login" android:paddingBottom="0px" android:paddingTop="0px" android:text="Type your login here" /> <TextView android:id="@+id/password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@+id/login" android:text="Password:" android:textSize="25px" /> <EditText android:id="@+id/passwordentry" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignBottom="@+id/password"

11/13

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 7 – première session

2011

android:layout_alignLeft="@+id/loginentry" android:layout_alignTop="@+id/password" android:inputType="textPassword" android:paddingBottom="0px" android:paddingTop="0px" android:text="Type your password here" > </EditText> <Button android:id="@+id/okbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_below="@+id/passwordentry" android:layout_marginLeft="10px" android:text="OK" /> <Button android:id="@+id/cancelbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/okbutton" android:layout_marginLeft="10px" android:layout_toLeftOf="@+id/okbutton" android:text="Cancel" /> <Button android:id="@+id/helpbutton" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignTop="@+id/cancelbutton" android:layout_marginLeft="10px" android:layout_toLeftOf="@+id/cancelbutton" android:text="Help" /> </RelativeLayout> <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <ImageView android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/chatmignon" />

12/13

Université de LimogesFaculté des Sciences et Techniques

Master 1 InformatiqueSemestre 7 – première session

2011

<TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#aa0000" android:gravity="center_horizontal" android:text="Please... Give me your password..." /> </LinearLayout> <ImageView android:layout_width="fill_parent" android:layout_height="360px" android:scaleType="fitStart" android:src="@drawable/homeworkcat" /> <TextView android:layout_width="fill_parent" android:layout_height="fill_parent" android:text="@string/lorem"/>" </LinearLayout></ScrollView>

13/13