e édition programmation en java sous android studio … · 39 € isbn : 978-2-409-01043-9...

15
Sylvain HÉBUTERNE Développez une application Android Programmation en Java sous Android Studio 2 e édition

Upload: ngothuan

Post on 13-Sep-2018

233 views

Category:

Documents


1 download

TRANSCRIPT

ISB

N :

978-

2-40

9-01

043-

9

39 €

Développez une application AndroidProgrammation en Java sous Android Studio

Sylvain HÉBUTERNE est Architecte Android. Spécialisé dans la program-mation objet depuis 15 ans, il conçoit des applications Android à titre per-sonnel ou pour le compte d’agences de communication, de sociétés d’in-génierie informatique et de start-up. Ces projets très diversifiés lui per-mettent d’exploiter tout le potentiel de la plateforme Android jusqu’aux fonctionnalités plus avancées propo-sées dans les dernières versions.

Ce livre s’adresse aux développeurs souhaitant maîtriser le développe-ment d’applications Android. Il couvre toutes les phases du développe-ment d’applications pour smartphones et tablettes Android et nécessite uniquement des connaissances basiques en programmation objet et sur le langage Java.

Prenant en exemple le développement d’une application de gestion de DVD, les différents chapitres de ce livre permettent au lecteur de découvrir progressivement les notions indispensables à la construction d’une appli-cation de qualité professionnelle. Chaque notion présentée est ainsi ex-pliquée, illustrée par des exemples de code et remise dans son contexte. De l’installation de l’environnement de développement Android Studio à la publication de l’application finale sur le Play Store de Google, le lecteur est invité à utiliser les composants les plus répandus de la plateforme : composants texte, boutons, activités et fragments, mais également listes, boîtes de dialogue, panneaux de navigation, barre d’actions, etc.

Couvrant toutes les versions d’Android jusqu’à Oreo, le livre présente les différentes méthodes qui permettent de rendre l’application compatible avec tous les terminaux Android et décrit comment mettre en œuvre le mo-dèle Master/Detail pour offrir une expérience utilisateur optimale sur tout type d’écran, du plus petit smartphone aux tablettes les plus récentes.

Les tâches asynchrones (AsyncTask), véritables pierres angulaires du développement Android, sont présentées en détail et utilisées tout au long de l’ouvrage pour la gestion des bases de données SQLite, le dévelop-pement de services, l’interrogation de services web via la bibliothèque dédiée Volley et l’interprétation du format JSON.

Le lecteur apprendra également à tirer profit des puissants outils que sont les filtres d’intentions, les BroadcastReceiver et les intentions impli-cites, et acquerra toutes les connaissances nécessaires à l’envoi et la réception de SMS, la manipulation de l’appareil photo, des capteurs et l’utilisation de la géolocalisation, sans oublier la gestion du Bluetooth et les interactions avec les appareils Bluetooth Low Energy. Les styles, les images redimensionnables, les visuels définis en XML ou les animations de transition permettront au développeur de soigner l’aspect visuel de ses applications. Le lecteur sera également guidé pour migrer son applica-tion sur la dernière version d’Android.

En accompagnement du livre, le code du projet est téléchargeable pour chaque chapitre, sur le site www.editions-eni.fr, permettant au lecteur d’explorer plus en avant les notions présentées.

Téléchargementwww.editions-eni.fr.fr

Sur www.editions-eni.fr :b Le code source du projet complet.

Avant-propos  •  Environnement  de développement  •  Principes  de  base d’Android  •  Préparation  du  projet LocDVD  •  Consultation  et  saisie  de données • Persistance des données • Contrôles  avancés  •  Fragments  • Navigation  et  boîtes  de  dialogue  • Tâches  asynchrones  et  services  • Réseau  et  Internet  •  Exploiter  le téléphone  •  Sortir  de  l’application  •  Design  avancé  •  Images,  son  et vidéo  • Utilisation du Bluetooth  Low Energy • Android 8 Oreo • Publier une application

Les chapitres du livre

Dév

elop

pez

une

appl

icat

ion

And

roid

(J

ava

et A

ndro

id S

tudi

o)

Pour plus d’informations :

