cours android

Upload: sonia-sonsson

Post on 13-Jul-2015

1.012 views

Category:

Documents


0 download

TRANSCRIPT

Dveloppement sous AndroidJean-Francois Lalande - November 2011 Le but de ce cours est de dcouvrir la programmation sous Android, sa plate-forme de dveloppement et les spcificits du dveloppement embarqu sur tlphone mobile. Ce cours est bas sur l'excellent livre Programmation Android, de la conception au dploiement avec le SDK Google Android 2 [PA].

Ce cours est mis disposition par Jean-Franois Lalande selon les termes de la licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage l'Identique 3.0 non transpos.

1 Plan du module

Ensi de Bourges - Filire STI

1 Plan du module Plan du module1 Plan du module 2 Le SDK Android 3 Interfaces graphiques 4 Les Intents 5 Persistance des donnes 6 Les services, processus et threads 7 Connectivit 8 Divers 9 Annexes 10 Bibliographie 2 3 9 19 27 35 44 51 53 75

Dveloppement sous Android - J.-F. Lalande

2 / 79

2 Le SDK Android

Ensi de Bourges - Filire STI

2 Le SDK Android2.1 Android L'Operating System Projet ADT Les lments d'une application Le Manifest de l'application 2.2 Les ressources Les chaines Autres valeurs simples Autres ressources 2.3 Les activits Sauvegarde des interfaces d'activit Dmonstration 3 3 4 4 4 5 5 6 6 7 7 8

2.1 AndroidL'ecosystme d'Android s'appuie sur deux piliers: le langage Java le SDK qui permet d'avoir un environnement de dveloppement facilitant la tche du dveloppeur Le kit de dveloppement donne accs des exemples, de la documentation mais surtout l'API de programmation du systme et un mulateur pour tester ses applications. Stratgiquement, Google utilise la licence Apache pour Android ce qui permet la redistribution du code sous forme libre ou non et d'en faire un usage commercial. Le plugin Android Development Tool permet d'intgrer les fonctionnalits du SDK Eclipse. Il faut l'installer comme un plugin classique en prcisant l'URL du plugin. Ensuite, il faut renseigner l'emplacement du SDK (pralablement tlcharg et dcompress) dans les prfrences du plugin ADT.

L'Operating SystemAndroid est en fait un systme de la famille des Linux, pour une fois sans les outils GNU. L'OS s'appuie sur: un noyau Linux (et ses drivers) une machine virtuelle: Dalvik Virtual Machine des applications (navigateur, gestion contact, application de tlphonie...) des bibliothques (SSL, SQLite, OpenGL ES, etc...) [Dalvik] est le nom de la machine virtuelle open-source utilise sur les systmes Android. Cette machine virtuelle excute des fichiers .dex, plus ramasss que les .class classiques. Ce format vite par exemple la duplication des String constantes. La machine virtuelle utilise elle-mme moins d'espace mmoire et l'adressage des constantes se fait par un pointeur de 32 bits.

Dveloppement sous Android - J.-F. Lalande

3 / 79

Projet ADT

Ensi de Bourges - Filire STI

[Dalvik] n'est pas compatible avec une JVM du type Java SE ou mme Java ME. La librairie d'accs est donc redfinie entirement par Google.

Projet ADTUn projet bas sur le plugin ADT est dcompos de la manire suivante: src/: les sources Java du projet libs/: bibliothques tierces res/: res/drawable: ressources images res/layout: description des IHMs en XML res/values: chaines de caractres et dimensions gen/: les ressources auto gnres par ADT assets/: ressources brutes (raw bytes) bin/: bin/classes: les classes compiles en .class bin/classes.dex: excutable pour la JVM Dalvik bin/myapp.zip: les ressources de l'application bin/myapp.apk: application empaquete avec ses ressource et prte pour le dploiement

Les lments d'une applicationUne application Android est compose des lments suivants: des activits (android.app.Activity): il s'agit d'une partie de l'application prsentant une vue l'utilisateur des services (android.app.Service): il s'agit d'une activit tche de fondsans vue associe des fournisseurs de contenus (android.content.ContentProvider): permet le partage d'informations au sein ou entre applications des widgets (android.appwidget.*): une vue accroche au Bureau d'Android des Intents (android.content.Intent): permet d'envoyer un message pour un composant externe sans le nommer explicitement des rcepteurs d'Intents (android.content.BroadcastReceiver): permet de dclarer tre capable de rpondre des Intents des notifications (android.app.Notifications): permet de notifier l'utilisateur de la survenue d'vnements

Le Manifest de l'applicationLe fichier AndroidManifest.xml dclare l'ensemble des lments de l'application. ... ... ...

