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 : 1er 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="utf8"?> <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 Namespace obligatoire a la racine <LinearLayout 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 ->ressources dans le dossier res <=> identifiants ds. public final class R { 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 le fichier layout? aux vues décrites dans 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 ->paramètre Bundle pour la sauvegarde des données – on y reviendra ! @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); } 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> 22 </manifest> 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