Sylvain HÉBUTERNE

Développez une application

Android Programmation en Java sous Android Studio

2e édition

Nouvelle édition

1Table des matières

Avant-propos

Chapitre 1

Environnement de développement

1. Architecture d’Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.1 Présentation d’Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91.2 Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121.3 Play Store . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

2. Android Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.1 Installation sous Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142.2 Installation sous Max OS X. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182.3 Installation sous Linux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

3. Compléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18

Chapitre 2

Principes de base d’Android

1. Concepts de base d’une application Android . . . . . . . . . . . . . . . . . . . 311.1 Contexte d’exécution/Sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . 311.2 Package . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.3 Fichier AndroidManifest.xml. . . . . . . . . . . . . . . . . . . . . . . . . . . . 321.4 Les activités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

2. Un premier projet : Hello World . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333. Préparer un terminal virtuel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444. Configurer un terminal physique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52

Les éléments à télécharger sont disponibles à l'adresse suivante : http://www.editions-eni.fr 

Saisissez la référence ENI de l'ouvrage EI2ASAND dans la zone de recherche et validez. Cliquez sur le titre du livre puis sur le bouton de téléchargement.

lcroise
Tampon

2Programmation en Java sous Android Studio

Développez une application Android

5. Débogage, trace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535.1 Messages Toast. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565.2 Logcat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575.3 Autres outils . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58

Chapitre 3

Préparation du projet LocDVD

1. Gérer la fragmentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611.1 Densité d’écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611.2 Les ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 621.3 Density-independent pixel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64

2. Jongler avec plusieurs versions d’API . . . . . . . . . . . . . . . . . . . . . . . . . 663. Bibliothèques de support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 674. Internationalisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685. Généralisation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696. Notion de saveur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717. Préparation du projet LocDVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

Chapitre 4

Consultation et saisie de données

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732. Les activités – cycle de vie d’un écran . . . . . . . . . . . . . . . . . . . . . . . . . 74

2.1 Création d’une nouvelle activité . . . . . . . . . . . . . . . . . . . . . . . . . 742.2 Cycle de vie d’une activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 752.3 Initialisation de l’activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77

3. Construction d’un écran de consultation des données . . . . . . . . . . . 783.1 Création de l’interface . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79

3.1.1 Code source. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 813.1.2 Les propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 833.1.3 Propriétés spécifiques pour les composants

LinearLayout et TextView. . . . . . . . . . . . . . . . . . . . . . . . . 843.1.4 Définir un identifiant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

3Table des matières

3.1.5 Construction de l’interface . . . . . . . . . . . . . . . . . . . . . . . . 863.2 Liaison du fichier de layout avec le code de l’activité. . . . . . . . . 883.3 Inscription dans le Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

4. Saisie des données, contrôles principaux. . . . . . . . . . . . . . . . . . . . . . . 964.1 Création du squelette de l’écran . . . . . . . . . . . . . . . . . . . . . . . . . 974.2 Gestion des boutons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

4.2.1 Réagir au clic . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1034.2.2 Ajouter un composant . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

4.3 Test de l’écran de saisie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1075. Mettre en forme un écran, gérer l’affichage adaptatif . . . . . . . . . . . 109

5.1 Faire défiler l’écran . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1095.2 Contrôler la saisie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1125.3 Gérer la rotation de l’écran. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

5.3.1 Sauvegarder les données. . . . . . . . . . . . . . . . . . . . . . . . . . 1155.3.2 Restaurer les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116

Chapitre 5

Persistance des données

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1212. Création et modification d’une base de données . . . . . . . . . . . . . . . 121

2.1 Création de la base de données . . . . . . . . . . . . . . . . . . . . . . . . . 1222.2 Modification de la base de données. . . . . . . . . . . . . . . . . . . . . . 126

3. Manipulation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273.1 Création de la classe DVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1273.2 Requêtes de sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1303.3 Requête d’enregistrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1333.4 Requête de suppression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1363.5 Transaction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136

4. Sauvegarde des préférences utilisateurs . . . . . . . . . . . . . . . . . . . . . . 1375. Lire et écrire dans un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139