2.2 Les ressourcesLes ressources de l'applications sont utilises dans le code au travers de la classe statique R. ADT re-gnre automatiquement la classe statique R chaque changement dans le projet. Toutes les ressources sont accessibles au travers de R, ds qu'elles sont dclares dans le fichier XML ou que le fichier associ est dpos dans le rpertoire adquat. Les ressources sont utilises de la manire suivante: android.R.type_ressource.nom_ressource qui est de type int. Il s'agit en fait de l'identifiant de la ressource. On peut alors utiliser cet identifiant ou rcuprer l'instance de la ressource en utilisant la classe Resources: Resources res = getResources(); String hw = res.getString(R.string.hello); XXX o = res.getXXX(id); Une mthode spcifique pour les objets graphiques permet de les rcuprer partir de leur id, ce qui permet d'agir sur ces instances mme si elles ont t cres via leur dfinition XML: TextView texte = (TextView)findViewById(R.id.le_texte); texte.setText("Here we go !");

Les chainesLes chaines constantes de l'application sont situes dans res/values/strings.xml. L'externalisation des chaines permettra de raliser l'internationalisation de l'application. Voici un exemple:

Dveloppement sous Android - J.-F. Lalande

5 / 79

Autres valeurs simples

Ensi de Bourges - Filire STI

Hello Hello JFL ! AndroJF

Resources res = getResources(); String hw = res.getString(R.string.hello);

Autres valeurs simplesPlusieurs fichies xml peuvent tre placs dans res/values. Cela permet de dfinit des chaines, des couleurs, des tableaux. L'assistant de cration permet de crer de nouveaux fichiers de ressources contenant des valeurs simples, comme par exemple un tableau de chaines: it1 it2

Autres ressourcesD'autres ressources sont spcifiables dans res: les menus

Dveloppement sous Android - J.-F. Lalande

6 / 79

2.3 Les activits

Ensi de Bourges - Filire STI

les images (R.drawable) des dimensions (R.dimen) des couleurs (R.color)

2.3 Les activitsUne application Android tant heberge sur un systme embarqu, le cycle de vie d'une application ressemble celle d'une application Java ME. L'activit peut passer des tats: dmarrage -> actif: dtient le focus et est dmarr (onStart invoqu) actif -> suspendue: ne dtient plus le focus (onPause invoqu) suspendue -> actif: onResume invoqu suspendue -> dtruit: onDestroy invoqu public class Main extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acceuil); } protected void onDestroy() { super.onDestroy(); } protected void onPause() { super.onPause(); } protected void onResume() { super.onResume(); } protected void onStart() { super.onStart(); } protected void onStop() { super.onStop(); } }

Sauvegarde des interfaces d'activitL'objet Bundle pass en paramtre de la mthode onCreate permet de restaurer les valeurs des interfaces d'une activit qui a t dcharge de la mmoire. En effet, lorsque l'on appuie par exemple sur la touche Home, en revenant sur le bureau, Android peut-tre amen dcharg les lments graphiques de la mmoire pour gagner des ressources. Si l'on rebascule sur l'application (appui long sur Home), l'application peut avoir perdu les valeurs saisis dans les zones de texte. Pour forcer Android dcharger les valeurs, il est possible d'aller dans "Development tools > Development Settings" et de cocher "Immediately destroy activities". Si une zone de texte n'a pas d'identifiant, Android ne pourra pas la sauver et elle ne pourra pas tre restaure partir de l'objet Bundle. Si l'application est compltement dtruite (tue), rien n'est restaur. Le code suivant permet de visualiser le dclenchement des sauvegardes: protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); Toast.makeText(this, "Sauvegarde !", Toast.LENGTH_LONG).show(); }

Dveloppement sous Android - J.-F. Lalande

7 / 79

Dmonstration

Ensi de Bourges - Filire STI

Dmonstration

Dveloppement sous Android - J.-F. Lalande

8 / 79

3 Interfaces graphiques

Ensi de Bourges - Filire STI

3 Interfaces graphiques3.1 Vues et gabarits Attributs des gabarits L'interface comme ressource 3.2 Les lments graphiques de base Les labels de texte Les zones de texte Les images Les boutons Interface rsultat Dmonstration 3.3 Positionnement avanc Preview du positionnement 3.4 Les listes Dmonstration Liste de layouts plus complexes Interface rsultat 3.5 Les onglets Activit et onglets Crer les onglets Dmonstration 9 9 10 10 11 11 12 12 12 13 13 13 14 14 14 15 16 17 17 18

3.1 Vues et gabaritsLes lements graphiques hritent de la classe View. On peut regrouper des lments graphiques dans une ViewGroup. Des ViewGroup particuliers sont prdfinis: ce sont des gabarits (layout) qui proposent une prdispositions des objets graphiques: LinearLayout: dispose les lments de gauche droite ou du haut vers le bas RelativeLayout: les lments enfants les uns par rapport aux autres TableLayout: disposition matricielle FrameLayout: disposition en haut gauche en empilant les lments Les dclarations se font principalement en XML, ce qui vite de passer par les instanciations Java.

Attributs des gabaritsLes attributs des gabarits permettent de spcifier des attributs supplmentaires. Les plus importants sont: android:layout_width et android:layout_height: ="fill_parent": l'lment remplit tout l'lment parent

