:: Enseignements :: Master :: M2 :: 2012-2013 :: Développement Android ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | 1ères activités |
Lors de ce TD, nous nous familiarisons avec Android Debug Bridge et réalisons nos premières activités (dont l'incontournable Hello World).
Exercice 1 - Communication avec un appareil Android
Nous souhaitons communiquer avec un appareil sous Android. Soit nous disposons déjà d'un tel appareil (on utilisera alors la connexion USB) ; soit nous n'en avons pas et crééons une machine virtuelle.
Pour un appareil physique, il faut préalablement activer le débuggage USB dans le menu de paramétrage. Ceci permet de lancer le démon adbd auquel le client adb pourra se connecter.
Pour gérer des machines virtuelles, on peut utiliser l'Android Virtual Device (AVD) manager avec
android avd
. Plusieurs architectures sont disponibles (ARM, MIPS et x86). Pour une meilleure fluidité d'exécution, on pourra opter pour l'architecture x86 avec une image 4.1.2 si l'on dispose d'un processeur Intel VT supportant l'hyperviseur HAXM. Les PCs des salles machines n'intégrent pas encore les paquetages nécessaires à l'exploitation des extensions VT; il est néanmoins possible de suivre
ces instructions sur sa machine personnelle.
Exercice 2 - Hello World
La brique de base d'une application Android est l'activité qui correspond à une interface graphique interagissant avec l'utilisateur (une application peut comporter plusieurs écrans d'interactions avec plusieurs activités ainsi que des services en tâche de fond et des composants de fourniture de contenu à des applications tierces). L'activité Hello World affiche un court message avec un bouton permettant de quitter l'application.
Créer une activité Hello World en gérant manuellement les composants graphiques ajoutés. Tous les composants de la bibliothèque graphique héritent de View ; ils sont organisés sous forme d'arbre, les noeuds internes étant des container de type ViewGroup (offrant différents layouts) et les feuilles des composants tels que TextView, Button (dont nous aurons besoin ici).
Faire une deuxième version de l'activité en utilisant une description XML du layout. On essaiera également d'internationaliser notre application en anglais et en français (en utilisant des strings ressources).
Ajouter maintenant un deuxième bouton lançant une deuxième activité Hello World (la pile de tâche doit donc contenir 2 activités Hello World). Le lancement est réalisé par
startActivity(new Intent(this, HelloWorld.class))
. On pourra ajouter au texte affiché la date de création (
new Date().toString()
) pour distinguer les deux activités. Utiliser le bouton "retour" pour dépiler les activités créées et revenir à l'écran d'accueil. Modifier la propriété
launchMode de l'activité dans le manifeste à
singleTop : que se passe-t-il lorsque l'on utilise le bouton de lancement d'activité depuis Hello World ? Notons qu'il est possible de capturer la tentative de relancement d'une activité en redéfinissant
void onNewIntent(Intent intent)
.
Exercice 3 - Cycle de vie d'un chronomètre
On souhaite implanter une activité fournissant un chronomètre.
- Définir un layout XML pour les composants graphiques utilisés : un champ texte affichant le temps écoulé, un bouton de départ, un bouton d'arrêt, un bouton de réinitialisation et un bouton afin de mettre à jour le temps affiché.
- Redéfinir la méthode onCreate() de l'activité afin d'initialiser l'activité (chargement du layout).
- Créer des méthodes startChrono() et stopChrono() pour démarrer et arrêter le chronomètre. Relier ensuite ces méthodes aux évènements de clic des boutons. Expliquer pourquoi il est préférable d'utiliser System.nanoTime() plutôt que System.currentTimeMillis() pour calculer des différences de temps.
- Implanter la méthode updateChrono() (et la relier au clic du bouton correspondant) pour afficher dans le champ de texte le temps chronométré actuel.
- Lancer l'activité sur au moins deux machines virtuelles avec des tailles et résolutions d'écran différentes afin de tester l'application ainsi que le rendu des layouts. On souhaite pouvoir afficher les temps cumulés de plusieurs périodes de chronométrage.
- Que se passe-t-il si l'activité est reléguée en arrière-plan ? Si l'écran est tourné ? Si le système la détruit par manque de mémoire et qu'on la relance ? Implanter une méthode onSaveInstanceState(Bundle savedInstanceState) qui sera appelée avant que l'application soit stoppée pour sauvegarder dans un Bundle le temps cumulé des périodes précédentes ainsi que le temps de départ de l'activité actuelle. Rajouter également dans la méthode onCreate() du code afin de récupérer ces données en cas de redémarrage de l'activité.
- Devoir appuyer sur un bouton afin de mettre à jour l'affichage du temps n'est pas pratique. On veut disposer d'un rafraîchissement automatique. Pour cela, nous crééons une nouvelle thread avec une boucle appelant setText() sur le champ texte. Pourquoi cela n'est-il pas correct (la même problématique est rencontrée avec d'autres bibliothèques graphiques telles que Swing) ? La méthode View.post() pourrait être utile. Un autre problème est lié à la thread continuant de s'exécuter inutilement lorsque l'activité est en arrière-plan. Redéfinir les méthodes onResume() et onPause() afin d'y respectivement lancer la thread de rafraîchissement et la stopper.
© Université de Marne-la-Vallée