+ +
Historique
Android
[email protected]
Source : Cours Olivier Le Goaer
+ +
Open Handset Alliance (OHA) La mascotte : "Bugdroid"
! Regroupement de + de 50 entreprises
! Fabricants de matériels
! Opérateurs mobile
! Développeurs d'applications
! ...
! Développer des normes ouvertes pour les appareils de
téléphonie mobile
+ +
Matériels Android Points forts d'Android
+ +
Versions d'Android Android en images
Jelly Bean 4.1
+ +
Marché d'applications Architecture logicielle
! Google Play Store
(anciennement Android Market)
! Play Store "privé"
! En milieu professionnel
! Tendance BYOD
! Auto-publication & marchés alternatifs
! YAAM
http://yaam.mobi/
! Bazaar
http://www.bazaarandroid.com/
! AndroLib
http://fr.androlib.com/
! …
+ +
Couches logicielles Machine virtuelle "Dalvik"
! Offre l'avantage de toute machine virtuelle
! Couche d'abstraction entre le développeur d'applications et des
implémentations matérielles particulières
! La VM Dalvik n'est pas une VM Java
! Tient compte des contraintes de CPU et mémoire
! Exécute des fichiers .dex (Dalvik Executable) optimisés
! La VM créé une instance Dalvik pour chaque application
! Les applications sont totalement indépendantes ("sandbox")
! Espaces protégés (mémoire, disque)
! Évite un plantage généralisé!
+ +
Priorités des processus Java pour Android
! Androidgère ses ! Concepts de la POO Java
! Paquetage, classe, annotation, héritage, interface...
ressources de manière
agressive ! Idiomes
! Pour garantir une haute ! Classes anonymes, classes internes, POJO...
réactivité
! Bibliothèques (API)
! Élimination de processus ! J2SE (subset) : java.io.*, java.lang.*...
sans avertissement !
! Android : android.view.*, android.telephony.*…
! Politique de priorité basée ! Google : com.google.android.maps.*...
sur une hiérarchisation des
processus ! Design patterns
! Singleton, Builder, Observer (Listener), DAO...
+ +
Outils du développeur Plugin ADT Eclipse
! Plugin Eclipse ADT (Android Development Tools)
! Assistant à la création de projets
! Créateur d'interface graphique (WYSIWYG)
! Vues et perspectives dédiées
! Android SDK
! API
! Emulateurs
! Débogueur, compilateur, empaqueteur, signature
! Exemples (démos)
! ...
+ +
Emulateur : aperçu Emulateur : limitations
! Lent au démarrage et à l'usage
! Noyau Linux + extensions android
! Fonctionnalités non-disponibles
! Appareil photo (Camera Webcam supporté)
! Vibreur
! Appels téléphoniques réels
! Capteurs en général
! Connexions USB
! Évolution de la charge de la batterie
+ +
Arborescence système Architecture de l’application
+ +
Externaliser les ressources Compilation et déploiement
! Android prévoit l'externalisation des
ressources
! Facilité de maintenance, de mise à jour et
de gestion
! Créer des ressources
! Simples valeurs, chaînes de caractères,
couleurs, menu, layout, styles, images, etc.
! Stockées dans les sous- répertoires de /res/
du projet
! un seul niveau de profondeur est
autorisé !
+
Environnement contraint +
! Pour vos développements, gardez à l'esprit que les appareils
mobiles ont :
! Une puissance processeur plus faible
! Une RAM limitée Construction d’une
! Des capacités de stockage permanent limitées application Android
! De petits écrans avec de faibles résolutions
! Des coûts élevés de transfert de données
! Des taux de transfert plus lents avec une latence élevée
! Des connexions réseaux moins fiables
! Des batteries à autonomie limitées
+ +
Le manifeste AndroidManifest.xml
! Chaque projet contient à sa racine un fichier
AndroidManifest.xml qui :
! Nomme le paquetage Java de l'application. Ce dernier sert
d'identificateur unique de l'application.
! Déclare les composants applicatifs (activities, services,
broadcast receivers, content providers) de l'application et leurs
filtres si nécessaire (à quels intents ils réagissent)
! Déclare les permissions que l'application doit avoir pour
fonctionner (droit de passer des appels, droit d’accéder à
Internet, droit d’accéder au GPS...)
! Déclare le niveau minimum de compatibilité du SDK pour que
l'application fonctionne
! ...
+ +
Notion de contexte Activité
! Le contexte modélise les informations globales sur ! Une activité ≈ un écran graphique
l'environnement de l'application ! Incarne souvent un cas d'utilisation (use case UML)
! Possède les méthodes importantes ! Une application est formée de n activités
! getRessources, getPackageName, getSystemService…
! startActivity, startService, sendBroadcast, getContentResolver... ! Exemple : application de téléphonie
! openFileInput, openOrCreateDatabase, getSharedPreferences... ! Numéroter
! Annuaire des contacts
! Accès au contexte ! Fiche d'un contact
! Depuis une Activity ou un Service ! Ajout d'un contact
! Depuis un BroadcastReceiver
! Depuis un ContentProvider ! Étend android.app.Activity
+ +
Cycle de vie d’une activité Méthodes de cycle de vie
! onCreate()
! Appelé lorsque l'activité est d'abord créé.
! void onCreate(…) ! Implémente tout traitement statique : créer des
vues, lier des données à des listes, etc..
! void onStart() ! fournit également un Bundle contenant l'état
préalablement congelé de cette activité, s'il y
! void onRestart() avait un.
! Toujours suivie par onStart()
! void onResume() ! onRestart()
! Appelé après arrêt d’une activité, et avant
! void onPause() d'être relancée.
! Toujours suivi par onStart()
! void onStop()
! onStart()
! void onDestroy() ! Appelé lorsque l'activité est devenue visible
pour l'utilisateur.
! Suivi par onResume() si l'activité est à l'avant-
plan, ou onStop() si elle est masquée.
+ +
Méthodes de cycle de vie Méthodes de cycle de vie
! onResume()
! onStop()
! Appelé lorsque l'activité commencera à interagir avec
l'utilisateur. ! Appelé lorsque l'activité n'est plus visible pour
l'utilisateur, car une autre activité a été reprise et
! A ce stade, l’activité est au sommet de la pile de l'activité couvrant celle-ci.
! Toujours suivie par onPause(). ! Cela peut se produire soit parce que une nouvelle
activité est en cours de démarrage, reprise ou
! onPause() commencée, et qu’elle recouvre visuellement celle-ci,
! Appelé lorsque le système est sur le point de commencer ou elle est détruite
à reprendre une activité précédente. ! Suivi soit onRestart() si cette activité revient à interagir
! Utilisée pour : avec l'utilisateur, ou onDestroy() si cette activité est
détruite
! valider les modifications non enregistrées dans les
données persistantes,
! OnDestroy()
! arrêter des animations
! Dernière méthode appelée avant que l’activité soit
! arrêter des traitement qui consomment du CPU détruite.
! … ! Cela peut se produire parce qu’on demande d’arrêter
! Son exécution doit être très rapide parce que la prochaine l'activité terminer (on appelle la méthode finish()) ou
activité ne sera pas repris jusqu'à sa terminaison. parce que le système a détruit l’instance de l'activité
pour économiser de l'espace.
! Suivi par onResume() si l'activité retourne à l'avant, ou
onStop() si elle devient invisible pour l'utilisateur. ! Pour distinguer entre ces deux scénarios on utilise la
méthode isFinishing().
+ +
Activité : code source Lancer une activité
! Pour pouvoir être lancée, toute activité doit être
préalablement déclarée dans le manifeste
! Une activité est désignée comme activité initiale de
l'application
! Ceci est indiqué dans le fichier manifeste
! Lancer une activité
! Méthode startActivity(...)
! Lancer une activité en vue d'obtenir un résultat en retour
! Méthode startActivityForResult(...)
+ +
La pile des activités Multitâches
! Les activités sont empilées/ ! Plusieurs piles d’activités peuvent coexister avec Android
dépilées ! L'utilisateur passe de l'une à l'autre
! Empilée quand une activité
démarre
! Dépilée (i.e. détruite) quand
on presse le bouton 'BACK'
! Une pression sur le bouton
'HOME' ne dépile pas
l'activité.
! Elle passe simplement en
arrière plan
+ +
Service Cycle de vie d'un service
! Sert à effectuer des opérations ou des calculs en dehors de ! 5 méthodes de callback
l’interaction utilisateur ! onCreate()
! onStartCommand()
! Ne nécessite pas une interface graphique
! onDestroy()
! Deux types de services : ! onBind()
! Local : service qui s’exécute dans le même processus que votre ! onUnbind()
application
! Distant (IPC) : service qui s’exécute dans des processus
indépendants de votre application (nécessite une description
AIDL)
! Un service est une classe qui étend android.app.Service
+ +
Service : code source Appel d'un service
! Mode Unbounded ! Mode Bounded
! Un composant démarre et ! Des composants (appelés
arrête un traitement en "clients") établissent une
tâche de fond comme il le connexion permanente afin
souhaite d'interagir avec un service
par le biais d'une interface
! Opérations java
! startService(...)
! Opérations
! stopService(...)
! bindService(...)
! unbindService(...)
! + toutes les méthodes de
l'interface java définie
+ +
Intents : principes Natures des intents
! Trois types de composants applicatifs sont activés via des Types Désignations
intentions (intents) 1. Direct 1. Explicite
! Activity, Service et BroadcastReceveir ! Instance de android.content.Intent
! Le composant cible est nommé
! Le composant cible est activé par le
! « Activer tel composant »
composant source
! Principe d'un bus à messages (middleware) 2. Implicite
2. Par procuration
! Le composant cible n'est pas
! Instance de
nommé
android.content.PendingIntent
! « Activer un composant capable
! Le composant cible est activé par de prendre en charge cette action,
un élément tiers, de la part du sur cette donnée »
composant source (toutes ses
! Les filtres d'intention indiquent
permissions lui sont cédées pour
au bus si le message d'activation
l'occasion!)
doit être délivré au composant
+ +
Intents : vue d'ensemble Intents : les extras
! Il est possible d'utiliser l'intent pour convoyer des données
supplémentaires
! Une à une, ou regroupées dans un bundle (android.os.Bundle)
! Stockage sur le principe d'une table de hash
! Méthode putExtra surchargée
! Les types de base (+array) sont gérés
! Les types complexes (c.-à-d. les classes) doivent implémenter
Parcelable ou Serializable
! Récupération
! Méthode propre à chaque type, de la forme getXXXExtra()
! getIntExtra(), getStringExtra()…
+ +
Intent : code source Actions et URI courantes
! Actions natives android
! Constantes de la classe android.content.Intent
! Format d'une URI
! scheme://host:port/path
! schemes usuels : http, mailto, tel, mms, geo, file...
+ +
Filtres d'intention Filtres d'intention
! Chaque composant s'enregistre auprès du bus via ses filtres
d'intention dans le manifeste
! ACTION : Quelles actions sont supportées ?
! DATA : Pour des données de quelle nature (MIME Type) ?
! CATEGORY : Dans quelles circonstances ?
! Permet au bus de savoir si le message d'activation (i.e.
l'intent) doit être délivré au composant ou non
! L'absence de filtres implique une désignation explicite du
composant
+ +
Résolution des intentions Mécanisme de résolution
! Repose sur le mode de désignation choisi
! Principe d'un chargeur de classes
! Explicite : le composant cible est exécuté (i.e. instancié)
! Liaison statique dans le cas d'une désignation explicite
! Implicite : 0, 1 ou plusieurs composants sont éligibles
! la classe à charger et à instancier est connue au moment de la
! Dans le cas spécifiques des activités, comme une seule compilation
d'entre elles peut être exécutée à la fois, l'utilisateur sera ! Liaison dynamique dans le cas d'une désignation implicite
invité à faire un choix ! la classe à charger et à instancier est découverte au moment de
l’exécution
! Mécanisme implémenté par com.android.server.IntentResolver
! Mise en correspondance des intentions (« la demande ») et des filtres
d'intentions disponibles (« l'offre »)
! Calcul de correspondance basé, dans l'ordre, sur
! Les Actions, puis les Catégories, et enfin les Data
+ +
Actions personnalisées Applications et Tâches
! Définir ses propres verbes d'action
! Ainsi, une application peut faire appel à des "morceaux" d'autres
applications
! Réutilisation/partage de composants voulu par Android
! Une succession d’activités pour atteindre un objectif donné est
appelée « Tâche »
! Les activités empilées proviennent de diverses applications
! Déclarer des filtres en conséquence ! Complètement transparent du point de vue de l'utilisateur
! Une application peut posséder plusieurs points d’entrée (pas de
"main" unique donc)
! Il est possible de lancer n'importe quelle partie exposée d'une
application via le manifest, sans en lancer la totalité
+ +
Broadcast receiver Receiver : code source
! Réagit à aux annonces diffusées à l'aide sendBroadcast(...)
! System-defined : la batterie est faible, un SMS vient d'arriver, etc.
! User-defined : solde bancaire négatif, etc.
! Ne nécessite pas une interface graphique
! Un broadcast receiver est une classe qui étend
android.content.BroadcastReceiver
! Un receiver s'abonne/désabonne
! via le fichier manifest : solution statique
! ou via un programme : solution dynamique
! registerReceiver()
! unregisterReceiver()
+ +
Content Provider Résolution de contenu
! Un content provider sert à rendre une partie des données ! Différentes techniques de persistance
d'une application accessibles aux autres applications ! Fichier binaire (sérialisation d'objets)
! Seul moyen pour un partage de données inter-applications ! Fichier XML/JSON
! Base de données embarquée ou distante
! Un content provider est une classe qui étend
! Etc.
android.content.ContentProvider
! Expose les données via une URI dont le schème dédié est ! La façon dont sont réellement stockées les données doit
'content' rester transparente
! Interface commune pour manipuler les données offerte par un
! System-defined : content://sms/inbox/125
content provider
! User-defined : content://fr.univpau.bankster/account/28854165
! Elle s'obtient via un ContentResolver
! ContentResolver cr = getContentResolver();
+ +
Content Resolver : exemples URI et type MIME
! Publier l'URI de votre provider
! Elle sera utilisée pour y accéder via le ContentResolver
public static final URI CONTENT_URI = Uri.parse("content://fr.univpau.bankster/account");
! Deux cas de figure :
! Un seul enregistrement
! URI : content://fr.univpau.bankster/account/[id]
! Type MIME : vnd.android.cursor.item/fr.univpau.bankster
! Plusieurs enregistrements
! URI : content://fr.univpau.bankster/account/
! Type MIME : vnd.android.cursor.dir/fr.univpau.bankster
+
Provider : code source +
Dispositif matériel
+ +
Géolocalisation Evènements de position
! Exploiter le gestionnaire de position ! Interface android.location.LocationListener pour écouter les
! Instance de android.location.LocationManager changements de position
! onLocationChanged() : une nouvelle position est disponible
! Requière le choix d'un fournisseur de position ! onProviderDisabled()/Enabled() : fournisseur désactivé/activé
! Instance de android.location.LocationProvider ! onStatusChanged() : le statut du fournisseur a changé
! Exemple de constantes de la classe LocationManager : ! OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE, AVAILABLE
LocationManager.GPS_PROVIDER,
LocationManager.NETWORK_PROVIDER, ...
! Chaque position est un objet instance de la classe
! Chaque fournisseur offre diverses caractéristiques
android.location.Location
! Consommation d’ énergie
! Modélisé par : latitude, longitude, cap, altitude, vitesse….
! Précision
! Parfois, détails additionnels dans les extras (Bundle)
! Capacité à déterminer l'altitude
+ +
Cartographie Google Maps – Eléments clés
! La géolocalisation est un tremplin naturel vers la ! MapView
cartographie ! Instance de com.google.android.maps.MapView
! Service d’images tuilées pour permettre une visualisation fluide ! Vue composite (ViewGroup) destinée à afficher une carte
et performante
! Géocodage (avant/inverse) : coordonnées adresses ! MapController
! + services ad-hoc : itinéraires, lieux d’intérêts, trafic, street view, ! Instance de com.google.android.maps.MapController
… ! Utilisé pour contrôler la carte, vous permettant de centrer et de
régler le niveau de zoom...
! Choisir une tierce API de cartographie
! Fournie par des entreprises qui se sont spécialisées dans la ! Overlay
cartographie ! Instance de com.google.android.maps.Overlay
! Google, Mappy, IGN (Territoire Français), Nokia Here Maps…
! Permet d'utiliser un canvas pour dessiner autant de couches que
! L'API Google Maps est logiquement favorisée sous Android nécessaires, affichées au dessus de la carte
+ +
Google Maps - Coordonnées Bluetooth : vue d'ensemble
! Chaque coordonnée est un objet instance de la classe
com.google.android.maps.GeoPoint
! Moins riche qu'une instance de android.location.Location
! Latitude et Longitude uniquement
! Exprimées en microdegrés et non plus en degrés (donc x 10 )
! Projection des coordonnées
! Traduire des coordonnées géographiques (latitude, longitude) en
coordonnées écran (x,y)
! com.google.android.maps.GeoPoint android.graphics.Point
! Interface com.google.android.maps.Projection
! Méthodes toPixels() et fromPixels()