Android Programmation Mobile PDF

Summary

This document is a presentation on Android programming. It covers various aspects, including the history, architecture, tools, and important concepts. It doesn't appear to be a past paper, textbook, or novel.

Full Transcript

+ Android [email protected] Source : Cours Olivier Le Goaer + Historique + Open Handset Alliance (OHA) ! Regroupement de + de 50 entreprises ! Fabricants de matériels ! Opérateurs mobile ! Développeurs d'applications !......

+ Android [email protected] Source : Cours Olivier Le Goaer + Historique + Open Handset Alliance (OHA) ! 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 + La mascotte : "Bugdroid" + Matériels Android + Points forts d'Android + Versions d'Android + Android en images Jelly Bean 4.1 + Marché d'applications ! 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/ ! … + Architecture logicielle + 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 ! Androidgère ses ressources de manière agressive ! Pour garantir une haute réactivité ! Élimination de processus sans avertissement ! ! Politique de priorité basée sur une hiérarchisation des processus + Java pour Android ! Concepts de la POO Java ! Paquetage, classe, annotation, héritage, interface... ! Idiomes ! Classes anonymes, classes internes, POJO... ! Bibliothèques (API) ! J2SE (subset) : java.io.*, java.lang.*... ! Android : android.view.*, android.telephony.*… ! Google : com.google.android.maps.*... ! Design patterns ! Singleton, Builder, Observer (Listener), DAO... + Outils du développeur ! 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) !... + Plugin ADT Eclipse + 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 ! 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é ! + Compilation et déploiement + Environnement contraint ! Pour vos développements, gardez à l'esprit que les appareils mobiles ont : ! Une puissance processeur plus faible ! Une RAM limitée ! Des capacités de stockage permanent limitées ! 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 + Construction d’une application Android + Le manifeste ! 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 !... + AndroidManifest.xml + Notion de contexte ! Le contexte modélise les informations globales sur l'environnement de l'application ! Possède les méthodes importantes ! getRessources, getPackageName, getSystemService… ! startActivity, startService, sendBroadcast, getContentResolver... ! openFileInput, openOrCreateDatabase, getSharedPreferences... ! Accès au contexte ! Depuis une Activity ou un Service ! Depuis un BroadcastReceiver ! Depuis un ContentProvider + Activité ! Une activité ≈ un écran graphique ! Incarne souvent un cas d'utilisation (use case UML) ! Une application est formée de n activités ! Exemple : application de téléphonie ! Numéroter ! Annuaire des contacts ! Fiche d'un contact ! Ajout d'un contact ! Étend android.app.Activity + Cycle de vie d’une activité ! void onCreate(…) ! void onStart() ! void onRestart() ! void onResume() ! void onPause() ! void onStop() ! void onDestroy() + Méthodes de cycle de vie ! onCreate() ! Appelé lorsque l'activité est d'abord créé. ! Implémente tout traitement statique : créer des vues, lier des données à des listes, etc.. ! fournit également un Bundle contenant l'état préalablement congelé de cette activité, s'il y avait un. ! Toujours suivie par onStart() ! onRestart() ! Appelé après arrêt d’une activité, et avant d'être relancée. ! Toujours suivi par onStart() ! onStart() ! 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 ! onResume() ! Appelé lorsque l'activité commencera à interagir avec l'utilisateur. ! A ce stade, l’activité est au sommet de la pile de l'activité ! Toujours suivie par onPause(). ! onPause() ! Appelé lorsque le système est sur le point de commencer à reprendre une activité précédente. ! Utilisée pour : ! valider les modifications non enregistrées dans les données persistantes, ! arrêter des animations ! arrêter des traitement qui consomment du CPU ! … ! Son exécution doit être très rapide parce que la prochaine activité ne sera pas repris jusqu'à sa terminaison. ! Suivi par onResume() si l'activité retourne à l'avant, ou onStop() si elle devient invisible pour l'utilisateur. + Méthodes de cycle de vie ! onStop() ! Appelé lorsque l'activité n'est plus visible pour l'utilisateur, car une autre activité a été reprise et couvrant celle-ci. ! Cela peut se produire soit parce que une nouvelle activité est en cours de démarrage, reprise ou commencée, et qu’elle recouvre visuellement celle-ci, ou elle est détruite ! Suivi soit onRestart() si cette activité revient à interagir avec l'utilisateur, ou onDestroy() si cette activité est détruite ! OnDestroy() ! Dernière méthode appelée avant que l’activité soit détruite. ! Cela peut se produire parce qu’on demande d’arrêter l'activité terminer (on appelle la méthode finish()) ou parce que le système a détruit l’instance de l'activité pour économiser de l'espace. ! 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 ! Les activités sont empilées/ dépilées ! 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 + Multitâches ! Plusieurs piles d’activités peuvent coexister avec Android ! L'utilisateur passe de l'une à l'autre + Service ! Sert à effectuer des opérations ou des calculs en dehors de l’interaction utilisateur ! Ne nécessite pas une interface graphique ! Deux types de services : ! Local : service qui s’exécute dans le même processus que votre 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 + Cycle de vie d'un service ! 5 méthodes de callback ! onCreate() ! onStartCommand() ! onDestroy() ! onBind() ! onUnbind() + 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 ! Trois types de composants applicatifs sont activés via des intentions (intents) ! Activity, Service et BroadcastReceveir ! Principe d'un bus à messages (middleware) + Natures des intents Types Désignations 1. Direct 1. Explicite ! Instance de android.content.Intent ! Le composant cible est nommé ! Le composant cible est activé par le ! « Activer tel composant » composant source 2. Par procuration 2. Implicite ! 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 ! 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 + Filtres d'intention + Résolution des intentions ! Repose sur le mode de désignation choisi ! Explicite : le composant cible est exécuté (i.e. instancié) ! Implicite : 0, 1 ou plusieurs composants sont éligibles ! Dans le cas spécifiques des activités, comme une seule d'entre elles peut être exécutée à la fois, l'utilisateur sera invité à faire un choix + Mécanisme de résolution ! Principe d'un chargeur de classes ! Liaison statique dans le cas d'une désignation explicite ! la classe à charger et à instancier est connue au moment de la compilation ! Liaison dynamique dans le cas d'une désignation implicite ! 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 ! Définir ses propres verbes d'action ! Déclarer des filtres en conséquence + Applications et Tâches ! 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 ! 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 ! 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() + Receiver : code source + Content Provider ! Un content provider sert à rendre une partie des données d'une application accessibles aux autres applications ! Seul moyen pour un partage de données inter-applications ! Un content provider est une classe qui étend android.content.ContentProvider ! Expose les données via une URI dont le schème dédié est 'content' ! System-defined : content://sms/inbox/125 ! User-defined : content://fr.univpau.bankster/account/28854165 + Résolution de contenu ! Différentes techniques de persistance ! Fichier binaire (sérialisation d'objets) ! Fichier XML/JSON ! Base de données embarquée ou distante ! Etc. ! La façon dont sont réellement stockées les données doit rester transparente ! Interface commune pour manipuler les données offerte par un content provider ! 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 ! Exploiter le gestionnaire de position ! Instance de android.location.LocationManager ! Requière le choix d'un fournisseur de position ! Instance de android.location.LocationProvider ! Exemple de constantes de la classe LocationManager : LocationManager.GPS_PROVIDER, LocationManager.NETWORK_PROVIDER,... ! Chaque fournisseur offre diverses caractéristiques ! Consommation d’ énergie ! Précision ! Capacité à déterminer l'altitude + Evènements de position ! Interface android.location.LocationListener pour écouter les changements de position ! onLocationChanged() : une nouvelle position est disponible ! onProviderDisabled()/Enabled() : fournisseur désactivé/activé ! onStatusChanged() : le statut du fournisseur a changé ! OUT_OF_SERVICE, TEMPORARILY_UNAVAILABLE, AVAILABLE ! Chaque position est un objet instance de la classe android.location.Location ! Modélisé par : latitude, longitude, cap, altitude, vitesse…. ! Parfois, détails additionnels dans les extras (Bundle) + Cartographie ! La géolocalisation est un tremplin naturel vers la cartographie ! Service d’images tuilées pour permettre une visualisation fluide et performante ! Géocodage (avant/inverse) : coordonnées adresses ! + services ad-hoc : itinéraires, lieux d’intérêts, trafic, street view, … ! Choisir une tierce API de cartographie ! Fournie par des entreprises qui se sont spécialisées dans la cartographie ! Google, Mappy, IGN (Territoire Français), Nokia Here Maps… ! L'API Google Maps est logiquement favorisée sous Android + Google Maps – Eléments clés ! MapView ! Instance de com.google.android.maps.MapView ! Vue composite (ViewGroup) destinée à afficher une carte ! MapController ! 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... ! Overlay ! Instance de com.google.android.maps.Overlay ! Permet d'utiliser un canvas pour dessiner autant de couches que nécessaires, affichées au dessus de la carte + Google Maps - Coordonnées ! 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() + Bluetooth : vue d'ensemble

Use Quizgecko on...
Browser
Browser