0% ont trouvé ce document utile (0 vote)
30 vues17 pages

Guide Complet sur Android: Historique, Architecture et Développement

Ce document décrit l'historique et les fonctionnalités d'Android. Il présente les acteurs à l'origine d'Android, les versions, l'architecture logicielle avec la machine virtuelle Dalvik, les outils de développement et les concepts clés comme le manifeste et les activités.

Transféré par

firastech2
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
30 vues17 pages

Guide Complet sur Android: Historique, Architecture et Développement

Ce document décrit l'historique et les fonctionnalités d'Android. Il présente les acteurs à l'origine d'Android, les versions, l'architecture logicielle avec la machine virtuelle Dalvik, les outils de développement et les concepts clés comme le manifeste et les activités.

Transféré par

firastech2
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

+ +

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()

Vous aimerez peut-être aussi