{"id":288,"date":"2021-08-27T00:28:53","date_gmt":"2021-08-27T00:28:53","guid":{"rendered":"https:\/\/www.louismarchand.me\/?page_id=288"},"modified":"2022-10-30T22:08:15","modified_gmt":"2022-10-30T22:08:15","slug":"android-les-activites","status":"publish","type":"page","link":"https:\/\/www.louismarchand.me\/index.php\/android-les-activites\/","title":{"rendered":"Les Activit\u00e9s"},"content":{"rendered":"<h2>Introduction<\/h2>\n<p>Les activit\u00e9s repr\u00e9sentent une famille de classe centrale dans la structure de code d&rsquo;Android. Une activit\u00e9 contient tous les m\u00e9canismes n\u00e9cessaires pour utiliser les diff\u00e9rents services Android (contexte, ressources, \u00ab\u00a0intents\u00a0\u00bb, etc.) Bien comprendre les activit\u00e9s en Android revient \u00e0 bien comprendre la structure applicative d&rsquo;Android. Par contre, la gestion des activit\u00e9s se fait diff\u00e9remment de l&rsquo;approche objet standard en Java.<\/p>\n<h2>Qu&rsquo;est-ce qu&rsquo;une activit\u00e9<\/h2>\n<p>La question peut avoir plusieurs r\u00e9ponses en fonction du point de vue que nous le prenons.<\/p>\n<p>Au niveau structural (programmation-objet), on peut voir une activit\u00e9 comme un contr\u00f4leur (voir mod\u00e8le MVC). Dans ce sens, il fait le pont entre les \u00e9l\u00e9ments du mod\u00e8le (par exemple, dans un logiciel de vente, ce serait les objets Produit, Client, Facture, etc.) et les vues (qui sont presque enti\u00e8rement g\u00e9r\u00e9s par des librairies Android externes \u00e0 votre programme et g\u00e9r\u00e9 dans les ressources). Ce contr\u00f4leur peut \u00eatre aid\u00e9 par d&rsquo;autres classes (helper, adaptateur, etc.) En g\u00e9n\u00e9ral, chaque application g\u00e8re un seul affichage (qu&rsquo;on pourrait appeler page).<\/p>\n<p>Au niveau code, on peut voir une activit\u00e9 comme le point d&rsquo;entr\u00e9e d&rsquo;une application. Contrairement \u00e0 une application conventionnelle; une application Android ne d\u00e9marre pas dans une fonction Main. Une application Android fonctionne par \u00e9v\u00e9nement. On pourrait dire d&rsquo;une certaine mani\u00e8re que le point d&rsquo;entr\u00e9e d&rsquo;une application Android est la m\u00e9thode \u00ab\u00a0onCreate\u00a0\u00bb d&rsquo;une Activit\u00e9. Il est par contre important de comprendre qu&rsquo;il s&rsquo;agit l\u00e0 d&rsquo;une simplification et que lorsque la m\u00e9thode onCreate est lanc\u00e9e, l&rsquo;application a d\u00e9j\u00e0 effectu\u00e9 une grande quantit\u00e9 de travail que nous ne voyons pas. Il est \u00e9galement important de sp\u00e9cifier qu&rsquo;il peut y avoir plusieurs \u00ab\u00a0points d&rsquo;entr\u00e9e\u00a0\u00bb dans une application Android. En effet, il peut y avoir plusieurs activit\u00e9s, dans la m\u00eame application, qui peut \u00eatre lanc\u00e9e par Android. Prenez par exemple une application de courriel. Si vous ouvrez l&rsquo;application \u00e0 partir de la liste d&rsquo;application, l&rsquo;activit\u00e9 pr\u00e9sentant une liste de courriel sera utilis\u00e9e comme point d&rsquo;entr\u00e9e. Par contre, si l&rsquo;utilisateur appuie sur une adresse courriel, il aura la possibilit\u00e9 de l&rsquo;ouvrir dans l&rsquo;application de courriel. Dans ce dernier cas, l&rsquo;activit\u00e9 qui permet d&rsquo;\u00e9crire un courriel sera utilis\u00e9e.<\/p>\n<p>Au niveau fonctionnalit\u00e9, on peut \u00e9galement voir l&rsquo;activit\u00e9 comme un pont entre le syst\u00e8me applicatif Android et l&rsquo;application. Par exemple, l&rsquo;activit\u00e9 permet de savoir si le syst\u00e8me Android veut d\u00e9truire l&rsquo;application, le mettre en pause, le red\u00e9marrer, etc. \u00c9galement, l&rsquo;activit\u00e9 permet d&rsquo;avoir facilement acc\u00e8s \u00e0 un objet \u00ab\u00a0context\u00a0\u00bb d&rsquo;Android qui vous permet d&rsquo;avoir acc\u00e8s aux diff\u00e9rents services d&rsquo;Android (ressources de l&rsquo;application, service externe, Cam\u00e9ra, localisation, Bluetooth, etc.)<\/p>\n<h2>Configuration d&rsquo;une activit\u00e9<\/h2>\n<p>Les activit\u00e9s de l&rsquo;application doivent \u00eatre configur\u00e9es dans le fichier manifeste de l&rsquo;application. Il est tr\u00e8s important de comprendre que chaque activit\u00e9 doit \u00eatre sp\u00e9cifi\u00e9e dans le fichier manifeste afin d&rsquo;\u00eatre utilis\u00e9e. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;manifest<\/span> ... <span class=\"nt\">&gt;<\/span>\r\n  <span class=\"nt\">&lt;application<\/span> ... <span class=\"nt\">&gt;<\/span>\r\n      <span class=\"nt\">&lt;activity<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\".MonActivite\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n      ...\r\n  <span class=\"nt\">&lt;\/application ... &gt;\r\n<\/span>  ...\r\n<span class=\"nt\">&lt;\/manifest &gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est important de comprendre que le tag XML \u00ab\u00a0activity\u00a0\u00bb peut avoir beaucoup d&rsquo;attributs diff\u00e9rents qui font une multitude de choses, mais la seule attribut obligatoire est l&rsquo;attribut \u00ab\u00a0android:name\u00a0\u00bb qui doit contenir le nom de la classe Android. Le point (\u00ab\u00a0.\u00a0\u00bb) au d\u00e9but du nom repr\u00e9sente le \u00ab\u00a0package\u00a0\u00bb Java en cours. Si vous vouliez utiliser une activit\u00e9 dont le code Java se trouvait dans le \u00ab\u00a0package\u00a0\u00bb Java \u00ab\u00a0com.autre.package\u00a0\u00bb, je pourrais utiliser le tag \u00ab\u00a0android:name\u00a0\u00bb suivant: \u00ab\u00a0com.autre.package.MonActivite\u00a0\u00bb.<\/p>\n<p>Les autres configurations seront pr\u00e9sent\u00e9es dans les diff\u00e9rentes sections ci-dessous.<\/p>\n<h2>Lancer une activit\u00e9<\/h2>\n<p>Lancer une activit\u00e9 se fait sur 3 \u00e9tapes.<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>La premi\u00e8re \u00e9tape consiste \u00e0 configurer les \u00ab\u00a0Intents\u00a0\u00bb de la prochaine activit\u00e9;<\/li>\n<li>Lancer l&rsquo;activit\u00e9;<\/li>\n<li>\u00c0 partir du \u00ab\u00a0onCreate\u00a0\u00bb de la nouvelle activit\u00e9 (celle lanc\u00e9e), aller rechercher les \u00ab\u00a0Intents\u00a0\u00bb (si n\u00e9cessaire).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici un exemple de lancement d&rsquo;activit\u00e9:<\/p>\n<p>Voici l&rsquo;activit\u00e9 principale:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onClickButton<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">vue<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">secondeActiviteIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"n\">SecondeActivite<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">startActivity<\/span><span class=\"p\">(<\/span><span class=\"n\">secondeActiviteIntent<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans ce cas, puisqu&rsquo;aucune valeur n&rsquo;a \u00e9t\u00e9 envoy\u00e9e \u00e0 la seconde activit\u00e9, il n&rsquo;est pas n\u00e9cessaire de montrer cette derni\u00e8re. Elle se comporte exactement comme l&rsquo;activit\u00e9 principale.<\/p>\n<p>Maintenant, disons que j&rsquo;aimerais envoyer un message de l&rsquo;activit\u00e9 principale \u00e0 la seconde activit\u00e9. Dans ce cas, il faut utiliser la m\u00e9thode \u00ab\u00a0putExtra\u00a0\u00bb. Cette m\u00e9thode permet d&rsquo;envoyer certains types d&rsquo;objets (types primitifs, array, Bundle, Serialisable, etc.) Voir la documentation de \u00ab\u00a0putExtra\u00a0\u00bb ici: <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/Intent#putExtra(java.lang.String,%20android.os.Parcelable)\">https:\/\/developer.android.com\/reference\/android\/content\/Intent#putExtra(java.lang.String,%20android.os.Parcelable)<\/a>.<\/p>\n<p>Voici ce que donnerait l&rsquo;activit\u00e9 principale:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onClickButton<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">vue<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">secondeActiviteIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">SecondeActivite<\/span><span class=\"p\">.<\/span><span class=\"na\">class<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">secondeActiviteIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">putExtra<\/span><span class=\"p\">(<\/span><span class=\"s\">\"MON_MESSAGE\"<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"Salut\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">startActivity<\/span><span class=\"p\">(<\/span><span class=\"n\">secondeActiviteIntent<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Et maintenant l&rsquo;activit\u00e9 seconde:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_seconde_activite<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">secondeActiviteIntent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getIntent<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">Toast<\/span> <span class=\"n\">monToast<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">makeText<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">secondeActiviteIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getStringExtra<\/span><span class=\"p\">(<\/span><span class=\"s\">\"MON_MESSAGE\"<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_LONG<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">monToast<\/span><span class=\"p\">.<\/span><span class=\"na\">show<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h3>Lancer une activit\u00e9 d&rsquo;une autre application<\/h3>\n<p>Il ne faut pas directement lancer une activit\u00e9 d&rsquo;une autre application. Il faut demander \u00e0 Android de lancer une activit\u00e9 qui peut traiter un certain type de donn\u00e9e (fichier, texte, image, courriel, etc.) Pour se faire, il nous faut utiliser une m\u00e9canique de \u00ab\u00a0Intent\u00a0\u00bb particuli\u00e8re. Premi\u00e8rement, il faut sp\u00e9cifier un type d&rsquo;action \u00e0 envoyer \u00e0 l&rsquo;activit\u00e9 \u00e0 lancer. Pour se faire, on utilise la m\u00e9thode \u00ab\u00a0setAction\u00a0\u00bb. \u00c9galement, pour qu&rsquo;Android soit inform\u00e9 du type d&rsquo;activit\u00e9 \u00e0 ouvrir, il faut sp\u00e9cifier le type de donn\u00e9e qui sera envoy\u00e9 \u00e0 l&rsquo;autre activit\u00e9. Pour se faire, on utilise \u00ab\u00a0setType\u00a0\u00bb. Enfin, puisque plusieurs activit\u00e9s peuvent recevoir le message et que vous ne savez pas quelles activit\u00e9s seront s\u00e9lectionn\u00e9es par l&rsquo;utilisateur, il est important de respecter le standard dans les noms d&rsquo;extra \u00e0 utiliser dans la m\u00e9thode \u00ab\u00a0putExtra\u00a0\u00bb. En g\u00e9n\u00e9ral, on utilise \u00ab\u00a0EXTRA_TEXT\u00a0\u00bb, mais d&rsquo;autres types d&rsquo;extra pourraient \u00eatre utilis\u00e9s (\u00ab\u00a0EXTRA_TIME\u00a0\u00bb, \u00ab\u00a0EXTRA_EMAIL\u00a0\u00bb, \u00ab\u00a0EXTRA_USER\u00a0\u00bb, etc.) Par exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onClickButton<\/span><span class=\"p\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">vue<\/span><span class=\"p\">){<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">evoieIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">evoieIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">setAction<\/span><span class=\"p\">(<\/span><span class=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">ACTION_SEND<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">evoieIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">setType<\/span><span class=\"p\">(<\/span><span class=\"s\">\"text\/plain\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">evoieIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">putExtra<\/span><span class=\"p\">(<\/span><span class=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTRA_TEXT<\/span><span class=\"p\">,<\/span> <span class=\"s\">\"La cha\u00eene \u00e0 envoyer\"<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">startActivity<\/span><span class=\"p\">(<\/span><span class=\"n\">evoieIntent<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<h3>Lancer une activit\u00e9 d&rsquo;une autre application avec retour de valeur<\/h3>\n<p>En plus de lancer une activit\u00e9 d&rsquo;une autre application telle que vue plus haut, on peut s&rsquo;attendre \u00e0 recevoir des donn\u00e9es en retour. Par exemple, on peut demander \u00e0 une activit\u00e9 d&rsquo;un explorateur de fichier de retourner le nom d&rsquo;un fichier. Pour se faire, on utilise un \u00ab\u00a0ActivityResultLauncher\u00a0\u00bb. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span><\/span><span class=\"n\">ActivityResultLauncher<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">Intent<\/span><span class=\"o\">&gt;<\/span> <span class=\"n\">lanceurActivite<\/span> <span class=\"o\">=<\/span> <span class=\"n\">registerForActivityResult<\/span><span class=\"o\">(<\/span>\r\n        <span class=\"k\">new<\/span> <span class=\"n\">ActivityResultContracts<\/span><span class=\"o\">.<\/span><span class=\"na\">StartActivityForResult<\/span><span class=\"o\">(),<\/span>\r\n        <span class=\"k\">new<\/span> <span class=\"n\">ActivityResultCallback<\/span><span class=\"o\">&lt;<\/span><span class=\"n\">ActivityResult<\/span><span class=\"o\">&gt;()<\/span> <span class=\"o\">{<\/span>\r\n            <span class=\"nd\">@Override<\/span>\r\n            <span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onActivityResult<\/span><span class=\"o\">(<\/span><span class=\"n\">ActivityResult<\/span> <span class=\"n\">aResultat<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                <span class=\"k\">if<\/span> <span class=\"o\">(<\/span><span class=\"n\">aResultat<\/span><span class=\"o\">.<\/span><span class=\"na\">getResultCode<\/span><span class=\"o\">()<\/span> <span class=\"o\">==<\/span> <span class=\"n\">Activity<\/span><span class=\"o\">.<\/span><span class=\"na\">RESULT_OK<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n                    <span class=\"n\">Intent<\/span> <span class=\"n\">lData<\/span> <span class=\"o\">=<\/span> <span class=\"n\">aResultat<\/span><span class=\"o\">.<\/span><span class=\"na\">getData<\/span><span class=\"o\">();<\/span>\r\n                    <span class=\"n\">String<\/span> <span class=\"n\">lCheminFichier<\/span> <span class=\"o\">=<\/span> <span class=\"n\">lData<\/span><span class=\"o\">.<\/span><span class=\"na\">getData<\/span><span class=\"o\">().<\/span><span class=\"na\">getPath<\/span><span class=\"o\">();<\/span>\r\n                    <span class=\"c1\">\/\/ Faire quelque chose avec lCheminFichier<\/span>\r\n                <span class=\"o\">}<\/span>\r\n            <span class=\"o\">}<\/span>\r\n        <span class=\"o\">}<\/span>\r\n<span class=\"o\">);<\/span>\r\n\r\n<span class=\"kd\">public<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">boutonClick<\/span><span class=\"o\">(<\/span><span class=\"n\">View<\/span> <span class=\"n\">aVue<\/span><span class=\"o\">)<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">lIntent<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"n\">Intent<\/span><span class=\"o\">(<\/span><span class=\"n\">Intent<\/span><span class=\"o\">.<\/span><span class=\"na\">ACTION_GET_CONTENT<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lIntent<\/span><span class=\"o\">.<\/span><span class=\"na\">setType<\/span><span class=\"o\">(<\/span><span class=\"s\">&quot;*\/*&quot;<\/span><span class=\"o\">);<\/span>\r\n    <span class=\"n\">lanceurActivite<\/span><span class=\"o\">.<\/span><span class=\"na\">launch<\/span><span class=\"o\">(<\/span><span class=\"n\">lIntent<\/span><span class=\"o\">);<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Dans cet exemple, une activit\u00e9 pouvant retourner un nom de fichier est lanc\u00e9e et lorsque cette activit\u00e9 a termin\u00e9, elle retourne le nom de fichier dans l&rsquo;argument \u00ab\u00a0lData\u00a0\u00bb de l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onActivityResult\u00a0\u00bb.<\/p>\n<h3>Permettre aux autres applications de lancer une activit\u00e9<\/h3>\n<p>Si vous d\u00e9sirez que les activit\u00e9s des autres applications puissent lancer une (ou plusieurs) activit\u00e9 de votre application, vous devez utiliser un \u00ab\u00a0Intent filter\u00a0\u00bb dans le \u00ab\u00a0Manifest\u00a0\u00bb de votre application. Dans ce \u00ab\u00a0Intent filter\u00a0\u00bb, vous devez sp\u00e9cifier le (ou les) type d&rsquo;action accept\u00e9, le (ou les) type de donn\u00e9e accept\u00e9 ainsi qu&rsquo;une (ou plusieurs) cat\u00e9gorie de transfert. Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"nt\">&lt;activity<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\".SecondeActivite\"<\/span><span class=\"nt\">&gt;<\/span>\r\n    <span class=\"nt\">&lt;intent-filter&gt;<\/span>\r\n        <span class=\"nt\">&lt;action<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.action.SEND\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;category<\/span> <span class=\"na\">android:name=<\/span><span class=\"s\">\"android.intent.category.DEFAULT\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n        <span class=\"nt\">&lt;data<\/span> <span class=\"na\">android:mimeType=<\/span><span class=\"s\">\"text\/plain\"<\/span> <span class=\"nt\">\/&gt;<\/span>\r\n    <span class=\"nt\">&lt;\/intent-filter&gt;<\/span>\r\n<span class=\"nt\">&lt;\/activity&gt;<\/span>\r\n<\/pre>\n<\/div>\n<p>Une fois qu&rsquo;on a sp\u00e9cifi\u00e9 le \u00ab\u00a0Intent filter\u00a0\u00bb, nous pouvons envoyer de l&rsquo;information \u00e0 l&rsquo;activit\u00e9 comme sp\u00e9cifi\u00e9 plus haut. Du code de l&rsquo;activit\u00e9 appel\u00e9, on va chercher les informations avec \u00ab\u00a0getIntent\u00a0\u00bb de la m\u00eame mani\u00e8re que si l&rsquo;appel avait \u00e9t\u00e9 fait \u00e0 partir de l&rsquo;application en cours (en utilisant (EXTRA_TEXT ou quelque chose comme \u00e7a dans l&rsquo;argument nom de \u00ab\u00a0get*Extra\u00a0\u00bb). Voici un exemple:<\/p>\n<div class=\"highlight\">\n<pre><span class=\"kd\">protected<\/span> <span class=\"kt\">void<\/span> <span class=\"nf\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">Bundle<\/span> <span class=\"n\">savedInstanceState<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"kd\">super<\/span><span class=\"p\">.<\/span><span class=\"na\">onCreate<\/span><span class=\"p\">(<\/span><span class=\"n\">savedInstanceState<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">setContentView<\/span><span class=\"p\">(<\/span><span class=\"n\">R<\/span><span class=\"p\">.<\/span><span class=\"na\">layout<\/span><span class=\"p\">.<\/span><span class=\"na\">activity_seconde_activite<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">Intent<\/span> <span class=\"n\">secondeActiviteIntent<\/span> <span class=\"o\">=<\/span> <span class=\"n\">getIntent<\/span><span class=\"p\">();<\/span>\r\n    <span class=\"n\">Toast<\/span> <span class=\"n\">monToast<\/span> <span class=\"o\">=<\/span> <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">makeText<\/span><span class=\"p\">(<\/span><span class=\"k\">this<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"n\">secondeActiviteIntent<\/span><span class=\"p\">.<\/span><span class=\"na\">getStringExtra<\/span><span class=\"p\">(<\/span><span class=\"n\">Intent<\/span><span class=\"p\">.<\/span><span class=\"na\">EXTRA_TEXT<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"n\">Toast<\/span><span class=\"p\">.<\/span><span class=\"na\">LENGTH_LONG<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"n\">monToast<\/span><span class=\"p\">.<\/span><span class=\"na\">show<\/span><span class=\"p\">();<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/pre>\n<\/div>\n<p>Il est important de comprendre qu&rsquo;il existe une tr\u00e8s grande quantit\u00e9 d&rsquo;actions et de cat\u00e9gories d&rsquo;Intent possible. Il est presque impossible de toutes les expliquer ici. Donc, je vous recommande d&rsquo;aller voir la documentation suivante afin de rapidement voir quel type d&rsquo;Intent existe dans Android. \u00c7a pourra vous aider \u00e0 savoir ce qui existe lors du d\u00e9veloppement. Voir: <a href=\"https:\/\/developer.android.com\/reference\/android\/content\/Intent#standard-activity-actions\">https:\/\/developer.android.com\/reference\/android\/content\/Intent#standard-activity-actions<\/a>.<\/p>\n<h2>Le cycle de vie d&rsquo;une activit\u00e9<\/h2>\n<p>Une autre connaissance importante dans le contexte d&rsquo;une activit\u00e9 Android correspond aux diff\u00e9rentes \u00e9tapes du cycle de vie de celle-ci ainsi que les diff\u00e9rents \u00e9v\u00e9nements qui surviennent lors de ces diff\u00e9rentes \u00e9tapes.<\/p>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>La premi\u00e8re \u00e9tape correspond \u00e0 la cr\u00e9ation de l&rsquo;activit\u00e9. Lors de cette cr\u00e9ation, l&rsquo;\u00e9v\u00e9nement onCreate est lanc\u00e9.\n<ul>\n<li>Cet \u00e9v\u00e9nement est le seul \u00e9v\u00e9nement obligatoire;<\/li>\n<li>L&rsquo;\u00e9v\u00e9nement onCreate a minimalement la responsabilit\u00e9 d&rsquo;initialiser le syst\u00e8me de ressources en lan\u00e7ant \u00ab\u00a0setContentView\u00a0\u00bb.<\/li>\n<li>Il est \u00e0 noter que cet \u00e9v\u00e9nement peut lancer la m\u00e9thode \u00ab\u00a0Finish\u00a0\u00bb pour annuler l&rsquo;ouverture de l&rsquo;activit\u00e9. Dans ce cas, le seul autre \u00e9v\u00e9nement qui sera appel\u00e9 est le \u00ab\u00a0onDestroy\u00a0\u00bb.<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onCreate(Bundle)\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement.<\/li>\n<li>L&rsquo;argument \u00ab\u00a0Bundle\u00a0\u00bb permet d&rsquo;aller chercher les donn\u00e9es plac\u00e9es en m\u00e9moire par la m\u00e9thode \u00ab\u00a0onSaveInstanceState\u00a0\u00bb. Sachez que cet argument peut \u00eatre \u00ab\u00a0null\u00a0\u00bb;\n<ul>\n<li>Cet argument est utile pour garder des donn\u00e9es lorsqu&rsquo;Android met fin \u00e0 l&rsquo;activit\u00e9.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Juste apr\u00e8s l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onCreate\u00a0\u00bb, l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStart\u00a0\u00bb est lanc\u00e9.\n<ul>\n<li>Contrairement \u00e0 l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onCreate\u00a0\u00bb, l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStart\u00a0\u00bb est lanc\u00e9 apr\u00e8s le \u00ab\u00a0onRestart\u00a0\u00bb et n&rsquo;est pas lanc\u00e9 si le \u00ab\u00a0onCreate\u00a0\u00bb fait un appel \u00e0 \u00ab\u00a0finish\u00a0\u00bb.<\/li>\n<li>Si \u00ab\u00a0onStart\u00a0\u00bb fait un appel \u00e0 \u00ab\u00a0finish\u00a0\u00bb, les m\u00e9thodes \u00ab\u00a0onStop\u00a0\u00bb et \u00ab\u00a0onDestroy\u00a0\u00bb seront lanc\u00e9s.<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onStart()\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement.<\/li>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStart\u00a0\u00bb ne prend aucun argument.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onResume\u00a0\u00bb est lanc\u00e9 apr\u00e8s les \u00e9v\u00e9nements \u00ab\u00a0onStart\u00a0\u00bb, \u00ab\u00a0onRestart\u00a0\u00bb et \u00ab\u00a0onPause\u00a0\u00bb.\n<ul>\n<li>Il est important de pr\u00e9ciser que contrairement au \u00ab\u00a0onCreate\u00a0\u00bb, \u00ab\u00a0onStart\u00a0\u00bb et \u00ab\u00a0onRestart\u00a0\u00bb, lors de l&rsquo;appel de cet \u00e9v\u00e9nement, l&rsquo;interface utilisateur est op\u00e9rationnelle.<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onResume()\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement.<\/li>\n<li>Cet \u00e9v\u00e9nement ne prend aucun argument.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onPause\u00a0\u00bb arrive lorsque l&rsquo;activit\u00e9 perd le focus de l&rsquo;utilisateur, mais peut potentiellement \u00eatre toujours visible par l&rsquo;utilisateur;\n<ul>\n<li>G\u00e9n\u00e9ralement appel\u00e9 lorsque l&rsquo;utilisateur utilise le bouton \u00ab\u00a0pr\u00e9c\u00e9dent\u00a0\u00bb ou le bouton \u00ab\u00a0Activit\u00e9s r\u00e9centes\u00a0\u00bb sur son appareil;<\/li>\n<li>Il est important de continuer de g\u00e9rer l&rsquo;interface graphique apr\u00e8s cet \u00e9v\u00e9nement;<\/li>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onResume\u00a0\u00bb sera lanc\u00e9 par la suite si l&rsquo;utilisateur remet le focus sur l&rsquo;activit\u00e9 ou l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStop\u00a0\u00bb dans les autres cas;<\/li>\n<li>Cet \u00e9v\u00e9nement ne doit pas \u00eatre utilis\u00e9 pour sauvegarder des donn\u00e9es (\u00e9tat de l&rsquo;activit\u00e9, donn\u00e9es de l&rsquo;utilisateur, base de donn\u00e9es) ou faire des transactions r\u00e9seau (incluant requ\u00eate Web). Utiliser l&rsquo;\u00e9v\u00e9nement onSaveInstanceStart (que je ne pr\u00e9senterai pas ici) pour sauvegarder des donn\u00e9es;<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onPause()\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement;<\/li>\n<li>Cet \u00e9v\u00e9nement ne prend aucun argument.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStop\u00a0\u00bb est appel\u00e9 lorsque l&rsquo;activit\u00e9 en pause n&rsquo;est plus visible par l&rsquo;utilisateur.\n<ul>\n<li>Cela arrive par exemple lorsque l&rsquo;activit\u00e9 se termine ou lorsqu&rsquo;une autre activit\u00e9 est en cours (la m\u00e9thode \u00ab\u00a0onResume\u00a0\u00bb de l&rsquo;autre activit\u00e9 a \u00e9t\u00e9 lanc\u00e9e);<\/li>\n<li>Cet \u00e9v\u00e9nement est g\u00e9n\u00e9ralement suivi par un des \u00e9v\u00e9nements \u00ab\u00a0onRestart\u00a0\u00bb ou \u00ab\u00a0onDestroy\u00a0\u00bb;<\/li>\n<li>Lorsqu&rsquo;une autre activit\u00e9 plus prioritaire n\u00e9cessite beaucoup de m\u00e9moire, il est possible que l&rsquo;activit\u00e9 arr\u00eat\u00e9e soit vid\u00e9e d&rsquo;une partie de sa m\u00e9moire. Dans ce cas, l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onCreate\u00a0\u00bb sera lanc\u00e9 au lieu de \u00ab\u00a0onRestart\u00a0\u00bb et ce, sans que l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onDestroy\u00a0\u00bb ne soit lanc\u00e9.<\/li>\n<li>Cet \u00e9v\u00e9nement peut \u00eatre utilis\u00e9 afin d&rsquo;arr\u00eater les modifications d&rsquo;interfaces (animation, vid\u00e9o, etc.)<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onStop()\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement;<\/li>\n<li>Cet \u00e9v\u00e9nement ne prend aucun argument.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>L&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onRestart\u00a0\u00bb est appel\u00e9 lorsqu&rsquo;une activit\u00e9 en arr\u00eat (que l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onStop\u00a0\u00bb a \u00e9t\u00e9 appel\u00e9) est remis en avant-plan par l&rsquo;utilisateur.\n<ul>\n<li>Cet \u00e9v\u00e9nement est toujours suivi par un \u00e9v\u00e9nement \u00ab\u00a0onStart\u00a0\u00bb.<\/li>\n<li>Il est important de lancer \u00ab\u00a0super.onRestart()\u00a0\u00bb au d\u00e9but de cet \u00e9v\u00e9nement;<\/li>\n<li>Cet \u00e9v\u00e9nement ne prend aucun argument.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<ul>\n<li style=\"list-style-type: none;\">\n<ul>\n<li>Avant de d\u00e9truire d\u00e9finitivement une activit\u00e9, le syst\u00e8me Android appelle l&rsquo;\u00e9v\u00e9nement \u00ab\u00a0onDestroy\u00a0\u00bb.\n<ul>\n<li>Apr\u00e8s l&rsquo;appel de cette m\u00e9thode, l&rsquo;activit\u00e9 n&rsquo;existe plus dans la m\u00e9moire du syst\u00e8me.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Voici un petit diagramme pour bien voir ce cycle de vie d&rsquo;une activit\u00e9. Prendre en note que pour ne pas complexifier inutilement le diagramme, je n&rsquo;ai pas repr\u00e9sent\u00e9 le cas o\u00f9 la m\u00e9thode \u00ab\u00a0finish\u00a0\u00bb serait appel\u00e9e par les \u00e9v\u00e9nements \u00ab\u00a0onCreate\u00a0\u00bb ou \u00ab\u00a0onStart\u00a0\u00bb (voir plus haut pour les d\u00e9tails).<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter wp-image-10280 size-full\" src=\"https:\/\/www.louismarchand.me\/wp-content\/uploads\/2021\/08\/cycle.png\" alt=\"\" width=\"672\" height=\"342\" \/><\/p>\n<h2>Et plus encore!!!<\/h2>\n<p>Il est important de comprendre que cette th\u00e9orie pr\u00e9sente uniquement une base de ce qu&rsquo;une activit\u00e9 peut faire. Il existe plein d&rsquo;autres fonctionnalit\u00e9s et \u00e9v\u00e9nements qui peuvent vous \u00eatre utiles dans votre d\u00e9veloppement. Pour plus de d\u00e9tails, voir la documentation officielle de la classe Activity: <a href=\"https:\/\/developer.android.com\/reference\/android\/app\/Activity\">ici<\/a>.<\/p>\n<p><a href=\"https:\/\/www.louismarchand.me\/index.php\/programmation-android\/\">Retour<\/a><\/p>\n<hr \/>\n<p>Auteur: Louis Marchand<br \/>\n<a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\"><img decoding=\"async\" src=\"https:\/\/i.creativecommons.org\/l\/by\/4.0\/80x15.png\" alt=\"Creative Commons License\" \/><\/a><br \/>\nSauf pour les sections sp\u00e9cifi\u00e9es autrement, ce travail est sous licence <a href=\"https:\/\/creativecommons.org\/licenses\/by\/4.0\/deed.fr\" target=\"_blank\" rel=\"license noopener noreferrer\">Creative Commons Attribution 4.0 International<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Introduction Les activit\u00e9s repr\u00e9sentent une famille de classe centrale dans la structure de code d&rsquo;Android. Une activit\u00e9 contient tous les m\u00e9canismes n\u00e9cessaires pour utiliser les diff\u00e9rents services Android (contexte, ressources, \u00ab\u00a0intents\u00a0\u00bb, etc.) Bien comprendre les activit\u00e9s en Android revient \u00e0 bien comprendre la structure applicative d&rsquo;Android. Par contre, la gestion des activit\u00e9s se fait diff\u00e9remment&hellip; <a class=\"more-link\" href=\"https:\/\/www.louismarchand.me\/index.php\/android-les-activites\/\">Continue reading <span class=\"screen-reader-text\">Les Activit\u00e9s<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-288","page","type-page","status-publish","hentry","entry"],"_links":{"self":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/288","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/comments?post=288"}],"version-history":[{"count":9,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/288\/revisions"}],"predecessor-version":[{"id":749,"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/pages\/288\/revisions\/749"}],"wp:attachment":[{"href":"https:\/\/www.louismarchand.me\/index.php\/wp-json\/wp\/v2\/media?parent=288"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}