Architecture des systèmes mobiles Cours 1 : Activités et Ressources Sorina Ionica 1
Organisation du module 1ère partie : activités et ressources, cycle des vie des activités toasts, notifications, composants graphiques, quelques applications classiques. 2ème partie : la programmation concurrente handlers, asynctasks, les services, les broadcastreceivers 2
Organisation du module Cours intégré au TP salle a préciser (D11/12?) 2 contrôles sur papier : 1 er contrôle lundi 6 fevrier 16h-18h 1 mini-projet en fin de semestre Page du cours : http://home.mis.u-picardie.fr/~ionica/android.htm 3
Historique d Android Système d exp. Mobile, basé sur le noyau de Linux 2008 : Le source du SDK 1.1 (Api level 2) disponible sous licence Apache, premier smartphone Android aux USA Dévéloppé par Google et l Open Handset Alliance 4
Versions d Android Plusieurs mises à jour et ajout de nouvelles fonctionnalités source http://developer.android.com/about/dashboards /index.html 5
Ressources Applications fonctionnelles sur une variete de terminaux => fichiers XML! Ressources = images, chaines de charac., musique 6
L'interface utilisateur Fichier source res/layout/activity_main.xml <?xml version="1.0" encoding="utf 8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/text_invit" /> <TextView android:id="@+id/val" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="+ 1" android:onclick="actionajout" /> </LinearLayout> 7
Le fichier layout Inflation : opération de création d'une UI à partir d'un fichier XML Boite conteneur verticale <LinearLayout Namespace obligatoire a la racine xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" Prendre la taille du parent android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/text_invit" />.. </LinearLayout> 8
Le TextView @string/texte est une référence à une ressource string de nom texte <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/texte" /> fichier res/values/string.xml <?xml version="1.0" encoding="utf 8"?> <resources> <string name="app_name">marre d\'hello World</string> <string name="texte">marre du classique hello World</string> </resources> 9
Le fichier Layout <TextView android:id="@+id/val" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> -@+id/val signifie une référence à l'identifiant val -En Java, cela permet de récupérer une référence sur l'objet ainsi : (TextView)findViewById(R.id.val) 10
Le fichier Layout Le widget bouton possède un attribut onclick précisant le nom de la méthode qui traitera les événements "click": <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="+ 1" android:onclick="actionajout" /> 11
La classe R L'IDE Android Studio génère automatique une classe static R de toutes les ressources : fichier app/df.cours.marredhelloworld/test/r.java package df.cours22; public final class R { public static final class id { public static final int bouton=0x7f050001; public static final int val=0x7f050000; public static final class string { public static final int app_name=0x7f040000; public static final int texte=0x7f040001;... 12
La classe R public final class R {... ->Utilisation des classes internes : public et static public static final class drawable { public static final int upjv_launcher=0x7f020000; public static final class id { public static final int bouton=0x7f050001; public static final int val=0x7f050000; public static final class layout { public static final int main=0x7f030000; public static final class string { public static final int app_name=0x7f040000; public static final int text_invit=0x7f040001; 13
La classe R public final class R { ->ressources dans le dossier res <=> identifiants ds. R.java... public static final class string { public static final int app_name=0x7f040000; public static final int texte=0x7f040001; fichier res/values/string.xml <?xml version="1.0" encoding="utf 8"?> <resources> <string name="app_name">marre d\'hello World</string> <string name="texte">marre du classique hello World</string> </resources> 14
La classe R public final class R { fichiers /res/layout/main.xml et /res/layout/main1.xml public static final class layout { public static final int main=0x7f030000; public static final int main1=0x7f030001; En Java : setcontentview(r.layout.main) Et comment faire pour accéder aux vues décrites dans le fichier layout? 15
Le fichier Layout <TextView android:id="@+id/val" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> ->en passant par la classe interne id! -En Java, cela permet de récupérer une référence sur l'objet ainsi : (TextView)findViewById(R.id.val) 16
La classe View Brique de base de l'interface utilisateur Zone dessinable et source d'événements 17
Le fichier Layout <TextView android:id="@+id/val" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="" /> -@+id/val signifie une référence à l'identifiant val -En Java, cela permet de récupérer une référence sur l'objet ainsi : (TextView)findViewById(R.id.val) 18
Activités la classe hérite d'activity : import android.app.activity; public class MarreDHelloWorldActivity extends Activity { private int val; private TextView text; @Override public void oncreate(bundle bundle) { super.oncreate(bundle); setcontentview(r.layout.activity_main); val = 0; text =(TextView)findViewById(R.id.val); text.settext("valeur = "+val); public void actionajout(view view) { text.settext("valeur = "+ ++val); 19
Activités Le contenu graphique de l'application est obtenu à partir de res/layout/activity_main.xml La référence du widget text est obtenue à partir de son identifiant grâce à la fonction findviewbyid @Override ->paramètre Bundle pour la sauvegarde des données on y reviendra! public void oncreate(bundle bundle) { super.oncreate(bundle); setcontentview(r.layout.activity_main); val = 0; text =(TextView)findViewById(R.id.val); text.settext("valeur = "+val); 20
Activités La méthode actionajout prévue pour traiter les événements click : elle reçoit la référence du widget cliqué en paramètre d'appel Ou programmer un écouteur implémentant l'interface View.OnClickListener avec une méthode public void onclick(view v) public class MarreDHelloWorldActivity extends Activity { private int val; private TextView text;... public void actionajout(view view) { text.settext("valeur = "+ ++val); <Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="+ 1" android:onclick="actionajout" /> 21
Le fichier AndroidManifest.xml <?xml version="1.0" encoding="utf 8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="df.cours.marredhelloworld"> <uses sdk version de API (et non de SDK) android:minsdkversion="8" android:targetsdkversion="17" /> <application android:allowbackup="true" android:icon="@mipmap/upjv_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity"> <intent filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </activity> </application> </manifest> 22
Le fichier AndroidManifest.xml <application android:exported ="true" indique si l activité peut être lancée à partir d une autre application android:icon="@mipmap/upjv_launcher" android:label="@string/app_name" android:supportsrtl="true" android:theme="@style/apptheme"> <activity android:name=".mainactivity"> l activité et le nom de la classe <intent filter> <action android:name="android.intent.action.main" /> <category android:name="android.intent.category.launcher" /> </intent filter> </activity> </application> Dans le filtre d'intention : c'est la classe principale (MAIN) et elle apparaît dans le "Launcher" lanceur 23
L'arborescence d'une application Applications fonctionnelles sur une variete de terminaux => fichiers XML! Ressources = images, chaines de charac., musique 24