Apprendre à créer une application Android en ligne
Introduction à Android
Jean-Marc Lecarpentier Université de Caen
Avertissement
Je ne suis pas un développeur Android.
Écosystème Android
• Android 86.8% - iOS 12.5% - Windows0.3%?
(stats Q3-2016)
• Plate-forme Google Play
• Fin 2016 : 2,6 million apps
• 2,4M apps gratuites
• 12% apps de qualité insuffisante
• Diffusion simple
• Partage 70/30 (ou 85/15 avec abonnement)
Sources :
Coûts de développement
Android
• Environnement de développement
• Basé sur noyau Linux
• Applications en Java
• Architecture spécifique
• Java VM adaptée aux terminaux mobiles
• 2008 : Android 1
• 2013 : Android 4.4 KitKat
• 2014 : Android 5 Lollipop
• 2015 : Android 6 Marshmallow
• 2016 : Android 7 Nougat
Apps
• App = Android Application Package
• Archive zip composé de fichiers JAR et autres
• Extension .apk
• 1 App = 1 Linux user id
• 1 App = 1 process = 1 virtual machine
Développer pour Android
• SDK Android
• IDE Android Studio
• Prêt à l’emploi avec le SDK Android
• Basé sur IntelliJ
• Gestion des émulateur
(Android Virtual Device ou AVD)
• Pré-requis : ?
- programmation OO?
- Java?
- XML
Au programme
• Comment créer une App pour démarrer
• Voir les concepts généraux
• Composants Android : Activity, Intent, View, etc
• Structure d’une App : fichiers XML, programmes Java, code auto-généré, ressources, etc
Créer une App
• Utiliser l’assistant de Android Studio
• Choisir un namespace Java (à partir de l’URL de votre «entreprise»)
• Choisir la version minimale de SDK (compatibilité antérieure) ?
? Attention il faudra installer les composants SDK
• Choisir les noms de l’activité et du layout utilisés au lancement de l’application
Structure
Tester son App
• Connecter un appareil Android : multiplicité des terminaux
• Utiliser un AVD : tester sur de multiples configurations
• Android Studio inclue gestionnaire de AVD et de Android SDK
Composants de base
• Manifest : déclaration des caractéristiques de l’App
• Activity : un écran de l’App. Programme Java spécifiant les comportements de l’écran
• res/layout : définition du layout d’une Activity
• Intent = message asynchrone pour activer des composants (par ex. Activity)
Android Manifest
• Fichier obligatoire qui décrit les caractéristiques de l’App :
• requirements : par ex. camera indispensable
• que faire au démarrage
• permissions
• icônes
• etc.
• Android 6 permet de gérer les permissions plus finement
Layout
• Fichier XML déclaratif
• Gérer la diversité des appareils
• Éditeur Wysiwyg et code XML généré par le SDK
• Par programme
• Dynamique, créé à l’exécution
• Ne pas utiliser pour les éléments fixes
Capter un évènement
• Définir dans le Layout
• attribut onClick dans la déclaration XML
•
android:onClick=“afficher” />
• Méthode correspondante afficher dans l’activité
• Signature : public void afficher(View view) { … }
Capter un évènement
• Par programme : mettre un capteur d’évènement lors de la création de l’activité (méthode onCreate)
• Utilisation de callback
Button btnGo = (Button) findViewById(); ?btnGo.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// ce qu’on fait lorsque le clic est capté }
}
});
Callback onClick
• Méthode déclarative ou par programme
• Méthode publique et valeur de retour void
public void onClick(View v) public void afficher(View v)
• objet View en argument : l’élément graphique qui a capté l’évènement
Accéder aux éléments
• Méthode findViewById() de Activity
• Identifiants générés par le SDK et gérés par la classe R.java
• Exemples :?
TextView txtSaisie=(TextView) findViewById(R.id.saisie);?
Button btnGo=(Button) findViewById();?setContentView(R.layout.activity_main);
Activity
• Activity = écran visible à l’utilisateur
• Une seule Activity “active” à la fois
• Gestion de l’état d’une activité
• Gestion de la pile des Activity
Activity
• Définit un écran de l’App : layout, évènements, comportement
• Fonctionnement à base de callbacks : onCreate(), onPause(), etc
• Lancement d’une App ? onCreate() de l’activité déclarée comme “launcher” ou “main” dans le Manifest
onCreate()
• Exécuter les actions nécessaires au lancement de l’App
? créer les variables de classe
? déclarer l’interface (Layout XML) à utiliser?
(méthode setContentView)
? plus d’instructions / initialisations si besoin
Pile
États
• Resumed (ou running) : focus utilisateur
• Paused : partiellement visible mais pas en haut de la pile car caché par une autre Activity
• Stopped : passée an arrière-plan, inactive mais toujours existante en mémoire
Cycle de vie et callbacks
Enregistrer un état
Activity A à B
1. Activity A : onPause()
2. Activity B : onCreate(), onStart(), onResume()
3. Activity A : onStop()?
Attention à gérer les actions dans onPause() !
Activity et Manifest
• Activity déclarée dans le Manifest
• Associée à un nom?
Intent
• Objet servant à démarrer Activity, Service, etc
• Associé à des données
• Intent prédéfinies dans Android
• Intent définies dans l’application
• Intent implicite/explicite
Propriétés de Intent
• action : action à exécuter (ACTION_VIEW, etc)
• data : données pour réaliser l’action, par ex. un n° de tél. pour ACTION_CALL. Sous la forme d’un Data URI : ex. tel:
0231456543 ou pour voir un contact content://contacts/people/1
• category : informations complémentaires
• type : spécifie un type MIME (géré par l’objet Intent)
• component : spécifier le composant à invoquer (Intent explicite)
• extras : ensemble d’informations complémentaires
Activer des Intent prédéfinies
• Méthode startActivity : pour lancer une autre Activity
• Prend un objet Intent en argument
// visualiser un site web Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("")); startActivity(intent);
// lancer la numérotation téléphone
Intent intent = new Intent(Intent.ACTION_DIAL); startActivity(intent);
// lancer un appel téléphonique à un n° donné
Intent intent = new Intent(Intent.ACTION_CALL); intent.setData(Uri.parse("tel:555–555–5555"));
startActivity(intent);
Intent implicite
Intent implicite
• Android va regarder quelles activités peuvent répondre à l’action demandée
• Si plusieurs possibilités, demander à l’utilisateur
• Noms d’actions génériques : ACTION_SEND, etc
• Utiliser pour lancer des actions gérées en dehors de l’application elle-même
Intent-filters
• Définis pour les objets Activity dans le Manifest
• action : définit les actions auxquelles l’Activity peut répondre?
ACTION_MAIN précise que c’est le point d’entrée de l’application
• category : type de catégorie de l’Intent qui invoque
( CATEGORY_DEFAULT par défaut, CATEGORY_LAUNCHER pour
un lanceur d’application, etc)
• data : type de données acceptées
Vérifier Intent
• Créer une Intent implicite
Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
webpage = Uri.parse(""); Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
• Question : existe-t-il une Activity pour répondre ??
PackageManager packageManager = getPackageManager();
List activities = packageManager.queryIntentActivities(intent, 0);
boolean isIntentSafe = () > 0;
Résolution des Intent
• Comment décider de l’Activity à démarrer pour une Intent implicite
• 3 critères : action, données, catégorie
• Détails
Intent explicite
• Intent demande une action spécifique d’un package donné
• Utiliser le actionName de l’Activity à lancer (défini dans le Manifest)pour lancer une Activity externe à l’app?
String actionName= ".intent.action.ShowBasicView";
Intent intent = new Intent(actionName);
startActivity(intent);
Intent explicite
• Pour lier 2 activités d’une même app
Intent intent = new Intent(this, OtherActivity.class);
• Arguments :?
- objet Context (ici l’objet Activity courant)?
- la classe à utiliser (ici le nom de l’activité)
• Méthode startActivity
Intent intent = new Intent(this, OtherActivity.class);
startActivity(intent);
Transmettre des données
• Comment passer des informations d’une activité à une autre ?
• Intent peut contenir des extras
• extras : ensemble de paire (nom, valeur)
• Ajouter une paire aux extras : méthode putExtra()
Transmettre des données
• Clé : Constante publique de l’activité en cours
• Bonne pratique : préfixer par le namespace de l’App
public final static String MON_MESSAGE = “fr.greyc.users.lecarpentier.applicationdetest.MON_MESSAGE";
• Valeur : gérée par le programme
Intent intent = new Intent(this, OtherActivity.class);
String message = "Un message de test"; intent.putExtra(MON_MESSAGE, message);
startActivity(intent);
Recevoir les données
• Géré dans onCreate() de l’Activity démarrée
• Récupérer l’objet Intent qui a déclenché l’activité
Intent intent = getIntent();
• Récupérer le contenu des extras pour la clé donnée
String message = intent.getStringExtra(MainActivity.MON_MESSAGE);
Resources
• Tout ce qui n’est pas du code
• Séparer présentation (layout) et exécution (java)
• Proposer des alternatives de layout en fonction de : ? - type ou taille du terminal?
- langue d’interface?
- etc
• Fichiers déclaratifs XML dans dossier res/
Ressources et classe R
• R.java : classe générée par l’IDE pour référencer toutes les ressources
• R.layout.filename pour les fichiers XML de layout
• R.string.stringId pour les chaines de caractères
• R.menu.filename pour les menus
• Etc.
Resources et textes
• Ne JAMAIS mettre un texte en « dur » dans les fichiers XML
• TOUJOURS utiliser une référence vers une resource
• Fichier : contient les textes à utiliser, avec un nom (attribut name)
• À éditer avec le SDK pour mettre à jour les références
En bref
• Android c’est quoi ?
• Ma première App : Hello Android!
• Créer un Layout
• Afficher des informations
• Lancer une autre activité et les objets Intent
• Transmettre un message à une activité
• Ressources XML et R.java
Ressources
• : tout y est (ou presque)
• : tutoriels progressifs pour apprendre
• : introduction & download
• : plein de cours Android