Dveloppement sous Android - J.-F. Lalande

9 / 79

L'interface comme ressource

Ensi de Bourges - Filire STI

="wrap_content": prend la place ncessaire l'affichage android:orientation: dfinit l'orientation d'empilement android:gravity: dfinit l'alignement des lments Voici un exemple de LinearLayout:

L'interface comme ressourceUne interface graphique dfinie en XML sera aussi gnre comme une ressource dans la classe statique R. Le nom du fichier xml, par example accueil.xml permet de retrouver le layout dans le code java au travers de R.layout.accueil. Ainsi, pour associer la premire vue graphique l'activit principale de l'application, il faut faire: public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acceuil); } Le layout reste modifiable au travers du code, comme tous les autres objets graphiques. Pour cela, il est important de spcifier un id dans la dfinition XML du gabarit (android:id="@+id/accueilid"). Cette remarque est aussi valable pour tous les autres objets graphiques. Ainsi, on peut accder cet lment par son id et agir dessus au travers du code Java: LinearLayout l = (LinearLayout)findViewById(R.id.accueilid); l.setBackgroundColor(Color.BLACK);

3.2 Les lments graphiques de baseUn gabarit peut contenir des lments graphiques, ou d'autres gabarits. On retrouve le mme principe que les tableaux imbriqus de l'HTML. Les interfaces peuvent aussi inclure d'autres interfaces, permettant de factoriser des morceaux d'interface. On utilise dans ce cas le mot clef include:

Les labels de texteEn XML: Par la programmation: public class Activity2 extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); LinearLayout gabarit = new LinearLayout(this); gabarit.setGravity(Gravity.CENTER); // centrer les lments graphiques gabarit.setOrientation(LinearLayout.VERTICAL); // empiler vers le bas ! TextView texte = new TextView(this); texte.setText("Programming creation of interface !"); gabarit.addView(texte); setContentView(gabarit); } }

Les zones de texteEn XML: Par la programmation: EditText edit = new EditText(this); edit.setText("Edit me"); gabarit.addView(edit); Interception d'vnements:

Dveloppement sous Android - J.-F. Lalande

11 / 79

Les images

Ensi de Bourges - Filire STI

edit.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int start, int before, int count) { // do something here } );

Les imagesEn XML: Par la programmation: ImageView image = new ImageView(this); image.setImageResource(R.drawable.ensi); gabarit.addView(image);

Les boutonsEn XML: La gestion des vnements de click se font par l'intermdiaire d'un listener: Button b = (Button)findViewById(R.id.Button01); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Stop !", Toast.LENGTH_LONG).show(); } }); }

Interface rsultat

Dveloppement sous Android - J.-F. Lalande

12 / 79

Dmonstration

Ensi de Bourges - Filire STI

Ce screenshot montre une interface contenant des TextView, EditText, ImageView, et un bouton (cf. ANX_Interfaces-graphiques).

Dmonstration

3.3 Positionnement avancPour obtenir une interface agrable, il est souvent ncessaire de raliser correctement le positionnement des lments graphiques. La difficult est d'arriver programmer un placement qui n'est pas dpendant de l'orientation ou de la taille de l'cran. Dans [VL], on trouve une explication pour raliser un placement simple: un texte gauche et une image droite de l'cran, aligne avec le texte. Cela peut tre particulirement utile si par exemple on ralise une liste d'item qui contienne chaque fois un texte et une icone. Le principe rside dans l'imbrication de LinearLayout: Un premier layout contiendra l'ensemble des lments. Son orientation doit tre horizontal et sa gravit (gravity) center. On inclut ensuite le texte. Puis, l'image tant cense tre droite, il faut crer un LinearLayout conscutif au texte et prciser que la gravit (gravity) est right. Pour aligner les lments, il faut prciser que la gravit du layout (layout_gravity) est center.

Preview du positionnementLe layout dcrit ci-avant ressemble : Ce qui produit dans l'interface de preview, en orientation portrait:

3.4 Les listesAu sein d'un gabarit, on peut implanter une liste que l'on pourra drouler si le nombre d'lments est important. Si l'on souhaite faire une liste plein cran, il suffit juste de poser un layout linaire et d'y implanter une ListView. Le XML du gabarit est donc: Etant donn qu'une liste peut contenir des lments graphiques divers et varis, les lments de la liste doivent tre insrs dans un ListAdapter et il faut aussi dfinir le gabarit qui sera utilis pour afficher chaque lment du ListAdapter. Prenons un exemple simple: une liste de chaine de caractres. Dans ce cas, on cr un nouveau gabarit montexte et on ajoute dynamiquement un ArrayAdapter la liste listView1. Le gabarit suivant doit tre plac dans montexte.xml: Le code de l'application qui cr la liste peut tre: ListView list = (ListView)findViewById(R.id.listView1); ArrayAdapter tableau = new ArrayAdapter(list.getContext(), R.layout.montexte); for (int i=0; i