5.1 Intégrer un fichier de données . . . . . . . . . . . . . . . . . . . . . . . . . . 1395.2 Lire les données et les enregistrer. . . . . . . . . . . . . . . . . . . . . . . . 1405.3 Mémoriser la lecture du fichier . . . . . . . . . . . . . . . . . . . . . . . . . 143

4Programmation en Java sous Android Studio

Développez une application Android

Chapitre 6

Contrôles avancés

1. Les listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1451.1 Intégrer une liste. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

1.1.1 Intégrer un composant ListView. . . . . . . . . . . . . . . . . . . 1461.1.2 Déclaration d’un layout pour les éléments de la liste . . 1481.1.3 Implémenter un adaptateur. . . . . . . . . . . . . . . . . . . . . . . 149

1.2 Relier le composant ListView à l’adaptateur . . . . . . . . . . . . . . 1531.3 Gérer le clic sur un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1591.4 Afficher le DVD sélectionné . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

2. GridView, liste déroulante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1692.1 Composant GridView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1692.2 Liste déroulante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

3. TimePicker/DatePicker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1703.1 Ajout d’un champ date de visionnage. . . . . . . . . . . . . . . . . . . . 1713.2 Saisie de la date de visionnage . . . . . . . . . . . . . . . . . . . . . . . . . . 172

4. Créer son propre composant réutilisable . . . . . . . . . . . . . . . . . . . . . 1774.1 Surcharger un composant de la plateforme . . . . . . . . . . . . . . . 1774.2 Définir des attributs personnalisés . . . . . . . . . . . . . . . . . . . . . . 1784.3 Intégrer le composant dans un layout . . . . . . . . . . . . . . . . . . . 180

Chapitre 7

Les fragments

1. Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1831.1 Fragment et activité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1831.2 Cycle de vie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1841.3 Compatibilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185

2. Travailler avec les fragments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1862.1 Création du fragment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1862.2 Modification de l’activité hôte . . . . . . . . . . . . . . . . . . . . . . . . . 191

3. Mise en œuvre du modèle Master/Detail . . . . . . . . . . . . . . . . . . . . . 1963.1 Mise en place du layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1983.2 Modification de la vue détaillée. . . . . . . . . . . . . . . . . . . . . . . . . 202

5Table des matières

3.3 Gestion des fragments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

Chapitre 8

Navigation et boîtes de dialogue

1. Les menus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2151.1 Définition du menu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2151.2 Prise en compte par l’activité . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

2. Le navigation drawer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2232.1 Modification du layout . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2232.2 Prise en charge par l’activité. . . . . . . . . . . . . . . . . . . . . . . . . . . . 2262.3 Manipuler le panneau de navigation . . . . . . . . . . . . . . . . . . . . . 231

3. Afficher une boîte de dialogue standard . . . . . . . . . . . . . . . . . . . . . . 2334. Créer des boîtes de dialogue personnalisées . . . . . . . . . . . . . . . . . . . 238

Chapitre 9

Tâches asynchrones et services

1. Exécuter des actions en tâche de fond. . . . . . . . . . . . . . . . . . . . . . . . 2432. Développer un service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2563. Communiquer avec un service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2594. Utiliser les récepteurs d’évènement. . . . . . . . . . . . . . . . . . . . . . . . . . 263

4.1 Définir un récepteur d’évènement. . . . . . . . . . . . . . . . . . . . . . . 2634.2 Intention et filtre d’intention . . . . . . . . . . . . . . . . . . . . . . . . . . 2644.3 Inscrire le récepteur d’évènement . . . . . . . . . . . . . . . . . . . . . . . 265

Chapitre 10

Réseau et Internet

1. Présentation de Volley . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2671.1 L’application LocDVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2681.2 Intégrer la bibliothèque Volley . . . . . . . . . . . . . . . . . . . . . . . . . 268

6Programmation en Java sous Android Studio

Développez une application Android

2. Interroger un service web. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2732.1 Préparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2732.2 Demander les permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276

2.2.1 Avant Marshmallow . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2772.2.2 À partir de Marshmallow. . . . . . . . . . . . . . . . . . . . . . . . . 278

