Android : découvrir les concepts de base
Voici donc notre premier article sur le développement d'applications Android. Dans cet article, nous allons découvrir quels sont les concepts de base d'Android, et comment ces composants s'articulent pour créer une application.
J'utiliserai Napply, l'application décrite dans mon article précédent, comme exemple de base. Pour les distraits et les paresseux, je rappelle que Napply est un widget qui permet de configurer son réveil en un clic. Jetez un coup d'œil à la capture ci-jointe pour avoir une idée du rendu final.
Je rappelle aussi que Napply est un logiciel-libre. Vous pouvez récupérer le code source, et construire vous-même le projet final.
Tout le monde est prêt ? C'est parti !
Première étape, installer son environnement de travail
Force est de constater que Google a mis le paquet pour nous favoriser la tâche des développeurs Android. Pour preuve, le SDK est extrèmement complet, et les outils mis à notre disposition nombreux et puissants. Enfin, tout ceci est parfaitement intégré dans un plugin Eclipse, ce qui fait qu'il est assez difficile (à mon grand dam, d'ailleurs) de se passer de cet IDE.
La première étape sera donc d'installer le SDK, de configurer son Eclipse, et vogue la galère ! Comme ces procédures sont déjà décrites extensivements, je serai fainéant et vous redirigerai vers d'autres introductions à Android.
Vous êtes paré ? Passons à la suite.
Découvrir les concepts de base
Toute application Android est invariablement composée des même briques de base, à savoir :
Activity : pour faire simple, une *activity* correspond à une fenêtre de votre application. Dans Napply, j'ai deux activities. La page «About» qui liste les instructions d'utilisation et qui se lance à l'installation de l'appli, et la page de configuration du widget, qui permet de choisir la durée de la sieste.
Service : un service est un processus qui effecute des traitements en arrière plan. On peut utiliser un service pour effectuer des traitements un peu trop couteux pour être lancés par une activity (et qui feraient freezer l'interface), ou l'utiliser réellement comme un daemon unix, et le laisser tourner ad vitam aeternam. Dans Napply, c'est un service qui se réveille quand un réveil doit sonner, et qui stream le fichier audio choisi.
Broadcast Receiver : c'est un écouteur de messages. Le système Android, de même que les autres applications, peuvent envoyer des messages dans le vent, sans spécifier de destinataires spécifiques. Par exemple, un message est envoyé pour indiquer que le système a fini de démarrer. Ou quand un nouveau signal wifi est détecté. Ou quand un nouveau sms est reçu.
Les broadcast receivers peuvent s'enregistrer comme destinataires de certains types de messages. À la réception, ils seront alors libres d'effectuer d'autres actions.
Dans Napply, quand l'alarme s'interrompt, le service lance un message ALARM_TERMINATED. La fenêtre de dialogue qui affiche les boutons «Snooze» et «Quitter» est à l'écoute de ce message, et se ferme automatiquement à sa réception.
À noter : les widgets sont des broadcast receivers.
Content Provider : une application peut utiliser différents moyens de stocker des données (sql, préférences, fichier, réseau, etc.). Implémenter un *content provider* permet aux autres composants de l'application, et éventuellement aux autres applications, de récupérer ces données de manière centralisée.
Intent : j'ai parlé plus haut des messages envoyés par le système Android. Ces messages sont appelés *Intent*. Les intents sont de basiques structures de données remplies d'informations diverses. Les composants d'une application (sauf les content providers) sont lancés via des intents. Par exemple, quand mon widget démarre le service interne de gestion d'alarme, il envoie en fait un intent. Quand je clique sur le bouton «snooze», mon activity envoie un intent au service. etc.
Les intents permettent aussi la communication inter-applications. Lancer un intent de mon appli me permet ainsi de démarrer une autre activité, fournie par une autre application, et de récupérer son résultat.
À l'aune de ces explications, voici comment s'articule notre application :
Décrire son application
Dernier élément de notre application : le fichier manifest. Tous les éléments de l'application qui doivent être portés à la connaissance du système Android doivent être décrits dans un fichier Manifest.xml, présent à la racine du projet. Ce fichier sert également à déclarer les prérequis de l'application, comme les permissions requises, ou la version minimale de l'OS nécessaire.
Pour exemple, voici le manifest final du projet :
<?xml version="1.0" encoding="utf-8"?> <!-- © Copyright 2011 Thibault Jouannic <thibault@jouannic.fr>. All Rights Reserved. This file is part of Napply. Napply is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Napply is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Napply. If not, see <http://www.gnu.org/licenses/>. --> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="fr.miximum.napply" android:versionCode="1" android:versionName="1.0.0"> <uses-permission android:name="android.permission.VIBRATE" /> <uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.WAKE_LOCK" /> <uses-sdk android:minSdkVersion="7" android:targetSdkVersion="8" /> <application android:label="@string/app_name" android:icon="@drawable/ic_launcher_napply"> <!-- Napply widget --> <receiver android:name="NapplyWidget"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_UPDATE" /> <action android:name="fr.miximum.napply.START_ALARM" /> <action android:name="fr.miximum.napply.CANCEL_ALARM" /> <action android:name="fr.miximum.napply.ALARM_TERMINATED" /> </intent-filter> <meta-data android:name="android.appwidget.provider" android:resource="@xml/napply_widget_meta" /> </receiver> <!-- Configure activity --> <activity android:name="WidgetConfigure" android:theme="@android:style/Theme.Dialog"> <intent-filter> <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE" /> </intent-filter> </activity> <!-- Ring alarm service --> <service android:name="AlarmService"> <intent-filter> <action android:name="fr.miximum.napply.RING_ALARM" /> <action android:name="fr.miximum.napply.CANCEL_ALARM" /> <action android:name="fr.miximum.napply.SNOOZE_ALARM" /> </intent-filter> </service> <!-- Dialog to show cancel/snooze dialog --> <activity android:name="AlarmCancelDialog" android:label="@string/wake_up" android:theme="@android:style/Theme.Dialog"> </activity> <activity android:name="About" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest>
Vous constaterez que l'on déclare ici les différents éléments de notre application : le widget, les activities, le service. Vous noterez également que l'on indique quels sont les types d'intent que recevront ces différents éléments.
C'est tout pour aujourd'hui. Dans notre prochain article, nous apprendrons à créer un widget.