public et static

publicité
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
Téléchargement