2.3 Interrogation du service web . . . . . . . . . . . . . . . . . . . . . . . . . . . 2783. Travailler avec le format JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286

3.1 Interprétation du format JSON. . . . . . . . . . . . . . . . . . . . . . . . . 2863.2 Création de la liste . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2883.3 Vue détaillée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2973.4 Optimisations possibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313

4. Intégrer un navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314

Chapitre 11

Exploiter le téléphone

1. Envoyer/recevoir des SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3171.1 Envoyer un SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317

1.1.1 Gestion des permissions. . . . . . . . . . . . . . . . . . . . . . . . . . 3191.1.2 Envoyer un SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323

1.2 Recevoir un SMS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3272. Utiliser les capteurs de l’appareil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3323. Géolocaliser l’utilisateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336

3.1 LocationManager . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3373.2 Location. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340

Chapitre 12

Sortir de l’application

1. Développer un widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3432. Investir la barre de notification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3563. Partager, utiliser les réseaux sociaux . . . . . . . . . . . . . . . . . . . . . . . . . 361

7Table des matières

Chapitre 13

Design avancé

1. Mettre en place un thème, utiliser les styles . . . . . . . . . . . . . . . . . . 3672. Créer des images redimensionnables . . . . . . . . . . . . . . . . . . . . . . . . . 3733. Dessiner en XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3774. Animer les transitions d’écrans . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381

Chapitre 14

Images, son et vidéo

1. Prendre une photo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3871.1 Préparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3871.2 Implémenter la prise de vue. . . . . . . . . . . . . . . . . . . . . . . . . . . . 3961.3 Sauvegarder le résultat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 398

2. Jouer un son . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4062.1 Lire un fichier son local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4062.2 Lire un flux sonore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407

3. Jouer une vidéo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 410

Chapitre 15

Utilisation du Bluetooth Low Energy

1. Présentation du Bluetooth Low Energy . . . . . . . . . . . . . . . . . . . . . . 4152. Détecter un périphérique BLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 416

2.1 Préparation du projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4162.2 Gestion des permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4182.3 Initialisation de BluetoothManager . . . . . . . . . . . . . . . . . . . . . 4212.4 Recherche d’objets Bluetooth Low Energy . . . . . . . . . . . . . . . . 423

2.4.1 Lancer le scan avant Android 21 (Lollipop) . . . . . . . . . . 4232.4.2 Lancer le scan à partir d’Android 21 . . . . . . . . . . . . . . . . 424

2.5 Arrêter l’analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4252.6 Exploiter le résultat du scan. . . . . . . . . . . . . . . . . . . . . . . . . . . . 426

3. Connecter un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4334. Lire une caractéristique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437

8Programmation en Java sous Android Studio

Développez une application Android

5. Écrire une caractéristique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450

Chapitre 16

Android 8 Oreo

1. Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4532. Intégrer une nouvelle version d’Android. . . . . . . . . . . . . . . . . . . . . . 4533. Migrer l’application LocDVD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457

3.1 Détecter les modifications à apporter . . . . . . . . . . . . . . . . . . . . 4573.2 Les notifications sous Android 8 . . . . . . . . . . . . . . . . . . . . . . . . 460

4. Quelques nouveautés d’Android 8 . . . . . . . . . . . . . . . . . . . . . . . . . . 4684.1 Les fonts en XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4684.2 L’autocomplétion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4704.3 Autres modifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 471

Chapitre 17

Publier une application

1. Ouvrir un compte développeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4732. Préparer la fiche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4773. Publier un APK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4804. Produire plusieurs versions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4845. ... Et ensuite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4886. Pour aller plus loin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 489

Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491

243

Chapitre 9

Tâches asynchroneset services

Tâches asynchrones et services1. Exécuter des actions en tâche de fond

Pour toute application, le confort et l’expérience utilisateur sont des pointsessentiels : une application doit, sur smartphone et tablette, réagir immédia-tement à chaque sollicitation de l’utilisateur. Pour garantir une réponse opti-male, la plateforme Android introduit une règle : toute application qui neréagit pas à une demande utilisateur dans un délai de 10 secondes est réputéene pas répondre. Dans une telle situation, une erreur ANR, pour ApplicationNot Responding (« l’application ne répond pas »), est levée, et l’application estsusceptible d’être arrêtée par le système.

