2. 2
Composants d’une application Android
Une fois la partie statique (xml) d’une interface déclarée, il faut créer une classe
Java représentant l’activité.
3. 3
Les Activités
❑ Les activités (Activity en anglais) font partie des objets les plus utilisés.
❑ Chaque écran que voit et manipule l’utilisateur est implémenté par une classe qui
hérite de la classe Activity.
❑ Une application comporte au minimum une classe héritant de Activity.
❑ Une et une seule activité est lancée au démarrage d’une application.
❑ Chaque activité, pour être lancée, doit être déclarée dans le fichier Manifest.xml,
dans une balise <activity>, balise enfant de la balise <application>.
balise <activity>
balise enfant de la
Balise <application>
4. 4
❑ Pour indiquer au système quelle activité lancer au démarrage de
l’application, il faut ajouter
❑ une balise <intent-filter>, qui elle-même doit contenir les balises
<action> et <category>.
❑ La classe Activity fait partie du package Android.app.
❑ Le point d’entrée d’une classe héritant d’Activity est la méthode onCreate :
❑ première méthode appelée à la création de l’activité,
❑ c’est ici que le développeur doit faire les initialisations dont il a besoin.
❑ La méthode onCreate de la classe héritant d’Activity doit appeler la
méthode onCreate de la classe parente.
Cette classe doit :
❑ hériter de la classe Activity.
❑ Surcharger au minimum la méthode onCreate.
❑ Lier l’activité à l’interface à l'aide de la méthode setContentView.
Pour créer une nouvelle activité, faites un clic droit sur le dossier src de votre
projet, puis sélectionnez l’option New - Activity et choisissez le type d’activité
que vous voulez créer (Blank Activity, Login Activity, etc.).
Prenons l'exemple d'une interface créée dans le fichier home.xml.
Pour pouvoir la lier à une activité, la méthode onCreate doit contenir au
minimum le code suivant :
5. 5
On peut spécifier des propriétés ou comportements à l'aide des filtres d'intention.
Les filtres d'intention se divisent en plusieurs catégories :
❑ Les actions (balise action) : qui permettent de spécifier des actions à un
composant, par exemple : ACTION_CALL (pour passer un appel
téléphonique), ACTION_MAIN (activité principale de l'application),
ACTION_SEND (utilisé pour le partage de données), etc.
❑ Les données (balise data) : permettent de spécifier le type de données
traité par le composant.
6. 6
❑ Les catégories (balise category) : permettent de spécifier la catégorie du
composant, par exemple CATEGORY_BROWSABLE (peut être invoqué par le
navigateur pour afficher des données), CATEGORY_LAUNCHER (l'activité sera
disponible depuis le lanceur d'application), etc.
❑ Les extras : représente des données additionnelles qui seront fournies à
l'activité. Par exemple, pour l’envoi d’un e-mail, utiliser la clé EXTRA_EMAIL
pour spécifier le destinataire du mail.
❑ Différents flags utiles à l'activité.
Par exemple:
7. 7
3. Les layouts
Les layouts facilitent l'organisation des différents éléments qui composent une
interface. Ils servent de conteneur aux composantes d’une vue. Tous les layouts
Android héritent de la classe ViewGroup.
2.1 FrameLayout
Le Framelayout est le conteneur le plus simple, il représente un espace qui affiche
l’objet de votre choix.
Un élément ajouté à un FrameLayout se positionne en haut à gauche du layout.
Vous pouvez changer cette position à l’aide de l’attribut android:gravity.
2.2 LinearLayout
Le LinearLayout permet d'aligner des éléments (dans l’ordre des déclarations) dans
une direction (verticale ou horizontale).
Vous pouvez définir les attributs suivants :
❑ L'orientation du layout.
❑ La gravité des éléments.
❑ Le poids des éléments.
Orientation
À la création d’un LinearLayout, vous devez préciser son orientation (horizontale ou
verticale) à l'aide de l'attribut android:orientation.
8. 8
Positionnement d’un élément
Pour définir le positionnement d'un élément dans un LinearLayout, deux
attributs sont disponibles :
❑ layout_gravity : spécifie le positionnement d'un élément dans son
conteneur.
❑ gravity : spécifie le positionnement du contenu d'un élément (par
exemple, on peut spécifier la position d'un texte dans un bouton).
Cycle de vie d’une activité
o onCreate() – Appelé lors de la création de l'activité
o onStart() – Appelé juste après sa création ou par la méthode de redémarrage
o onStop() – Ici l'activité commence à devenir visible pour l'utilisateur
o onResume() – Appelé lorsque l'activité est visible par l'utilisateur et que
l'utilisateur peut interagir avec elle
o onPause() – Appelé lorsque le contenu de l'activité n'est pas visible car
l'utilisateur reprend l’activité précédente
o onStop() – Appelé lorsque l'activité n'est pas visible pour l'utilisateur car
une autre activité à pris sa place
o onRestart() – Appelé lorsque l'utilisateur vient à l'écran ou reprend l'activité
qui a été arrêté
o onDestroy – Appelé lorsque l'activité n'est pas en arrière-plan
10. 10
Création d’une activité
1. Créer une classe héritant de la classe Activity ou (AppCompatActivity)
de la plateforme.
3. Déclarer l’activité dans le fichier manifest de l’application.
2. Implémenter le callback: onCreate
4. Affecter le layout à l’activité en appelant setContenteView(…)
public class MainActivity extends AppCompatActivity {
EditText user, pwd;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
. . .
user = (EditText) findViewById(R.id.userEdit);
pwd = (EditText)findViewById(R.id.pwdEdit);
}
}
12. 12
Intent filter
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
*
</intent-filter>
Lancement d’une activité par programme
Intent intent = new Intent(context, secondActivity.class);
intent.putExtra(. . . ); // passage de données
startActivity(intent);
// finish();
Intent intent = new Intent(context, secondActivity.class);
intent.putExtra(. . . ); // passage de données
startActivity(intent);
// finish();
13. 13
Lancement d’une activité et attente de résultats
private static final int ACTIVITY_FLAG = 1;
Intent intent = new Intent(this, secondActivity.class);
startActivityForResult(intent, APPEL_ACTIV2);
Fenêtre appelante
@Override
protected void onActivityResult( int requestCode, int
resultCode, Intent data)
{
if (resultCode == Activity.RESULT_CANCELED) return;
switch (requestCode) {
case ACTIVITY_FLAG : // on revient de Activ2
...
}
}
Lancer une activité et attendre un retour
Surcharger ce callback et
sélectionner un cas de retour selon
le flag retourné
15. 15
Communication d’informations dans un Intent
Bundle infos = new Bundle(); // key-value data structure
infos.putString("USER",user.getText().toString());
Intent intent = new Intent(MainActivity.this,
secondActivity.class);
intent.putExtra("BUNDLE", infos);
startActivity(intent);
Passage d’infos
Intent intent = getIntent();
Bundle bundle = intent.getBundleExtra("BUNDLE");
String user = bundle.getString("USER");
Récupération d’infos
16. 16
Cycle de vie d’une Activité : Events
onCreate : Appelée à la première création d’une activité.
Dans cet évènement on devrait :
✓ Créer tous les views (controles)
✓ Ouvrir/se connecter à des BDD ou serveurs, …
public class secondActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
EditText passEdit = (EditText) findViewById(R.id.passEdit);
passEdit.getLayoutParams().width =
LinearLayout.LayoutParams.MATCH_PARENT;
}
}
17. 17
onStart: Appelée juste avant que l’activité devienne visible.
• Après onStart, si l’activité devient visible, le contrôle est
transféré à onResume; sinon il est transféré à onStop.
@Override
protected void onStart() {
super.onStart();
…
}
onResume: Appelée juste après que l’activité ne devienne visible.
A ce moment l’utilisateur peut interagir avec l’activité.
Il peut aussi être appelé quand la vue redevient active.
Le code dans onResume doit permettre de continuer l’exécution
à l’état suspendu.
18. 18
@Override
protected void onResume() {
super.onResume();
…
}
onPause: Appelée avant que le contrôle soit donné à une autre activité.
❑ Le code dans onResume doit annuler/suspendre toute action
consommant le CPU et la batterie. Enregistrer tous qui doit
être enregistré.
@Override
protected void onPause() {
super.onPause();
…
}
19. 19
onStop: Appelée quant l’activité est définitivement invisible ou elle est
entrain d’être détruite.
@Override
protected void onStop() {
super.onStop();
…
}
onDestroy: la dernière chance à l’activité de faire quelques traitements
avant qu’elle soit définitivement détruite..
@Override
protected void onDestroy() {
super.onDestroy();
…
}
20. 20
Android Services
❑ Un service n’a pas d’interface graphique
❑ Une autre application peut lancer un service ou se connecter à un
en cours d’exécution.
❑ Un service est un type d’application permettant d'effectuer une
tâche plus ou moins longue en arrière plan.
❑ Exemple: se connecter à
un serveur, lancer l’audio,
etc. …
Cycle de vie
d’un service
21. 21
Implémentation d’un service
public class MyService extends Service {
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
//TODO do something useful
return Service.START_NOT_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
//TODO for communication return IBinder implementation
return null;
}
}
22. 22
Modifications à apporter au fichier manifest
<application
android:icon="@drawable/icon"
android:label="@string/app_name">
...
<service
android:name=".RSSPullService"
android:exported="false"/>
...
</application>