Dans ce chapitre, nous allons faire communiquer la GameActivity avec la MainActivity, afin de récupérer le score du joueur pour pouvoir plus tard l'afficher sur l'écran d'accueil.
Récupération du résultat d'une activité
Récupérer le résultat d'une activité
Si vous vous rappelez bien, nous avions démarré l'activité GameActivity en utilisant la méthode startActivity(). Si votre mémoire vous fait défaut, je vous invite à relire le code (dans la méthode onClick() du bouton de démarrage de jeu, dans la MainActivity.
Maintenant, la donne a changé : nous souhaitons démarrer GameActivity et attendons de sa part un résultat, qui sera le score de l'utilisateur. Pour ce faire, la méthode à utiliser est startActivityForResult(). Sa signature est la suivante :
public void startActivityForResult(Intent intent, int requestCode)
Le premier paramètre est le même que celui de startActivity(). Le second paramètre est plus intéressant : il permet de préciser un "code de requête", c'est-à-dire un identifiant lié à cette activité. Pourquoi ? Imaginez que votre activité possède cinq boutons, et que chaque bouton permette de lancer une activité différente. Eh bien cet identifiant vous permettra par la suite de savoir quelle activité vous envoie son résultat.
Démarrage d'une activité avec demande de résultat
Commencez tout d'abord par ajouter une variable d'instance pour définir l'identifiant de la GameActivity :
private static final int GAME_ACTIVITY_REQUEST_CODE = 42;
Sa valeur a peu d'importance. Il faut simplement qu'elle soit unique si vous aviez des activités différentes à démarrer.
Ensuite, modifiez l'appel de création de la GameActivity en utilisant cette nouvelle méthode :
startActivityForResult(gameActivity, GAME_ACTIVITY_REQUEST_CODE);
Envoi du résultat
Rendez-vous maintenant dans la GameActivity. Vous vous rappelez lorsque nous avions utilisé la méthode finish() pour arrêter l'activité et revenir à l'écran principal ? Oui, c'est exactement ici que nous allons renvoyer le score de l'utilisateur.
Pour ce faire, il est nécessaire de créer un Intent (nous avions déjà utilisé cette classe pour demander le démarrage de la GameActivity depuis la MainActivity). Dans le cas présent, nous allons nous en servir pour lui "attacher" le score de l'utilisateur, afin de pouvoir le renvoyer à la première activité.
Tout d'abord, pour "attacher" une valeur à un Intent, il est nécessaire d'utiliser la méthode putExtra(). Cette méthode possède différentes signatures, selon le type de valeur à attacher. Quelques exemples de signatures :
public Intent putExtra(String name, boolean value);
public Intent putExtra(String name, int value);
public Intent putExtra(String name, String value);
Comme pour le stockage des préférences, il est nécessaire de fournir une "clé", car un Intent peut contenir plusieurs valeurs différentes. Dans notre cas, nous allons définir une variable de classe publique pour stocker le nom de la clé, afin qu'elle puisse être récupérée par la suite par la MainActivity. Ajoutez la variable suivante dans la GameActivity :
public static final String BUNDLE_EXTRA_SCORE = "BUNDLE_EXTRA_SCORE";
Maintenant, mettez votre code à jour pour renvoyer le score de l'utilisateur :
Intent intent = new Intent();
intent.putExtra(BUNDLE_EXTRA_SCORE, mScore);
setResult(RESULT_OK, intent);
finish();
Quelques explications :
ligne 1 : nous créons une instance de la la classe Intent ;
ligne 2 : nous attachons le score à l'Intent, avec la clé associée BUNDLE_EXTRA_SCORE. Cette clé sera par la suite utilisée par la MainActivity pour récupérer le score ;
ligne 3 : nous précisons au système Android que l'activité s'est correctement terminée, et nous lui indiquons en second paramètre notre Intent (qui contient le score) ;
ligne 4 : nous terminons l'activité.
Récupération du résultat
Revenez dans le fichier de la MainActivity. Pour récupérer le résultat renvoyé par une activité, il est nécessaire de surcharger la méthode onActivityResult(). Appuyez sur CTRL + O
, tapez les premières lettres de la méthode et appuyez sur la touche Entrée
. La méthode suivante est générée :
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
}
Avant de récupérer le score, vous devez vous assurer de plusieurs choses :
Tout d'abord, assurez-vous que le résultat provient de la bonne activité, en vérifiant le paramètre requestCode. Il doit correspondre à la valeur que vous avez précisée plus haut, en l'occurrence BUNDLE_EXTRA_SCORE.
Ensuite, vérifiez que cette activité s'est correctement terminée, en analysant le paramètre resultCode. Sa valeur doit être RESULT_OK, telle que nous l'avions précisée dans l'appel à setResult().
Enfin, si tout est correct, vous pouvez récupérer le score. Pour récupérer le score, sachant qu'il a été stocké en tant qu'entier, la méthode à utiliser est getIntExtra().
Le code correspondant est le suivant :
if (GAME_ACTIVITY_REQUEST_CODE == requestCode && RESULT_OK == resultCode) {
// Fetch the score from the Intent
int score = data.getIntExtra(GameActivity.BUNDLE_EXTRA_SCORE, 0);
}
Voilà. Notez la signature de la méthode getIntExtra() : le second paramètre permet de préciser une valeur par défaut au cas où la valeur demandée n'existerait pas.
En résumé
Pour ouvrir une nouvelle Activity et en attendre un résultat de retour, il faut utiliser la méthode startActivityForResult().
Le résultat de l’Activity est transmis dans la méthode onActivityResult() : il faut donc l’overrider dans l’Activity principale.
Utiliser des constantes est très pratique lorsque la même valeur doit être utilisée à plusieurs endroits différents (par exemple, un request code).
Voilà, vous savez comment renvoyer un résultat d'une activité à une autre. Cela peut ne pas vous paraître intuitif, mais vous verrez par la suite que ce mécanisme est très puissant. Rendez-vous dans le prochain chapitre pour apprendre à mémoriser les préférences du joueur.