Pour les opérations qui peuvent potentiellement prendre du temps (dont la ré-ponse n’est pas immédiate), il est donc fortement recommandé d’effectuer destraitements asynchrones : l’opération est exécutée en arrière-plan, et l’utilisa-teur peut être prévenu de la progression de l’opération.

Bien qu’il soit possible de mettre en place un tel mécanisme en utilisant lesclassiques classes de gestion des threads de Java, la plateforme fournit uneclasse abstraite, android.os.AsyncTask, qui prend en charge la majeurepartie de la mise en place d’une solution asynchrone, et allège d’autant le tra-vail du développeur.

AsyncTask<Params, Progress, Result>

lcroise
Tampon

© E

dit

ions

EN

I -

All r

ights

rese

rved

244Programmation en Java sous Android Studio

Développez une application Android

Les types génériques Params, Progress, Result représentent, commedétaillés ci-dessous, les types de données passés en paramètre ou retournés parles méthodes exposées par la classe.

Pour simplifier la conception d’une opération d’arrière-plan, AsyncTasksépare le traitement en plusieurs phases, chacune étant représentée par uneméthode.

– void onPreExecute() : cette méthode est exécutée au lancement de latâche asynchrone. Elle s’exécute sur le thread principal, ce qui permet demanipuler les composants de l’interface utilisateur. Il ne faut pas invoquercette méthode directement, mais appeler la méthode execute, qui lance letraitement.

– Result doInBackground(Params... params) : cette méthode estabstraite, elle doit obligatoirement être surchargée, et s’exécute dans unthread d’arrière-plan, lorsque la méthode onPreExecute est terminée.C’est dans cette méthode que le traitement doit être effectué, aucuneopération sur les composants de l’interface n’étant par ailleurs possible.doInBackground prend en paramètre un ensemble de données de typegénérique Params et doit renvoyer en retour un objet de type génériqueResult.

– void onPostExecute(Result result) : cette méthode est invoquéeaprès la méthode doInBackground. Elle prend en paramètre l’objet detype générique Result renvoyé par doInBackground. Cette méthodeétant exécutée par le thread principal, la manipulation des composants del’interface utilisateur est possible.

– void onProgressUpdate(Progress... values) : cette méthodes’exécute sur le thread principal, lorsque la méthode publishProgressest invoquée par la méthode doInBackground. Elle est typiquement pré-vue pour gérer l’affichage d’une boîte de dialogue de progression.

245Tâches asynchrones et servicesChapitre 9

Remarque

La notion de thread principal / thread d'arrière-plan n'est pas à négliger : il esten effet impossible de manipuler tout objet faisant partie de l'interfaceutilisateur dans un thread d'arrière-plan : cela génère une exception. Si, dansle cadre de la classe AsyncTask, ce n'est pas problèmatique, les méthodesonPreExecute, onPostExecute et onProgressUpdate s'exécutant sur le threadprincipal, cela peut être handicapant dans certains cas. Pour contournercette limitation, la classe Activity expose la méthode runOnUIThread, qui,comme son nom l'indique, force l'exécution dans le thread principal.runOnUIThread prend en paramètre une instance de l'interface Runnable. Unexemple est donné chapitre Utilisation du Bluetooth Low Energy, sectionConnecter un objet.

Dans le projet LocDVD, l’insertion des DVD exemples est une tâche qui peutpotentiellement prendre un certain temps : il n’y a ici que quelques DVD,mais on pourrait imaginer fournir un fichier plus étoffé, qui prendrait dutemps à être interprété. Il est donc plus que recommandé de transformer cetraitement en traitement asynchrone.

dÉditez le fichier MainActivity.java qui contient la méthode effectuantl’insertion des DVD exemples.

dDans la classe MainActivity, définissez une classe AsyncReadEm-beddedData qui étend la classe AsyncTask<String, Integer,

Boolean>.class AsyncReadEmbeddedData extends AsyncTask<String, Integer, Boolean> {

}

