{"id":753,"date":"2017-11-29T09:07:34","date_gmt":"2017-11-29T08:07:34","guid":{"rendered":"http:\/\/chezdom.net\/etu\/?page_id=753"},"modified":"2019-10-28T19:59:48","modified_gmt":"2019-10-28T18:59:48","slug":"android-courstp-4-intents","status":"publish","type":"page","link":"https:\/\/chezdom.net\/etu\/android-courstp-4-intents\/","title":{"rendered":"Android &#8211; Cours\/tp 3 &#8211; Intents"},"content":{"rendered":"<h2>Principe<\/h2>\n<ul>\n<li>On cr\u00e9e un objet <code>Intent<\/code><\/li>\n<li>On ins\u00e9rer les \u00e9ventuels param\u00e8tres dans cet objet<\/li>\n<li>On envoie cet objet <code>Intent<\/code> au syst\u00e8me (m\u00e9thode <code>startActivity<\/code>)<\/li>\n<li>Le syst\u00e8me d\u00e9marre l&rsquo;activit\u00e9 ad\u00e9quate<\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/developer.android.com\/images\/components\/intent-filters_2x.png\" alt=\"sh\u00e9ma de principe\" \/><br \/>\nsource:  https:\/\/developer.android.com\/guide\/components\/intents-filters.html<\/p>\n<h3>Table des mati\u00e8res<\/h3>\n<ol>\n<li><a href=\"#android-X-101\">D\u00e9marrer une seconde activit\u00e9 depuis une premi\u00e8re activit\u00e9<\/a><\/li>\n<li><a href=\"#android-X-201\">Envoyer des param\u00e8tres \u00e0 la seconde activit\u00e9<\/a><\/li>\n<li><a href=\"#android-X-301\">R\u00e9cup\u00e9rer une valeur de retour lorsqu&rsquo;on revient \u00e0 la premi\u00e8re activit\u00e9<\/a><\/li>\n<li><a href=\"#android-X-401\">Intents Implicites\/Explicites<\/a><\/li>\n<\/ol>\n<hr\/>\n<h2>1. D\u00e9marrer une seconde activit\u00e9 depuis une premi\u00e8re activit\u00e9<\/h2>\n<p>On utilise la classe <code>Intent<\/code> (<em>intention<\/em>).<\/p>\n<pre class=\"brush: java; gutter: true\">\npublic class Intent\nextends Object implements Parcelable, Cloneable\n\npublic Intent(Context packageContext, Class&lt;?&gt; cls)\n<\/pre>\n<p><em>(d&rsquo;autres constructeurs existent)<\/em><\/p>\n<h3>TP: Cr\u00e9er un projet avec 2 activit\u00e9s<\/h3>\n<ul>\n<li>Activit\u00e9 principale\n<ul>\n<li>Cr\u00e9ez un projet avec une activit\u00e9 de type <em>Empty Activity<\/em>\n<ul>\n<li>MainActivity.java<\/li>\n<li>activity_main.xml<\/li>\n<\/ul>\n<\/li>\n<li>Ajouter un bouton qui permettra de lancer l&rsquo;activit\u00e9 2<\/li>\n<\/ul>\n<\/li>\n<li>Seconde Activit\u00e9\n<ul>\n<li>Utilisez le menu <em>File\/New\/Activity\/Empty Activity<\/em>\n<ul>\n<li>MainActivity2.java<\/li>\n<li>activity_main2.xml<\/li>\n<\/ul>\n<\/li>\n<li>Ajoutez un <code>textView<\/code> avec un texte diff\u00e9rent de la premi\u00e8re<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>1.1. Le fichier Manifest<\/h3>\n<ul>\n<li>Chaque activit\u00e9 doit \u00eatre r\u00e9f\u00e9renc\u00e9e dans le fichier manifest<\/li>\n<\/ul>\n<pre class=\"brush: xml; gutter: true\">\n&lt;activity android:name=&quot;.MainActivity2&quot;&gt;&lt;\/activity&gt;\n<\/pre>\n<ul>\n<li><em>a priori<\/em> c&rsquo;est fait automatiquement si vous avez utilis\u00e9 l&rsquo;assistant (le menu File\/New\/Activity) pour cr\u00e9er la seconde activit\u00e9.<\/li>\n<\/ul>\n<h4>TP<\/h4>\n<p>V\u00e9rifiez en ouvrant le fichier Manifest.xml<\/p>\n<h3>1.2. Lancer la seconde activit\u00e9<\/h3>\n<ul>\n<li>On va d&rsquo;abord cr\u00e9er un objet intent :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nIntent intent = new Intent(this, MainActivity2.class);\n<\/pre>\n<ul>\n<li>Ensuite on d\u00e9marre la seconde activit\u00e9 :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nstartActivity(intent);\n<\/pre>\n<h4>TP<\/h4>\n<ul>\n<li>O\u00f9 allons nous ins\u00e9rer ces lignes, dans le TP en cours ?<\/li>\n<li>Que se passe-t-il lors de l&rsquo;ex\u00e9cution ?<\/li>\n<\/ul>\n<h4>TP (solution)<\/h4>\n<ul>\n<li>dans la fonction de traitement du bouton (<code>onClick<\/code>)<\/li>\n<li>l&rsquo;<code>Intent<\/code> (intention) est envoy\u00e9 au syst\u00e8me qui d\u00e9marre la seconde activit\u00e9 (ind\u00e9pendamment de la premi\u00e8re)<\/li>\n<\/ul>\n<h3>TP: R\u00e9sum\u00e9<\/h3>\n<ul>\n<li>Cr\u00e9ez un projet avec 2 activit\u00e9s<\/li>\n<li>V\u00e9rifiez que la seconde activit\u00e9 est bien r\u00e9f\u00e9renc\u00e9e dans le fichier Manifest.xml<\/li>\n<li>Dans la premi\u00e8re activit\u00e9 placez un bouton \u00ab\u00a0Go\u00a0\u00bb<\/li>\n<li>Dans la m\u00e9thode <code>onClick<\/code>, ins\u00e9rez cr\u00e9ez un intent et lancez la seconde application :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nIntent intent = new Intent(this, MainActivity2.class);\nstartActivity(intent);\n<\/pre>\n<ul>\n<li>Ex\u00e9cutez l&rsquo;application<\/li>\n<\/ul>\n<hr\/>\n<h2>2. Envoyer des param\u00e8tres \u00e0 la seconde activit\u00e9<\/h2>\n<p>Ins\u00e9rer les donn\u00e9es \u00e0 transmettre dans l&rsquo;<code>Intent<\/code> en utilisant les m\u00e9thodes <code>putExtra<\/code> de la classe <code>Intent<\/code>.<\/p>\n<h3>2.1. Pr\u00e9liminaire<\/h3>\n<ul>\n<li>Reprenez le projet pr\u00e9c\u00e9dent (ou bien dupliquez-le)<\/li>\n<li>Ajoutez un champ de saisie sur la premi\u00e8re activit\u00e9<br \/><em>pour saisir un message \u00e0 transmettre<\/em><\/li>\n<li>Ajouter un <code>textView<\/code> \u00e0 la seconde activit\u00e9<br \/><em>pour afficher le message transmis<\/em><\/li>\n<\/ul>\n<h3>2.2. Ajouter un \u00ab\u00a0extra\u00a0\u00bb \u00e0 l&rsquo;intent<\/h3>\n<p>La classe <code>Intent<\/code> poss\u00e8de de nombreuses m\u00e9thodes <code>putExtra<\/code>  permettant d&rsquo;ins\u00e9rer dans l&rsquo;intent des donn\u00e9es de diff\u00e9rents types.<\/p>\n<p>Quelques exemples:<\/p>\n<pre class=\"brush: java; gutter: true\">\nIntent putExtra(String name, int value)\nIntent putExtra(String name, int[] value)\nIntent putExtra(String name, byte value)\nIntent putExtra(String name, double value)\nIntent putExtra(String name, boolean value)\nIntent putExtra(String name, String value)\nIntent putExtra(String name, String[] value)\n<\/pre>\n<p><em>Il en existe 24 dans l&rsquo;API 27, dont une pour chacun des types simples, pour les tableaux de types simples, et pour un certain nombre de classes de base (e.g. <code>String<\/code>)<\/em><\/p>\n<p>Dans notre exemple, avant de lancer le <code>startActivity(intent)<\/code><\/p>\n<ul>\n<li>On va r\u00e9cup\u00e9rer le message dans le champ de texte :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nEditText editText = (EditText) findViewById(R.id.editText);\nString message = editText.getText().toString();\n<\/pre>\n<ul>\n<li>puis on l&rsquo;ins\u00e8re dans l&rsquo;Intent<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nintent.putExtra(&quot;MSG_KEY&quot;, message);\n<\/pre>\n<h3>2.3. R\u00e9cup\u00e9rer le message dans la seconde activit\u00e9<\/h3>\n<ul>\n<li>On r\u00e9cup\u00e8re l&rsquo;<code>intent<\/code> et<\/li>\n<li>on va chercher l&rsquo;extra<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nIntent intent = getIntent();\nString message = intent.getStringExtra(&quot;MSG_KEY&quot;);\n<\/pre>\n<h4>TP<\/h4>\n<ul>\n<li>O\u00f9 allons nous ins\u00e9rer ces lignes, dans le TP en cours ?<\/li>\n<li>Que fait exactement <code>getIntent<\/code><\/li>\n<\/ul>\n<h3>2.4. M\u00e9thodes de r\u00e9cup\u00e9ration des extras<\/h3>\n<p>Il en existe pour chacune des types de donn\u00e9es pour lesquels existe un <code>putExtra<\/code><\/p>\n<pre class=\"brush: java; gutter: true\">\nint getIntExtra(String name, int defaultValue)\nint getIntArrayExtra(String name)\nbyte getByteExtra(String name, byte defaultValue)\ndouble getDoubleExtra(String name, double defaultValue)\nboolean getBooleanExtra(String name, boolean defaultValue)\nString getStringExtra(String name)\nString[] getStringArrayExtra(String name)\n<\/pre>\n<h4>TP: R\u00e9sum\u00e9<\/h4>\n<ul>\n<li>Ajouter un champ de saisie \u00e0 l&rsquo;activit\u00e9 1<\/li>\n<li>Avant le <code>startActivity(intent)<\/code> :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nintent.putExtra(&quot;MSG_KEY&quot;, message);\n<\/pre>\n<ul>\n<li>On r\u00e9cup\u00e8re la valeur dans l&rsquo;activit\u00e9 2<\/li>\n<li>Dans le <code>onCreate<\/code> de la seconde activit\u00e9 :<\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nIntent intent = getIntent();\nString message = intent.getStringExtra(&quot;MSG_KEY&quot;);\n<\/pre>\n<hr\/>\n<h2>3. R\u00e9cup\u00e9rer une valeur de retour lorsqu&rsquo;on revient \u00e0 la premi\u00e8re activit\u00e9<\/h2>\n<ul>\n<li>On lance l&rsquo;intent avec la m\u00e9thode <code>startActivityForResult<\/code><\/li>\n<li>On impl\u00e9mente la m\u00e9thode <code>onActivityResult<\/code>, qui sera ex\u00e9cut\u00e9e lorsque la seconde activit\u00e9 est termin\u00e9e, et qu&rsquo;on retourne \u00e0 la premi\u00e8re.<\/li>\n<\/ul>\n<h3>3.1. La m\u00e9thode <code>startActivityForResult<\/code><\/h3>\n<pre class=\"brush: java; gutter: true\">\nvoid startActivityForResult (\n    Intent intent,\n    int requestCode)\n<\/pre>\n<p>Le <code>requestCode<\/code> sera renvoy\u00e9 \u00e0 l&rsquo;activit\u00e9 lors du retour.<\/p>\n<h4>TP<\/h4>\n<p><em>\u00c0 quoi sert-il ?<\/em><\/p>\n<h3>3.2. La m\u00e9thode <code>onActivityResult<\/code><\/h3>\n<pre class=\"brush: java; gutter: true\">\nvoid onActivityResult (\n    int requestCode,\n    int resultCode,\n    Intent data)\n<\/pre>\n<ul>\n<li>Le <code>resultCode<\/code> est assign\u00e9 dans l&rsquo;activit\u00e9 2 par la m\u00e9thode <code>setResult(int)<\/code>\n<ul>\n<li>Par d\u00e9faut (si rien n&rsquo;a \u00e9t\u00e9 assign\u00e9 ou crash) ce sera la constante <code>Activity.RESULT_CANCELED<\/code><\/li>\n<li>Une autre valeur pr\u00e9d\u00e9finie est <code>Activity.RESULT_OK<\/code><\/li>\n<li>Toute autre valeur est possible (code perso)<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>3.3. Renvoyer des donn\u00e9es<\/h3>\n<p>On utilise de nouveau un Intent.<\/p>\n<ul>\n<li>Cr\u00e9er un objet <code>Intent<\/code> avec son constructeur par d\u00e9faut<\/li>\n<li>Ajouter des donn\u00e9es (<code>putExtra<\/code>)<\/li>\n<li>Assigner l&rsquo;intent au r\u00e9sultat qui sera renvoy\u00e9, avec <code>setResult(int, Intent)<\/code><\/li>\n<\/ul>\n<pre class=\"brush: java; gutter: true\">\nIntent resultIntent = new Intent();\nresultIntent.putExtra(&quot;RET_KEY&quot;, message);\nsetResult(Activity.RESULT_OK, resultIntent);\nfinish();\n<\/pre>\n<h4>TP<\/h4>\n<ul>\n<li>Reprenez le projet pr\u00e9c\u00e9dent (ou bien dupliquez-le de nouveau)<\/li>\n<li>Ajoutez dans la seconde activit\u00e9 :\n<ul>\n<li>un champ de saisie<\/li>\n<li>un bouton <em>OK<\/em><\/li>\n<\/ul>\n<\/li>\n<li>Ajoutez dans la premi\u00e8re activit\u00e9 un champ de texte pour recevoir le message de retour<\/li>\n<li>Terminez l&rsquo;impl\u00e9mentation pour qu&rsquo;un message saisi dans le champs de saisie soit plac\u00e9 dans le champs de texte<\/li>\n<li>Utilisez le code de retour (<code>resultCode<\/code>) pour savoir si l&rsquo;activit\u00e9 2 a termin\u00e9 via le bouton <em>OK<\/em> ou via le bouton <em>retour<\/em> du syst\u00e8me (utilisez un Toast pour indiquer le r\u00e9sultat).<\/li>\n<\/ul>\n<hr\/>\n<h2>4. Intent explicite vs implicite<\/h2>\n<ul>\n<li>Jusqu&rsquo;\u00e0 maintenant on a utilis\u00e9 des Intent <em>explicites<\/em>, c&rsquo;est \u00e0 dire qu&rsquo;on a indiqu\u00e9 explicitement l&rsquo;activit\u00e9 \u00e0 lancer.<\/li>\n<li>Dans le cas d&rsquo;Intent implicites\n<ul>\n<li>on indique seulement une action \u00e0 r\u00e9aliser<\/li>\n<li>le syst\u00e8me doit choisir quelle activit\u00e9 lancer<\/li>\n<li>si plusieurs sont possibles il demande \u00e0 l&rsquo;utilisateur<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>4.1. Exemple d&rsquo;intent implicite<\/h2>\n<ul>\n<li>Envoyer une cha\u00eene de texte<\/li>\n<li>Le syst\u00e8me propose toutes les activit\u00e9s capables de recevoir une cha\u00eene de texte, il affiche cet <em>app chooser<\/em><\/li>\n<\/ul>\n<p><img decoding=\"async\" src=\"https:\/\/developer.android.com\/images\/training\/basics\/intent-chooser.png\" alt=\"\" \/><br \/>\nsource:  <a href=\"https:\/\/developer.android.com\/guide\/components\/intents-filters.html\">https:\/\/developer.android.com\/guide\/components\/intents-filters.html<\/a><\/p>\n<h4>TP<\/h4>\n<ul>\n<li>Cherchez dans la documentation comment cr\u00e9er un intent implicite.<\/li>\n<li>Ajoutez \u00e0 votre application un bouton permettant d&rsquo;envoyer un texte \u00e0 une application capable de recevoir du texte<\/li>\n<\/ul>\n<h2>4.2 Recevoir un Intent implicite<\/h2>\n<p>Maintenant nous souhaitons que notre application soit capable de recevoir un Intent implicite. C&rsquo;est \u00e0 dire que lorsqu&rsquo;une application enverra un Intent avec une action donn\u00e9e, notre application soit propos\u00e9e parmi les possibilit\u00e9s. Il faut pour cela la d\u00e9clarer dans le fichier <code>Manifest<\/code>.<\/p>\n<h3>TP<\/h3>\n<ul>\n<li>Retrouvez dans la documentation (m\u00eame pas que pr\u00e9c\u00e9demment) les \u00e9l\u00e9ments \u00e0 ajouter au fichier <code>Manifest<\/code>.<\/li>\n<li>D\u00e9clarez que la seconde activit\u00e9 de votre appli est capable de recevoir des actions de type <code>ACTION_SEND<\/code><\/li>\n<li>Testez, est-ce que le message est bien re\u00e7u par l&rsquo;activit\u00e9 (retrouvez vous bien le texte). Si non d&rsquo;o\u00f9 peut venir le probl\u00e8me ? Corrigez.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Principe On cr\u00e9e un objet Intent On ins\u00e9rer les \u00e9ventuels param\u00e8tres dans cet objet On envoie cet objet Intent au syst\u00e8me (m\u00e9thode startActivity) Le syst\u00e8me d\u00e9marre l&rsquo;activit\u00e9 ad\u00e9quate source: https:\/\/developer.android.com\/guide\/components\/intents-filters.html Table des mati\u00e8res D\u00e9marrer une seconde activit\u00e9 depuis une premi\u00e8re<span class=\"ellipsis\">&hellip;<\/span> <span class=\"read-more\"><a href=\"https:\/\/chezdom.net\/etu\/android-courstp-4-intents\/\">Lire la suite &#8250;<\/a><\/span><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"jetpack_post_was_ever_published":false,"footnotes":""},"class_list":["post-753","page","type-page","status-publish","hentry"],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/P9qu1A-c9","_links":{"self":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/753","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/comments?post=753"}],"version-history":[{"count":15,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/753\/revisions"}],"predecessor-version":[{"id":1052,"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/pages\/753\/revisions\/1052"}],"wp:attachment":[{"href":"https:\/\/chezdom.net\/etu\/wp-json\/wp\/v2\/media?parent=753"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}