Concepts de base

Notions fondamentales dans le développement des applications Android

Ce site ne sera plus alimenté de contenu après août 2014. Tous les nouveaux articles seront redigés pour www.waitingforcode.com

Dans ce premier article consacré au développement d'une application sous Android, on abordera les fondamenteaux de ce domaine. On expliquera ce qui est Context, Intent, Bundle et Activity. Cette dernière notion est sans doute la plus importante. On verra pourquoi plus loin.

Qu'est-ce que c'est Activity sous Android ?

Activity peut être traduit en mot "activité". En analogie avec le monde des applications web, on peut dire qu'elle est une page web. Elle représente une chose que l'utilisateur peut faire à un moment donné.

Les activités sont gérées dans une pile d'activités. Chaque fois où une nouvelle activité est lancée, elle arrive à la première position de la pile et devient l'activité qui est actuellement exécutée. L'activité précédente reste dans la pile et ne pourra pas être lancée une fois la première activitée terminée.

L'activité est représentée par la classe Activity dont 7 méthodes illustrent le cycle de vie qu'elle peut prendre :
- onCreate : la méthode d'initialisation des vues, des paramètres et d'autres données. Elle prend en paramètre l'instance de la classe Bundle qu'on présentera plus loin dans l'article.
- onStart : appelée quand l'activité est rendue visible à l'utilisateur.
- onRestart : appelée à un nouveau démarrage de la même activité (quand l'activité était arrêtée)
- onResume : appelée quand l'activité commence à interagir avec l'utilisateur.
- onPause : méthode qui sert à arrêter une activité temporairement.
- onStop : cette fonction est utilisée quand l'activité n'est plus visible à l'utilisateur. Elle est cachée soit à cause d'une nouvelle activité lancée, soit parce que l'activité en cours s'apprête à être détruite.
- onDestroy : est invoquée quand l'activité est détruite. La destruction opère quand quelqu'un appele la méthode finish() ou quand c'est le système qui décide de tuer l'activité pour économiser de l'espace.

TODO : présenter d'une manière plus interactive

Qu'est-ce que c'est Bundle sous Android ?

Dans le paragraphe précédent on a mentionné l'existence d'un paramètre passé à la méthode onCreate. Il s'agitssait de l'instance de la classe Bundle.

Cette classe est une sorte de conteneur pour les données transmissibles d'une activité à l'autre. Elle permet de récupérer tout type de données : long, char, ArrayList ...

Mais attention, c'est une des 2 méthodes de transmission de données. L'autre se base sur les données stockées dans des intentions.

Qu'est-ce que c'est Intent sous Android ?

Les intentions sont des opérations qui permettent, entre autres, de naviguer entre les écrans. Grâce à elles on peut également passer des paramètres d'un écran à l'autre de notre application. C'est d'ailleurs cette méthode de passage qu'on utilisera dans notre exemple d'application développée sous Android.

Cependant, la navigation n'est pas la seule fonctionnalité des intentions. L'autre, aussi importante, est la possibilité d'écouter et de réagir à des événements extérieurs à l'application. Par exemple, grâce à des intentions, on peut capter le moment où notre connexion WiFi n'est plus disponible et exécuter une action dans notre application. On utilisera pour cela les broadcast receivers sous Android, qu'on abordera plus loin dans la série.

Une intention est donc définie par :
- une liste d'événements auxquels elle doit répondre
- un composant de l'application qui doit s'occuper de gérer l'événement capté

On distingue deux type d'intentions :
- explicite : on sait quelle activité on veut démarrer (par exemple pour passer à une activité "ShowSite" après le click sur le bouton "afficher le site")
- implicite : on ne sait pas quelle activité doit être invoquée. En occurrence, c'est Android qui va se charger de trouver l'activité adéquate à lancer (par exemple pour consulter un site web, il va lancer un des navigateurs disponibles).

Les intentions sont accompagnés de filtres. Ils regroupent des conditions que doit remplir une activité ou un broadcast receiver pour être exécuté.

Qu'est-ce que c'est Context sous Android ?

Essentiellement, un Context est une référence à des ressources gérées par l'application. Il permet également de récupérer les informations sur le système. Il fournit aussi l'accès à des services de l'Android.

Le contexte permet aussi de gérer d'autres aspects de l'application. Il doit d'ailleurs être employé pour pouvoir lancer une nouvelle activité, réceptionner les intentions ou écouter les événements. Voici les exemples plus précis :
- création de nouveaux objets (TextView, Adapter...)
- accès à des ressources (String, Array...)
- accès implicit à des components (par exemple getApplicationContext().getContentResolver() pour content resolver)

Comment récupérer le contexte ? Une des 4 méthodes le permet :
- getApplicationContext()
- getContext()
- getBaseContext()
- this - mais disponible uniquement quand on récupère le contexte depuis une activité

Qu'est-ce que c'est Service sous Android ?

Dans la définition du contexte, on a abordé l'existence des services. Les services sont des tâches qui peuvent être lancées avec ou sans intervention de l'utilisateur. Elles s'exécutent dans le background de l'application et peuvent se terminer soit après la finalisation de la tâche, soit à travers une intervention externe. Les services représentent également une fonctionnalité d'une application exposée à d'autres applications. Il est important de mentionner que le service ne fournit pas d'interface graphique (User Interface).

Un service concret hérite de la classe Service et surcharge des méthodes suivantes :
- onStartCommand : si un autre component (par exemple une activité) fait appel à un service via startService(), c'est la méthode onStartCommande du service qui est appelée en premier.
- onBind : pareil qu'onStartCommand. La seule différence repose dans le fait que cette méthode est appelée quand un autre component appelle le service avec bindService(). onBind doit retourner null si l'on souhaite que l'invocation du service depuis une autre application soit impossible.
- onCreate : elle est appelée après onStartCommand ou onBind. Cette méthode contient toutes les procédures nécessaires à l'initialisation du service.
- onDestroy : cette fonction est invoquée quand l'exécution du service doit être terminée. L'implémentation de cette méthode est nécessaire car chaque fin de l'exécution libère des ressources de l'Android.

Qu'est-ce que c'est Broadcast Receiver sous Android ?

A l'ocassion du chapitre consacré à des intentions on a brièvement présenté les broadcast receivers. Ici, on les développera un peu plus. Pour commencer, quelle définition on pourrait donner à des broadcast receivers ? Ce sont des classes implémentant BroadcastReceiver qui reçoivent des intentions et effectuent des actions spécifiques.

Ils vivent uniquement le temps qui est nécessaire pour traiter l'intention. Le traitement s'effectue dans la méthode onReceive() qui prend en paramètre les instances du Context et de l'Intent.

Les broadcast receivers sont destinés à exécuter de petites tâches, comme l'envoi d'une nouvelle localisation GPS, traitement rapide d'un mail envoyé. Android attribue à des broadcast receivers un laps de temps (10 seconds) dans lequel la tâche définie doit être terminée. Si au bout de ce temps le traitement n'est pas terminé, le broadcast receiver est immédiatement disponible à être tué si l'application a besoin de plus de mémoire.

Donc, ils ne sont pas adaptés à des tâches dont la durée est indéterminée ou très longue (plus que 10 seconds). Dans ce cas de figure on utilisera la conjonction du Service à broadcast receiver.

Qu'est-ce que c'est Content Provider sous Android ?

Certaines données d'une application doivent être partagées avec d'autres application. C'est le cas par exemple d'un carnet d'adresses qui peut être facilement utilisée par d'autres application pour pouvoir, par exemple, envoyer un SMS à un de ses contacts. Sous le principe de partage se cache la notion du Content Provider.

L'accès à ces données se fait via l'instance de la classe ContentResolver. Elle permet d'effectuer toutes les opérations CRUD (create, retreive, update, delete).

Dans cette partie on a vu les fondamentaux d'une application Android. Les chapitres suivants les présenteront plus en détail et, surtout, plus en pratique.

TODO : Implémenter service dans notre application

Bartosz KONIECZNY Concepts de base

Une question ? Une remarque ?

*

*

Un conseil JavaScript

Un scroll avec dialog box de jQuery UI ?

Si vous voyez une barre horizontale qui apparaît après l'ouverture d'un dialog box sous IE8, il peut s'agit d'un problème de ce module pour le navigateur en question. Pour y remedier, on peut utiliser la méthode open() et forcer le navigateur à cacher cette bare. Prenons un exemple vivant :

var dialogBox = $(href).dialog({ autoOpen: false, closeOnEscape: true,
  open: function() {  
        $('body').css('overflow-x', 'hidden');
  },
  close: function() {
        $('body').css('overflow-x', 'auto');  
  }
});  
dialogBox.dialog("open");