dIl faut surcharger les méthodes onPreExecute, doInBackground,onProgressUpdate et onPostExecute :

class AsyncReadEmbeddedData extends AsyncTask<String, Integer, Boolean> {

@Override

protected void onPreExecute() {

}

@Override

protected Boolean doInBackground(String... params) {

return false;

}

© E

dit

ions

EN

I -

All r

ights

rese

rved

246Programmation en Java sous Android Studio

Développez une application Android

@Override

protected void onProgressUpdate(Integer... values) {

}

@Override

protected void onPostExecute(Boolean result) {

}

};

dLa méthode doInBackground reprend le code de la méthodereadEmbeddedData qui effectue la lecture et l’insertion des DVDexemples. Le nom du fichier, au lieu d’être inscrit directement dans le corpsde la méthode, est passé en paramètre de doInBackground.

Le corps de doInBackground est, pour l’instant, le suivant :

@Override

protected Boolean doInBackground(String... params) {

String dataFile = params[0];

InputStreamReader reader = null;

InputStream file=null;

BufferedReader bufferedReader=null;

try {

file = getAssets().open(dataFile);

reader = new InputStreamReader(file);

bufferedReader = new BufferedReader(reader);

String line= null;

while((line=bufferedReader.readLine())!=null) {

String [] data = line.split("\\|");

if(data!=null && data.length==4) {

DVD dvd = new DVD();

dvd.titre = data[0];

dvd.annee = Integer.decode(data[1]);

dvd.acteurs = data[2].split(",");

dvd.resume = data[3];

dvd.insert(MainActivity.this);

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if(bufferedReader!=null) {

try {

bufferedReader.close();

reader.close();

247Tâches asynchrones et servicesChapitre 9

SharedPreferences sharedPreferences =

getSharedPreferences("com.exemple.locDVD.prefs",

Context.MODE_PRIVATE);

SharedPreferences.Editor editor =

sharedPreferences.edit();

editor.putBoolean("embeddedDataInserted", true);

editor.commit();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return false;

}

dPour informer l’utilisateur de l’avancement de l’initialisation, il faut publierà chaque insertion le nombre de DVD insérés dans la base. Pour cela, il fautimplémenter un compteur, et invoquer, à chaque itération de la bouclewhile, la méthode publishProgress :

try {

int counter = 0;

file = getAssets().open(dataFile);

reader = new InputStreamReader(file);

bufferedReader = new BufferedReader(reader);

String line= null;

while((line=bufferedReader.readLine())!=null) {

String [] data = line.split("\\|");

if(data!=null && data.length==4) {

DVD dvd = new DVD();

dvd.titre = data[0];

dvd.annee = Integer.decode(data[1]);

dvd.acteurs = data[2].split(",");

dvd.resume = data[3];

dvd.insert(MainActivity.this);

publishProgress(++counter);

}

}

} catch (IOException e) {

© E

dit

ions

EN

I -

All r

ights

rese

rved

248Programmation en Java sous Android Studio

Développez une application Android

e.printStackTrace();

}

ddoInBackground doit renvoyer vrai si l’insertion s’est correctementdéroulée, et faux dans le cas contraire. Dans le cadre de l’application, il esten outre intéressant de rajouter une temporisation entre l’insertion de deuxDVD, pour visualiser plus facilement le traitement en arrière-plan. Uneversion complète de la méthode est proposée ci-dessous :

@Override

protected Boolean doInBackground(String... params) {

boolean result = false;

String dataFile = params[0];

InputStreamReader reader = null;

InputStream file=null;

BufferedReader bufferedReader=null;

try {

int counter = 0;

file = getAssets().open(dataFile);

reader = new InputStreamReader(file);

bufferedReader = new BufferedReader(reader);

String line= null;

while((line=bufferedReader.readLine())!=null) {

String [] data = line.split("\\|");

if(data!=null && data.length==4) {

DVD dvd = new DVD();

dvd.titre = data[0];

dvd.annee = Integer.decode(data[1]);

dvd.acteurs = data[2].split(",");

dvd.resume = data[3];

dvd.insert(MainActivity.this);

publishProgress(++counter);

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if(bufferedReader!=null) {

try {

bufferedReader.close();