Accueil / Articles PiApplications. / La plate-forme Android

Les intentions base des applications Android.

Android est une plate-forme construite d'un commun effort entre la société Google et l'Open Handset Alliance qui regroupe plus d'une douzaine de sociétés.

Rappels sur l'architecture Android.

Cet article se concentre autour de ce qu'Android nomme une "intention" (classe Intent). Ceci nous amènera à décrire plus tard les 4 classes majeures d'une application Android :

  1. Activity (une activité),
  2. Service (un service),
  3. ContentProvider (fournisseur de contenu),
  4. BroadcastReceiver (récepteur de diffusion).

Bien qu'Android soit lui-même écrit en C/C++ et qu'il supporte les développements en langage Java et C/C++, nous nous concentrerons sur l'écriture en langage Java vis l'IDE Android Studio dérivée d'IntelliJ présentée par Google comme le successeur de l'IDE Eclipse et de son extension ADT.

Android est développé sur un noyau Linux équipé des pilotes nécessaires aux périphériques comme le Wi-Fi, Blue tooth, le GPS, l'objectif photographique, l'écran tactile, l'accéléromètre, etc. Mais Android comporte également des librairies très utiles :

Au-dessus de ceci nous trouvons la JVM Dalvik (ou sa remplaçante). Pour des raisons de licence, Android (et donc Google) ne peut pas exécuter du byte-code Java qui est sous licence Oracle (même si le langage, lui, est libre). Le byte-code est donc transformé en fichiers dex ce qui ne place plus la langage sous la main-mise d'Oracle. Ainsi, littéralement, une librairie (.jar) issue d'une compilation Java ne s'exécutera pas sur Android. Elle devra être à son tour transformée. On dit qu'Android est compatible Java au niveau du source (et non du byte-code).

Avec la JVM Android, la notion très stricte de processus est beaucoup plus lâche. Formellement une application est constituée d'un processus comportant un thread principal et pouvant exécuter de nombreux threads secondaires. Dans la pratique, il faut voir une application comme un ensemble de classes qui se partagent les ressources physiques de l'appareil. Les classes de base qui permettent les interactions entre l'application et le système sont des activités, des services, des fournisseurs de contenu ou des récepteurs de diffusion. Chacune de ces classes disposent de gestionnaires d'évènements (méthodes callbacks) émis par le système et qui fixent le cycle de vie de l'application.

L'intention dans le développement Android.

Les limitations des interfaces des périphériques mobiles imposent une ergonomie dépouillée (idéalement, une action à exécuter = un seul clic). Android a dû réfléchir à la manière d'invoquer un service par le moyen le plus direct. Le résultat de cette réflexion a conduit à l'intention qui elle-même s'appuie sur les URI. Les URI, comme leur nom l'indique; (Uniform Resource Locator) permettent une localisation directe d'une ressource chargée d'exécutée l'action. Android a du enrichir le "schéma" d'un URI de façon à pouvoir invoquer toute sorte de ressources.

Ainsi, un des composant fondamentaux de l'architecture logicielle d'Android est "l'intention". Elle agit un peu comme une sorte d'évènement d'une portée adaptable (de l'application à la totalité du système). L'intention est ce que vous souhaitez obtenir (le quoi) sans avoir à vous soucier de la façon dont vous l'obtenez (le comment). Il s'agit en quelque sorte d'un souhait de service comme par exemple "je souhaiterai visualiser tel site Web".

Une intention n'a pas sa portée limitée à l'application qui l'émet sauf si le développeur en décide ainsi. Les intentions permettent donc aux applications de coopérer entres elles via un couplage lâche qui sert de mécanisme de base à la communication inter processus (IPC ou Inter Processes Communication).

Le coeur d'une intention est un verbe : VIEW, PICK ou EDIT par exemple. La classe Intent comporte de nombreux verbes mais il est possible de lui en ajouter d'autres. La donnée de l'intention est un URI "enrichi" (le protocole est appelé ici schéma) comme par exemple content://contacts/people.

Voici un exemple pour récupérer un contact via l'envoi d'une intention :

Intent inn = new Intent(Intent.ACTION_PICK,Uri.parse("content://contacts/people"));
startActivity(inn);

Rien ne permet de présumer qui sera le meilleur récepteur de l'intention. Cela peut être l'application elle-même, une autre application qu'elle soit native au système ou fournie par un tiers. Il est toutefois possible de préciser explicitement le destinataire de l'intention en fixant sa classe dans l'intention.

public void onClick(View viw)
{
  try
  {
    startActivityForResult(new Intent(viw.getContext(), TargetClass.class), 0);
  }
  catch(Throwable thw)
  {
    ...
  }
}

Le filtre d'intention.

En miroir de l'intention, on trouve le "filtre d'intention" (classe IntentFilter). Cette classe est chargée de décrire l'intérêt et la capacité d'une activité, d'un service, etc. à répondre à une intention.

Le filtre d'intention peut être spécifique au verbe, à la donnée de l'intention ou aux deux. Un filtre d'intention possède aussi un attribut nommé "catégorie". Cette catégorie facilite le cassement des intentions. Par exemple CATEGORY_LAUNCHER précise à Android que l'activité qui dispose de ce filtre devra être visible depuis l'application principale ou depuis l'écran d'accueil.

Les filtres d'intention sont généralement déclarés dans le manifeste de l'application sous l'élément <intent-filter>.

Lorsqu'une intention est émise par un objet, le système recherche les activités, les services et les récepteurs de diffusion enregistrés (classe BroadcastReceiver) et route l'intention vers le destinataire le plus approprié. Les filtres d'intention jouent alors un rôle de premier plan dans la détermination du meilleur candidat à répondre à l'intention.

(c) PiApplications 2016