• 30 heures
  • Moyenne

Ce cours est visible gratuitement en ligne.

course.header.alt.is_video

course.header.alt.is_certifying

J'ai tout compris !

Mis à jour le 13/01/2020

Faites une application composite

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Les applications sont rarement limitées à une unique activité avec un unique visuel utilisateur. Cependant, ils sont un peu à la marge des objectifs de ce cours. Dans cette section, je vous propose de parler brièvement, à titre d'information, de création d'applications contenant plusieurs activités. Cependant, nous n'irons pas jusqu'à discuter de la notion de Fragment qui est trop éloignée des objectifs de cette formation.

Créez une activité complémentaire et l'appeler explicitement

Une fois un projet Android créé, créer une nouvelle activité revient à créer une nouvelle classe héritant de Activity, lui associer un visuel et la déclarer dans le Manifest. Cela se fait facilement grâce à l'IDE AndroidStudio, puisqu'il suffit d'aller dans le menu contextuel du projet et de choisir new -> Activity -> Empty Activity pour créer la classe héritant de ce qu'il faut et son XML d'habillage.

New Activity
New Activity

Ce faisant, cette activité est également ajoutée au Manifest du projet, comme cela a été fait en ligne 7 de l'exemple suivant :

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<application ... >
<activity android:name=".MainActivity">
....
</activity>
<activity android:name=".AnotherActivity"></activity>
</application>
</manifest>

Le simple fait de déclarer cette activité la rend appelable via un appel explicite. Nous verrons que cela est insuffisant pour un appel implicite.

Pour l'OS, lancer une activité consiste à créer une nouvelle fenêtre, à la placer sur le dessus de la pile des fenêtres et à lui passer la main. Lorsque celle-ci sera finie, l'activité précédente reprendra la main.

Pour lancer une activité (même nommée explicitement), on ne peut pas simplement appeler son constructeur, car il est important que l'OS puisse gérer le cycle de vie de chacune d'entre elles et puisse mettre en pause celles masquées. On passe donc par un appel système et un descripteur d'intention. Un Intent  est un objet qui permet de décrire le composant que l'on souhaite lancer. La description la plus simple consiste à nommer explicitement le-dit composant. Il suffit ensuite de faire appel àstartActivity  pour lancer l'activité nommée. Par exemple :

Intent i = new Intent(this, oc.mooc.demos.activitydemonstration.AnotherActivity.class);
startActivity(i);

Lancement d'une activité avec paramètres

Lorsqu'on lance une activité, nous pouvons vouloir lui transmettre des informations. Il est donc nécessaire de les ajouter dans l'Intent  avant le lancement de l'activité. Les données complémentaires circulant dans un Intent  sont appelées les extras et sont des couples (clef,valeur).

Syntaxiquement, il suffit de choisir un nom de paramètre (de clef) et de faire appel à la méthodeputExtra  pour ajouter l'information dans l'appel :

Intent i = new Intent(this,ActiviteALancer.class);
i.putExtra(ActiviteALancer.EXTRA_PARAM1,"une chaine");
i.putExtra(ActiviteALancer.EXTRA_PARAM2",42);
startActivity(i);

La méthode putExtra  est largement surchargée pour prendre en compte les différents types de données.

Pour récupérer une valeur reçue par l'activité appelée, il suffit de récupérer une copie de l'Intentd'appel avec getIntent  et d'y lire les extras, via les méthodes getXXXExtra dédiées aux différents types de paramètre :

Intent intent = getIntent();
String param1 = intent.getStringExtra(EXTRA_PARAM1);
int param2 = intent.getIntExtra(EXTRA_PARAM2, 0); // on précise la valeur par défaut si paramètre non présent

 Cela peut être fait dans le onCreate  de l'activité lancée, ce qui permet de paramétrer son initialisation.

Activité avec un résultat

Le principe de transmission d'un résultat d'appel est le même que pour le lancement d'une activité (passage d'extras via un Intent), mais nécessite de mettre en place un call-back. En effet, l'appel àstartActivity  passe la main à la nouvelle activité et la précédente peut potentiellement être tuée pour des contraintes de mémoire. Il est donc nécessaire de prévoir une méthode qui sera appelée par le système après que l'appel soit fini (quitte à ce que l'activité masquée et tuée soit re-créée avant l'appel de la méthode de retour). Il faudra donc fournir une méthode onActivityResult  dans l'activité d'appel et utiliser la méthode startActivityForResult  pour faire cet appel avec call-back.

Exemple d'un appel d'activité avec résultat :

Intent i = new Intent(this, CalledActivity.class);
startActivityForResult(i,1);

Il est nécessaire de fournir une méthode de call-back :

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
String s = data.getStringExtra(CalledActivity.EXTRA_RESULT);
result.setText(s);
} else {
result.setText("Action annulée");
}
}

Selon vous, que représentent requestCode  et resultCode  ? Où a été défini RESULT_OK? Et que représente le 1 ajouté en second paramètre d'appel de startActivityForResult ?

Il est possible que plusieurs activités différentes puissent être appelées depuis une même activité. Il devient alors nécessaire de savoir qui vient de rendre la main en faisant l'appel au call-back. Le second paramètre d'appel de startActivityForResult est le requestCode  : c'est un identifiant arbitraire fourni au moment de l'appel et permettant de savoir au retour de quoi il retourne. 

Par ailleurs, si on fini une activité via la flèche "back", alors cela revient à annuler l'activité. Elle ne renverra aucun résultat. Pour distinguer les 2 cas (annulation ou pas), la classe Activity  fournit 2 constantes RESULT_OK  et RESULT_CANCELED, qui sont utilisées par le système et qui sont les 2 valeurs possibles de resultCode.

Du côté de l'activité appelée, pour finir son exécution et renvoyer un résultat, il est nécessaire de créer un Intent, d'y insérer le résultat et de fournir ce conteneur en tant que résultat avant de finir l'activité :

Intent res = new Intent();
res.putExtra(this.EXTRA_RESULT, "Une valeur résultat");
setResult(RESULT_OK, res);
finish();

Lancement implicite d'une activité

Pour faire un appel implicite, on utilise la notion d'action. On ajoutera généralement un URI permettant de paramétrer l'action.

Par exemple, pour ouvrir une page web, on pourra utiliser l'actionACTION_VIEW. Il suffit de fournir une URL en tant qu'URI pour que ce soit un navigateur web qui soit sollicité. Si à l'inverse l'URI commence par l'action geo:, alors ce sera une application de lecture de carte qui sera appelée.

Ainsi, les usages suivants seraient des appels implicites à des activités respectivement de navigation web et de cartographie :

Uri myURI = Uri.parse("http://www.openclassrooms.fr");
Intent i = new Intent(Intent.ACTION_VIEW, myURI);
startActivity(i);

Uri myURI = Uri.parse("geo:0,0?q=20 avenue Albert Einstein, 69100 Villeurbanne, france");
Intent i = new Intent(Intent.ACTION_VIEW, myURI);
startActivity(i);

Exemple de certificat de réussite
Exemple de certificat de réussite