mobiles avec Android
1 Inspiré du cours de Olivier Le Goaer
OS mobile : outils de développement
D’après le cours de Olivier Le Goaer
Plateforme de développement
MobileApp vs. WebApp
Android
Startup rachetée par Google en 2005
Open Alliance Handset (OHA)
Regroupement de + de 50 entreprises : fabricants de matériel, opérateurs mobiles, développeurs d’applications, … dont Google.
Objectif : développer des normes ouvertes pour des applications de téléphonie mobile
Matériel supportant Android
Tablette, smartphone, netbook, télévision, embarqué (frigo?)
Android
Points forts
Système linux + java
Projet open source
Système fonctionnel, intuitif et évolutif
SFK complet fourni
Versions d’Android
cupcake donut eclair froyo gingerbread honeycomb Icecream sandwich
Architecture Android
Architecture Android
Linux Kernel
Le noyau linux fournit le pilotes matériels, la gestion de
processus, la mémoire, le réseau et la gestion de l’alimentation
Les bibliothèques
J2SE (subset) : java.io.*, java.lang.*, ...
Android : android.view.*, android.telephony.*, ...
Google : com.google.android.maps.*
Le moteur d’exécution Android
Offre les bases du framework applicatif
Utilise la machine virtuelle java Dalvik
Le framework applicatif
Fournit les classes utiles et des abstractions matérielles
La couche applicative
IHM (interface graphiques) décrites en XML
Modèle de données et controleurs applicatifs écrits en java
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 (Virtual Machine) 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 processus (lourd)
Les applications sont totalement indépendantes ("sandbox")
Espaces protégés (mémoire, disque)
Evite un plantage généralisé !
Le petit univers java
Concepts
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..
Outil de développement
Plugin Eclipse ADT (Android Development Tools)
Assistant à la création de projets
Créateur d'interface graphique (WYSIWYG)
Vues et perspectives dédiées
Outil de développement
Plugin Eclipse ADT (Android Development Tools)
Arborescence des projets
Dossier du projet
Fichiers source (.java) Fichier source R.java
automatiquement généré à partir du répertoire /res Version Android
Ressources organisées (layout, icones, texte,...)
Ressources non organisées (.pdf, .zip, .html,...)
Fichier Manifest.xml
Développement d'une application
Code source
Ecrit en Java et compilé en Dalvik bytecode (.dex)
Packaging
Archive .apk
Signing
Les applications doivent être signées pour être déployées (pas nécessaire en développement)
Exécution
Sur un support mobile (smartphone par ex)
Dans un émulateur
L'émulateur
AVD (Android Virtual Device)
AVD Manager
Lent au démarrage et à l'usage
Emulation (i.e. couche d'indirection) vs. simulation
Noyau Linux + services + composants 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
Développement d'applications
Environnement d'exécution 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éseau moins fiables
Des batteries à autonomie limitée
Applications Android
Applications de premier plan
Utilisable quand elle est visible et mis en pause lorsqu’elle ne l’est pas
Jeux, mashup de cartes géographiques
Applications d’arrière-plan
Interaction limitée en dehors de sa configuration
Filtrage d’appels, réponse automatique aux SMS
Applications intermittente
Interactivé par moment, l’essentiel de sa tâche est en arrière-plan
Lecteur de musique
Widget
Composant visuel interactif que les utilisateurs peuvent ajouter à leur écran d’accueil
Affichage de l’heure, prévisions météo
Cycle de vie d’une application Android
Contrairement aux applications classiques, les
applications Android n’ont pas un contrôle complet sur leur cycle de vie
Les composants doivent être à l’écoute des
changements d’états de l’application pour être près à une fin intempestive
La mémoire et la gestion des processus est prise en
charge exclusivement par le moteur d’exécution
Les ressources
chaınes de caracteres, images, audio, presentation visuelle, . . .
dossier res/
Images
Interfaces graphiques
Valeurs constantes
Principe R.java
Chaque élément défini dans le répertoire /res impacte le fichier R.java (à ne pas toucher)
Génération automatique de classes internes à la classe R, ainsi que des constantes de type entier sur 32bits
Chemin d'accès aux ressources via R.java
user-defined : fr.polytech.tp1.R.color.rose_bonbon
system-defined : android.R.color.darker_gray
Exemple : obj.setColor(R.color.rose_bonbon)
Objet java représentant les ressources
Instance de la classe : android.content.res.Resources
Ressources du projet en cours : context.getResources()
AndroidManifest.xml
Décrit les composants de l’application
Un point d’entrée potentiel dans l’application
Une application peut lancer un composant différent (pas de main)
Quatre types de composants
activités (activities)
services (services)
fournisseurs de contenu (content providers)
récepteurs de diffusion (broadcast receivers)
Décrit les permissions requises par l’application
accès a l’Internet, lecture-écriture dans la liste de contacts, géo-localisation, . . .
Décrit les besoins matériels et logiciels de l’application
appareil photo, bluetooth, ecran multitouch, . . .
AndroidManifest.xml
Fichier XML obligatoire, à la racine du projet
Seuls les éléments <manifest> et <application> sont obligatoires
catégorie LAUNCHER = point d’entrée possible pour exécuter l'application
<manifest>
<application>
<activity android:name=".MyFirstActivity"
android:label="@string/app_name">
<intentfilter>
<action android:name="fr.polytech.resmob.MyFirstActivity"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intentfilter>
</activity>
</application>
</manifest>
http://developer.android.com/guide/topics/manifest/manifest-intro.html
Activité
Une activité = un écran graphique
Incarne souvent un cas d'utilisation (use case UML)
IHM
structurée par une hiérarchie de vues et de contrôles des éléments définis par du code Java
Certains éléments (texte, dimension, couleur) définis dans des fichiers XML (/res)
Une application est formée de n activités
Sous-classe de
android.app.Activity
Activité
7 méthodes de callback:
void onCreate(...)
void onStart()
void onRestart()
void onResume()
void onPause()
void onStop()
void onDestroy()
Activité
action MAIN = un point d’entrée principal (pas d’information particulière à fournir)
catégorie LAUNCHER = point d’entrée possible pour exécuter l'application
package fr.polytech.resmob;
import android.app.Activity;
public class MyFirstActivity extends Activity { @Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
/* Allocation des ressources ici */
}
@Override
protected void onDestroy() { super.onDestroy();
/* Désallocation des ressources ici */
} }
Le bundle mémorise l'état de l'UI
lorsqu'elle passe en arrière-plan
Description des interfaces graphiques
Description
Déclarative (Fichiers XML dans le répertoire /res/layout/)
Ou directement dans le code java
Vues ( View )
Composant élémentaire des interfaces graphiques sous Android
Instance de la classe View
Sensible aux événements
tous les composants graphiques (widgets) d’Android sont des vues : Button, EditText, TextView, Spinner, CheckBox
Regroupement de vues ( ViewGroup )
Le ViewGroup permet de regrouper des vues
Les layouts disponibles sont : LinearLayout, TableLayout, RelativeLayout, FrameLayout, ScrollView, ...
http://developer.android.com/guide/topics/ui/declaring-layout.html
Description des interfaces graphiques
Description
Déclarative (Fichiers XML dans le répertoire /res/layout/)
Ou directement dans le code java
Vues ( View )
Composant élémentaire des interfaces graphiques sous Android
Instance de la classe View
Sensible aux événements
tous les composants graphiques (widgets) d’Android sont des vues : Button, EditText, TextView, Spinner, CheckBox
Regroupement de vues ( ViewGroup )
Le ViewGroup permet de regrouper des vues
Les layouts disponibles sont : LinearLayout, TableLayout, RelativeLayout, FrameLayout, ScrollView, ...
Layout communs
Linear Layout : organisation horizontale avec barre de défilement si nécessaire
Relative Layout : organisation des éléments relativement les uns aux autres (à gauche de, au-dessus de, ...)
Web view : affiche le contenu d'une page web
http://developer.android.com/guide/topics/ui/declaring-layout.html
Description des interfaces graphiques
Orientation
Sens de placement des vues dans un conteneur
android:orientation = vertical | horizontal
Taille
Surface prise par la vue
android:layout_width = ??px | fill_parent | wrap_content
android:layout_height = ??px | fill_parent | wrap_content
Gravité
Alignement d'une vue dans son conteneur
android:layout_gravity = left | center_horizontal | top | bottom | right
Description des interfaces graphiques
action MAIN = un point d’entrée principal (pas d’information particulière à fournir)
catégorie LAUNCHER = point d’entrée possible pour exécuter l'application
<?xml version="1.0" encoding="utf8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/hello"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/coucou"
android:id="@+id/msgText"/>
</LinearLayout>
• identifiant unique
• le signe + dans
@+id signifie qu’il s’agit d’un nouveau nom de ressource, à créér et a ajouter a la classe R
Association des interfaces graphiques
import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;
public class MyFirstActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView message = (TextView) findViewById(R.id.msgText);
message.setText("Hello, World!");
} }
Associe une hiérarchie de
vues ` a une activité
Renvoie la vue à partir de son identifiant généré dans R.java
Gestion des événements
Dans le fichier main.xml de /res/layout on peut associer une méthode à un événement via les attributs événementiels
<Button ... android:onClick="sayHello" .../>
public class MyFirstActivity extends Activity { private TextView helloLabel;
@Override
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);
setContentView(R.layout.main);
helloLabel = (TextView) findViewById(R.id.hello_label);
}
public void sayHello(View v) {
helloLabel.setText(R.string.hello);
} }