0% ont trouvé ce document utile (0 vote)
2K vues1 627 pages

Android FR PDF

Transféré par

Ndourdom Ezéchiel
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)
2K vues1 627 pages

Android FR PDF

Transféré par

Ndourdom Ezéchiel
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

Android

#android
Table des matières
À propos 1

Chapitre 1: Démarrer avec Android 2

Remarques 2

Versions 2

Examples 3

Configurer Android Studio 3

Configurer Android Studio 3

Changer / ajouter un thème 4

Compiler les applications 4

Créer un nouveau projet 4

Configurer Android Studio 4

Configurez votre projet 4

Configuration de base 5

Sélectionnez les facteurs de forme et le niveau d'API 6

Ajouter une activité 9

Inspection du projet 10

Exécution de l'application 14

Configurer un appareil Android 15

Exécution depuis Android Studio 15

Emplacement du fichier APK 15

Programmation Android sans IDE 16

Exigences et hypothèses 16

Configuration du SDK Android 16

Coder l'application 17

Construire le code 18

Installation et exécution 19

Déclaration d'une ressource 20

Désinstallation de l'application 21

Voir également 21
Principes de base de l'application 21

Composants de l'application 21

Le contexte 22

Configuration d'un AVD (Android Virtual Device) 23

Chapitre 2: Accès aux bases de données SQLite à l'aide de la classe ContentValues 29

Examples 29

Insertion et mise à jour de lignes dans une base de données SQLite 29

Insérer des données 29

Mise à jour des données 29

Chapitre 3: ACRA 30

Syntaxe 30

Paramètres 30

Remarques 30

Examples 30

ACRAHandler 30

Exemple manifeste 31

Installation 31

Chapitre 4: Activité 32

Introduction 32

Syntaxe 32

Paramètres 33

Remarques 33

Examples 33

Exclure une activité de l'historique de la pile arrière 33

Activité Android Explication de LifeCycle 34

Mode de lancement d'activité 37

La norme: 38

SingleTop: 38

SingleTask: 38

Seule instance: 38

Présentation de l'interface utilisateur avec setContentView 38


Exemples 39

Définir le contenu du fichier de ressources: 39

Définir le contenu à une vue explicite: 39

Effacer votre pile d'activité actuelle et lancer une nouvelle activité 40

Fin de l'application avec exclure des Récents 40

Up Navigation pour les activités 41

Chapitre 5: ADB (Android Debug Bridge) 43

Introduction 43

Remarques 43

Examples 43

Imprimer la liste détaillée des appareils connectés 43

Exemple de sortie 43

Lire les informations sur l'appareil 44

Exemple complet de sortie 44

Connecter ADB à un périphérique via WiFi 47

Appareil non enraciné 47

Appareil enraciné 48

Lorsque vous avez un périphérique rooté mais que vous n'avez pas accès à un câble USB 48

Éviter le délai d'attente 49

Extraire (pousser) des fichiers de (vers) l'appareil 49

Redémarrer le périphérique 49

Activer / désactiver le Wifi 50

Voir les appareils disponibles 50

Connecter le périphérique par IP 50

Démarrer / arrêter adb 51

Voir logcat 51

Commande ADB directe vers un périphérique spécifique dans un paramètre multi-périphérique 53

Prendre une capture d'écran et une vidéo (pour kitkat uniquement) à partir d'un écran de p 53

Capture d'écran: Option 1 (pure adb) 53

Capture d'écran: Option 2 (plus rapide) 54

Vidéo 54

Effacer les données d'application 55


Envoi de diffusion 55

Installer et exécuter une application 56

Sauvegarde 56

Installer ADB sur un système Linux 57

Énumérer toutes les autorisations qui nécessitent une subvention d'exécution des utilisate 57

Afficher les données internes d'une application (données / données / ) sur un appareil 58

Afficher la pile d'activités 58

Afficher et extraire les fichiers de cache d'une application 58

Chapitre 6: AdMob 60

Syntaxe 60

Paramètres 60

Remarques 60

Examples 60

Exécution 60

Build.gradle au niveau de l'application 60

Manifeste 60

XML 61

Java 61

Chapitre 7: Affichage 63

Introduction 63

Syntaxe 63

Remarques 63

Examples 63

Textview avec une taille de texte différente 63

Personnalisation de TextView 63

TextView Spannable 66

TextView avec image 68

Texte barré 68

Barré le texte entier 68

Barré seulement des parties du texte 68

Personnalisation du thème et du style 69


Rendre RelativeSizeSpan aligné sur le haut 71

Pinchzoom sur TextView 73

Single TextView avec deux couleurs différentes 74

Chapitre 8: Affichage des annonces Google 76

Examples 76

Configuration de base de l'annonce 76

Ajouter une annonce interstitielle 76

Chapitre 9: AIDL 79

Introduction 79

Examples 79

Service AIDL 79

Chapitre 10: Ajout d'un FuseView à un projet Android 81

Introduction 81

Examples 81

hikr app, juste un autre android.view.View 81

Chapitre 11: AlarmManager 90

Examples 90

Exécuter une intention ultérieurement 90

Comment annuler une alarme 90

Création d'alarmes exactes sur toutes les versions Android 91

Le mode API23 + Doze interfère avec AlarmManager 91

Chapitre 12: Amélioration des dialogues d'alerte 93

Introduction 93

Examples 93

Boîte de dialogue d'alerte contenant un lien cliquable 93

Chapitre 13: Amélioration des performances Android à l'aide des polices Icon 94

Remarques 94

Examples 94

Comment intégrer les polices Icon 94

TabLayout avec des polices d'icône 97

Chapitre 14: Android Java Native Interface (JNI) 99


Introduction 99

Examples 99

Comment appeler des fonctions dans une bibliothèque native via l'interface JNI 99

Comment appeler une méthode Java à partir du code natif 100

Méthode utilitaire dans la couche JNI 101

Chapitre 15: Android Vk Sdk 103

Examples 103

Initialisation et connexion 103

Chapitre 16: Android-x86 dans VirtualBox 105

Introduction 105

Examples 105

Configuration de la machine virtuelle 105

Configuration du disque dur virtuel pour le support SDCARD 105

Installation en partition 108

Chapitre 17: Animateurs 112

Examples 112

Secouer l'animation d'une ImageView 112

Animation de fondu entrant / sortant 113

Animation TransitionDrawable 113

ValueAnimator 114

ObjectAnimator 115

ViewPropertyAnimator 116

Développer et réduire l'animation de la vue 116

Chapitre 18: Annotations Typedef: @IntDef, @StringDef 118

Remarques 118

Examples 118

IntDef Annotations 118

Combinaison de constantes avec des drapeaux 119

Chapitre 19: API Android Places 120

Examples 120

Exemple d'utilisation du sélecteur d'emplacement 120

Obtention des emplacements actuels à l'aide de l'API Places 121


Intégration de la saisie semi-automatique 122

Ajout de plus d'une activité complète de google auto. 123

Définition des filtres de type de lieu pour PlaceAutocomplete 124

Chapitre 20: API Bluetooth et Bluetooth LE 126

Remarques 126

Examples 126

Autorisations 126

Vérifiez si Bluetooth est activé 126

Rendre l'appareil détectable 127

Trouver des périphériques Bluetooth à proximité 127

Se connecter à un périphérique Bluetooth 128

Trouver des appareils Bluetooth Low Energy à proximité 130

Chapitre 21: API d'empreintes digitales dans Android 135

Remarques 135

Examples 135

Ajout du scanner d'empreintes digitales dans une application Android 135

Comment utiliser Android Fingerprint API pour enregistrer les mots de passe des utilisateu 137

Chapitre 22: API de sensibilisation Google 146

Remarques 146

Examples 146

Obtenir l'activité utilisateur actuelle à l'aide de l'API Snapshot 147

Obtenir l'état du casque avec l'API Snapshot 147

Obtenir l'emplacement actuel à l'aide de Snapshot API 147

Obtenir des lieux à proximité en utilisant l'API Snapshot 147

Obtenir la météo actuelle en utilisant l'API Snapshot 148

Obtenir des modifications dans l'activité de l'utilisateur avec l'API de clôture 148

Obtenir des modifications pour l'emplacement dans une certaine plage à l'aide de l'API de 149

Chapitre 23: API Google Drive 152

Introduction 152

Remarques 152

Examples 152

Intégrer Google Drive dans Android 152


Créer un fichier sur Google Drive 163

Gestionnaire de résultat de DriveContents 163

Créer un fichier par programme 164

Gérer le résultat du fichier créé 165

Chapitre 24: API Twitter 166

Examples 166

Créer une connexion avec le bouton Twitter et y attacher un rappel 166

Chapitre 25: Applications compatibles avec la construction en amont 168

Examples 168

Comment gérer les API obsolètes 168

Alternative plus simple: utilisez la bibliothèque de support 169

Chapitre 26: Architecture MVP 171

Introduction 171

Remarques 171

Définition MVP 171

Structure de l'application recommandée (non requise) 171

Examples 172

Exemple de connexion dans le modèle MVP (Model View Presenter) 172

Diagramme de classe 175

Remarques: 176

Exemple de connexion simple dans MVP 176

Structure de colis requise 176

XML activity_login 177

Classe d'activité LoginActivity.class 178

Créer une interface ILoginView 179

Création d'une interface ILoginPresenter 180

ILoginPresenter.class 180

LoginPresenterCompl.class 180

Créer un UserModel 181

UserModel.class 181
IUser.class 181

MVP 182

Chapitre 27: AsyncTask 184

Paramètres 184

Examples 184

Utilisation de base 184

Exemple 184

Usage: 185

Remarque 185

Annuler AsyncTask 186

Remarque 187

Progrès de la publication 187

Télécharger l'image en utilisant AsyncTask dans Android 187

Comprendre Android AsyncTask 188

Téléchargement d'image en utilisant Android AsyncTask 188

Passer l'activité en tant que WeakReference pour éviter les fuites de mémoire 191

Ordre d'exécution 192

AsyncTask: exécution en série et exécution parallèle de la tâche 193

THREAD_POOL_EXECUTOR 193

SERIAL_EXECUTOR 193

Tâche exécutée dans le pool de threads (1) 195

Chapitre 28: AudioManager 196

Examples 196

Demande de focus audio transitoire 196

Demande de focus audio 196

Chapitre 29: Authentificateur Android 197

Examples 197

Service d'authentification de compte de base 197

Chapitre 30: AutoCompleteTextView 200

Remarques 200

Examples 200
AutoCompleteTextView simple et codé en dur 200

AutoComplete avec CustomAdapter, ClickListener et Filter 200

Mise en page principale: activity_main.xml 200

Disposition des lignes row.xml 201

strings.xml 201

MainActivity.java 201

Classe de modèle: People.java 202

Classe d'adaptateur: PeopleAdapter.java 203

Chapitre 31: Autorisations d'exécution dans API-23 + 205

Introduction 205

Remarques 205

Examples 206

Android 6.0 autorisations multiples 206

Application des autorisations dans les diffusions, URI 207

Autorisations d'exécution multiples à partir des mêmes groupes d'autorisations 208

Utiliser PermissionUtil 210

Inclure tout le code lié aux permissions dans une classe de base abstraite et étendre l'ac 211

Exemple d'utilisation dans l'activité 212

Chapitre 32: Autosizing TextViews 214

Introduction 214

Examples 214

Granularité 214

Tailles prédéfinies 215

Chapitre 33: Avertissements de peluches 216

Remarques 216

Documentation officielle: 216

Examples 216

Utilisation des outils: ignore dans les fichiers xml 216

Importation de ressources sans erreur "obsolète" 216

Configurer LintOptions avec gradle 217

Comment configurer le fichier lint.xml 218

Configuration de la vérification des peluches dans les fichiers source Java et XML 218
Configuration de la vérification des peluches en Java 219

Configuration de la vérification de peluches en XML 219

Mark Supprimer les avertissements 219

Chapitre 34: Barre de progression 221

Remarques 221

Examples 221

ProgressBar Indéterminé 221

Déterminer ProgressBar 221

Barre de progression personnalisée 223

Tinting ProgressBar 226

Progressbar matériel linéaire 227

Indéterminé 228

Déterminé 228

Tampon 229

Indéterminé et Déterminé 229

Création d'une boîte de dialogue de progression personnalisée 230

Chapitre 35: Bibliothèque Dagger 2: injection de dépendance dans les applications 232

Introduction 232

Remarques 232

Dagger 2 API: 232

Liens importants: 232

Examples 233

Créer une annotation @Module Class et @Singleton pour Object 233

Demander des dépendances dans des objets dépendants 233

Connecter @Modules avec @Inject 233

Utilisation de l'interface @Component pour obtenir des objets 234

Chapitre 36: Bibliothèque de liaison de données 235

Remarques 235

Examples 235

Liaison de texte de base 235

Liaison avec une méthode d'accesseur 237


Cours de référencement 237

Liaison de données en fragment 238

Liaison de données bidirectionnelle intégrée 239

Liaison de données dans l'adaptateur RecyclerView 240

Modèle de données 240

Mise en page XML 240

Classe d'adaptateur 240

Cliquez sur auditeur avec liaison 241

Evénement personnalisé à l'aide de l'expression lambda 242

Valeur par défaut dans la liaison de données 244

DataBinding avec des variables personnalisées (int, booléen) 245

Liaison de données dans un dialogue 245

Passer le widget comme référence dans BindingAdapter 246

Chapitre 37: Bluetooth Low Energy 248

Introduction 248

Examples 248

Recherche de périphériques BLE 248

Connexion à un serveur GATT 249

Écrire et lire à partir de caractéristiques 249

Abonnement aux notifications du serveur Gatt 250

Publicité d'un appareil BLE 251

Utiliser un serveur Gatt 252

Chapitre 38: Boîte AlertDialog Animée 254

Introduction 254

Examples 254

Mettez le code ci-dessous pour la boîte de dialogue animée ... 254

Chapitre 39: BottomNavigationView 257

Introduction 257

Remarques 257

Liens: 257

Examples 257

Implémentation de base 257


Personnalisation de BottomNavigationView 258

Gestion des états activés / désactivés 259

Autoriser plus de 3 menus 259

Chapitre 40: Bouton 261

Syntaxe 261

Examples 261

en ligne surClickListener 261

Utiliser la mise en page pour définir une action de clic 261

Utiliser le même événement de clic pour une ou plusieurs vues dans le XML 262

Écouter les événements de clic long 262

Définition d'un écouteur externe 262

Quand devrais-je l'utiliser 263

Custom Click Listener pour empêcher plusieurs clics rapides 263

Personnalisation du style de bouton 264

Chapitre 41: BroadcastReceiver 269

Introduction 269

Examples 269

Introduction au récepteur de diffusion 269

Notions de base sur BroadcastReceiver 270

Utiliser LocalBroadcastManager 270

Récepteur de diffusion Bluetooth 271

ajouter une autorisation dans votre fichier manifeste 271

Dans votre fragment (ou activité) 271

Enregistrement de diffusion 271

Annuler la diffusion 272

Activation et désactivation d'un récepteur de diffusion par programmation 272

BroadcastReceiver pour gérer les événements BOOT_COMPLETED 272

Exemple de LocalBroadcastManager 273

Communiquer deux activités via un récepteur de diffusion personnalisé 274

Diffusion collante 275

Utiliser les diffusions commandées 275

État d'arrêt Android 276


Chapitre 42: Cache Bitmap 277

Introduction 277

Syntaxe 277

Paramètres 277

Examples 277

Cache de bitmap utilisant le cache LRU 277

Chapitre 43: Camera 2 API 279

Paramètres 279

Remarques 279

Examples 280

Prévisualiser la caméra principale dans un TextureView 280

Chapitre 44: Caméra et Galerie 290

Examples 290

Prendre une photo pleine grandeur à partir de l'appareil photo 290

AndroidManifest.xml 290

Prendre une photo 292

Comment démarrer la caméra ou la galerie et enregistrer le résultat de la caméra dans le s 295

Définir la résolution de la caméra 298

Décoder le bitmap correctement pivoté à partir de l'URI récupéré avec l'intention 298

Chapitre 45: Canal de notification Android O 302

Introduction 302

Syntaxe 302

Paramètres 302

Examples 302

Canal de notification 302

Chapitre 46: Capturer des captures d'écran 309

Examples 309

Capture d'écran via Android Studio 309

Capture d'écran via Android Device Monitor 309

Capture d'écran via ADB 310

Capture d'écran via ADB et enregistrement directement sur votre PC 310

Prendre une capture d'écran d'une vue particulière 310


Chapitre 47: CardView 312

Introduction 312

Paramètres 312

Remarques 313

Documentation officielle: 313

Examples 313

Premiers pas avec CardView 313

Personnalisation de CardView 315

Ajout d'animation Ripple 315

Utilisation d'images en tant qu'arrière-plan dans CardView (problèmes liés aux périphériqu 316

Animer la couleur d'arrière-plan de CardView avec TransitionDrawable 318

Chapitre 48: Carte à puce 319

Examples 319

Carte à puce envoyer et recevoir 319

Chapitre 49: Chaînes de formatage 322

Examples 322

Formater une ressource de chaîne 322

Mettre en forme un horodatage en chaîne 322

Formatage des types de données en chaîne et vice versa 322

Chapitre 50: Changements d'orientation 323

Remarques 323

Examples 323

Enregistrement et restauration de l'état d'activité 323

Enregistrement et restauration de l'état des fragments 324

Conservation des fragments 325

Orientation de l'écran de verrouillage 326

Gestion manuelle des modifications de configuration 326

Gestion de la tâche asynchrone 327

Problème: 327

Solution: 327

Exemple: 327

Activité principale: 327


AsyncTaskLoader: 328

Remarque: 328

Verrouiller la rotation de l'écran par programmation 328

Chapitre 51: Chargement efficace de bitmaps 330

Introduction 330

Syntaxe 330

Examples 330

Chargez l'image à partir d'une ressource à partir d'un périphérique Android. Utiliser les 330

Chapitre 52: Chargeur 333

Introduction 333

Paramètres 333

Remarques 333

Quand ne pas utiliser les chargeurs 333

Examples 334

AsyncTaskLoader de base 334

AsyncTaskLoader avec cache 335

Rechargement 336

Passer les paramètres à l'aide d'un ensemble 337

Chapitre 53: Chargeur d'image universel 338

Remarques 338

Examples 338

Initialiser Universal Image Loader 338

Utilisation de base 338

Chapitre 54: Chiffrement / déchiffrement des données 340

Introduction 340

Examples 340

Cryptage AES des données en utilisant un mot de passe de manière sécurisée 340

Chapitre 55: Choses Android 342

Examples 342

Contrôle d'un servomoteur 342

Chapitre 56: Clavier 344


Examples 344

Masquer le clavier lorsque l'utilisateur touche n'importe où ailleurs sur l'écran 344

Enregistrer un rappel pour clavier ouvert et fermé 344

Chapitre 57: CleverTap 346

Introduction 346

Remarques 346

Examples 346

Obtenir une instance du SDK pour enregistrer des événements 346

Définition du niveau de débogage 346

Chapitre 58: Code à barres et lecture du code QR 347

Remarques 347

Examples 347

Utiliser QRCodeReaderView (basé sur Zxing) 347

Ajout de la bibliothèque à votre projet 347

Première utilisation 347

Chapitre 59: Comment stocker les mots de passe de manière sécurisée 349

Examples 349

Utilisation d'AES pour le chiffrement de mot de passe salé 349

Chapitre 60: Comment utiliser SparseArray 353

Introduction 353

Remarques 353

Examples 354

Exemple basique utilisant SparseArray 354

Chapitre 61: Composants d'architecture Android 356

Introduction 356

Examples 356

Ajouter des composants d'architecture 356

Utilisation du cycle de vie dans AppCompatActivity 356

ViewModel avec transformations LiveData 357

La pérennité de la chambre 358

LiveData personnalisé 360


Composant personnalisé prenant en compte le cycle de vie 361

Chapitre 62: Compression d'image 363

Examples 363

Comment compresser l'image sans changement de taille 363

Chapitre 63: Compte à rebours 366

Paramètres 366

Remarques 366

Examples 366

Création d'un compte à rebours simple 366

Un exemple plus complexe 366

Chapitre 64: Comptes et AccountManager 369

Examples 369

Comprendre les comptes / authentifications personnalisés 369

Chapitre 65: Conception matérielle 372

Introduction 372

Remarques 372

Examples 372

Appliquer un thème AppCompat 372

Ajouter une barre d'outils 373

Ajouter un FloatingActionButton (FAB) 375

Boutons stylisés avec Material Design 376

Comment utiliser TextInputLayout 378

Ajouter un TabLayout 378

RippleDrawable 380

Ajouter un tiroir de navigation 385

Feuilles de fond dans la bibliothèque d'aide à la conception 388

Feuilles de fond persistantes 389

DialogFragment de la feuille inférieure 390

Ajouter un snack 391

Chapitre 66: Configuration de Jenkins CI pour les projets Android 394

Examples 394

Approche étape par étape pour configurer Jenkins pour Android 394
PARTIE I: Configuration initiale sur votre machine 394

PARTIE II: Configurer Jenkins pour construire des jobs Android 395

Partie III: Créer un Job Jenkins pour votre projet Android 396

Chapitre 67: Connexions Wi-Fi 398

Examples 398

Se connecter avec le cryptage WEP 398

Se connecter avec le cryptage WPA2 398

Rechercher des points d'accès 399

Chapitre 68: ContrainteLayout 402

Introduction 402

Syntaxe 402

Paramètres 402

Remarques 403

Pour en savoir plus sur la disposition des contraintes: 403

Examples 403

Ajouter ConstraintLayout à votre projet 403

Chaînes 404

Chapitre 69: ContrainteSet 406

Introduction 406

Examples 406

ConstraintSet avec ContraintLayout par programme 406

Chapitre 70: Conversion de la parole en texte 407

Examples 407

Discours à texte avec dialogue d'invite Google par défaut 407

Discours au texte sans dialogue 408

Chapitre 71: Convertir une chaîne vietnamienne en anglais 410

Examples 410

Exemple: 410

Chuyn chui Ting Vit 410

Chapitre 72: CoordinateurLayout et comportements 411

Introduction 411
Remarques 411

Examples 411

Créer un comportement simple 411

Prolongez le CoordinatorLayout.Behavior 411

Attacher un comportement par programmation 412

Joindre un comportement en XML 412

Joindre un comportement automatiquement 412

Utiliser le SwipeDismissBehavior 412

Créer des dépendances entre les vues 413

Chapitre 73: Couleurs 415

Examples 415

Manipulation de couleur 415

Chapitre 74: Couteau à beurre 416

Introduction 416

Remarques 416

Couteau à beurre 416

Examples 416

Configurer ButterKnife dans votre projet 417

Vues contraignantes à l'aide de ButterKnife 419

Vues contraignantes 419

Relier les vues dans l'activité 419

Vues contraignantes dans les fragments 419

Vues de liaison dans les dialogues 420

Vues de liaison dans ViewHolder 420

Ressources contraignantes 420

Listes de vue de reliure 420

Fixations optionnelles 421

Relier les auditeurs à l'aide de ButterKnife 421

Des vues indomptables dans ButterKnife 422

Android Studio ButterKnife Plugin 423


Chapitre 75: Création de superposition Windows (toujours visible) 425

Examples 425

Popup overlay 425

Affectation d'une vue au WindowManager 425

Accorder la permission SYSTEM_ALERT_WINDOW sur Android 6.0 et supérieur 425

Chapitre 76: Création de vos propres bibliothèques pour les applications Android 427

Examples 427

Création d'un projet de bibliothèque 427

Utiliser la bibliothèque dans le projet en tant que module 428

Créer une bibliothèque disponible sur Jitpack.io 428

Chapitre 77: Création de vues personnalisées 430

Examples 430

Création de vues personnalisées 430

Ajout d'attributs à des vues 432

Création d'une vue composée 434

Conseils de performance CustomView 438

Vue composée pour SVG / VectorDrawable comme drawableRight 439

Nom du module: custom_edit_drawable (nom abrégé pour prefix- c_d_e) 439

build.gradle 439

Fichier de mise en page: c_e_d_compound_view.xml 439

Attributs personnalisés: attrs.xml 440

Code: EditTextWithDrawable.java 440

Exemple: Comment utiliser la vue ci-dessus 441

Mise en page: activity_main.xml 441

Activité: MainActivity.java 442

Répondre aux événements tactiles 442

Chapitre 78: Créer des ROM personnalisées Android 444

Examples 444

Préparez votre machine pour la construction! 444

Installation de Java 444

Installation de dépendances supplémentaires 444

Préparer le système pour le développement 444


Chapitre 79: Créer un écran de démarrage 446

Remarques 446

Examples 446

Un écran de base 446

Écran de démarrage avec animation 448

Etape 1: Créer une animation 448

Étape 2: Créer une activité 448

Étape 3: Remplacez le lanceur par défaut 449

Chapitre 80: Créer une classe Singleton pour le message Toast 451

Introduction 451

Syntaxe 451

Paramètres 451

Remarques 452

Examples 452

Créer sa propre classe de singleton pour les massages de pain grillé 452

Chapitre 81: Cueilleurs de date et d'heure 454

Examples 454

Matériau DatePicker 454

Dialogue de sélecteur de date 456

Chapitre 82: Cycle de vie de l'interface utilisateur 458

Examples 458

Enregistrement de données lors du découpage de la mémoire 458

Chapitre 83: Dague 2 459

Syntaxe 459

Remarques 459

Examples 459

Configuration du composant pour l'injection d'application et d'activité 459

Scopes personnalisés 461

Constructeur Injection 461

Utiliser @Subcomponent au lieu de @Component (dépendances = {...}) 462

Comment ajouter Dagger 2 dans build.gradle 463


Création d'un composant à partir de plusieurs modules 463

Chapitre 84: Date / heure localisée dans Android 466

Remarques 466

Examples 466

Format de date personnalisé personnalisé avec DateUtils.formatDateTime () 466

Formatage de date / heure standard dans Android 466

Date et heure entièrement personnalisées 466

Chapitre 85: Décompresser le fichier dans Android 468

Examples 468

Décompresser le fichier 468

Chapitre 86: Décorations RecyclerView 469

Syntaxe 469

Paramètres 469

Remarques 469

Les décorations sont statiques 469

Décorations multiples 469

Autres sujets connexes: 469

Javadoc officiel 469

Examples 470

Dessiner un séparateur 470

Marges par élément avec ItemDecoration 471

Ajouter un diviseur à RecyclerView 472

Comment ajouter des diviseurs en utilisant et diviserItemDecoration 474

ItemOffsetDecoration pour GridLayoutManager dans RecycleView 474

Chapitre 87: Définir la valeur de pas (incrément) pour RangeSeekBar personnalisé 476

Introduction 476

Remarques 476

Examples 477

Définir une valeur de pas de 7 477

Chapitre 88: Démarrer avec OpenGL ES 2.0+ 478

Introduction 478
Examples 478

Configuration de GLSurfaceView et OpenGL ES 2.0+ 478

Compiler et relier les shaders GLSL-ES à partir d'un fichier de ressources 479

Chapitre 89: Des exceptions 481

Examples 481

NetworkOnMainThreadException 481

ActivityNotFoundException 482

OutOfMemoryError 482

DexException 483

Exception non interceptée 483

Enregistrement de votre propre gestionnaire pour des exceptions inattendues 484

Chapitre 90: Des préférences partagées 486

Introduction 486

Syntaxe 486

Paramètres 487

Remarques 487

Documentation officielle 487

Examples 487

Lire et écrire des valeurs dans SharedPreferences 487

Enlever les clés 488

Implémentation d'un écran Paramètres en utilisant SharedPreferences 489

Récupérer toutes les entrées stockées d'un fichier SharedPreferences particulier 491

Écoute des modifications de SharedPreferences 491

Lecture et écriture de données dans SharedPreferences with Singleton 492

Différentes manières d'instancier un objet de SharedPreferences 496

getPreferences (int) VS getSharedPreferences (String, int) 497

Commit vs. Apply 497

Types de données pris en charge dans SharedPreferences 498

Stocker, récupérer, supprimer et effacer les données des préférences partagées 498

Pré-Honeycomb avec StringSet 499

Ajouter un filtre pour EditTextPreference 500

Chapitre 91: Dessin sur toile avec SurfaceView 502


Remarques 502

Examples 502

SurfaceView avec fil de dessin 502

Chapitre 92: Dessins vectoriels 508

Introduction 508

Paramètres 508

Remarques 508

Examples 509

Exemple d'utilisation de VectorDrawable 509

Exemple XML VectorDrawable 510

Importation d'un fichier SVG en tant que VectorDrawable 510

Chapitre 93: Détecter l'événement Shake dans Android 513

Examples 513

Shake Detector in Android Exemple 513

Utilisation de la détection de secousses sismiques 514

Installation 514

Chapitre 94: Détection de geste 515

Remarques 515

Examples 515

Détection de balayage 515

Détection de base du geste 516

Chapitre 95: Développement de jeux Android 518

Introduction 518

Remarques 518

Examples 518

Jeu utilisant Canvas et SurfaceView 518

Chapitre 96: Dialogue 525

Paramètres 525

Remarques 525

Examples 525

Dialogue d'alerte 525


Un dialogue d'alerte de base 526

Sélecteur de date dans DialogFragment 526

DatePickerDialog 528

Sélecteur de date 529

Exemple d'utilisation de DatePickerDialog 529

Ajouter AlertDialog à votre application en utilisant Appcompat 530

ListView dans AlertDialog 531

Dialogue d'alerte personnalisé avec EditText 532

Dialogue personnalisé en plein écran sans arrière-plan et sans titre 533

Dialogue d'alerte avec un titre multiligne 533

Chapitre 97: Directeur chargé d'emballage 536

Examples 536

Récupérer la version de l'application 536

Nom de version et code de version 536

Heure d'installation et heure de mise à jour 536

Méthode utilitaire utilisant PackageManager 537

Chapitre 98: Domaine 539

Introduction 539

Remarques 539

Examples 539

Ajouter un domaine à votre projet 539

Modèles de domaine 540

Liste de primitives (RealmList ) 541

essayer avec les ressources 542

Requêtes triées 542

Requêtes asynchrones 543

Utiliser le domaine avec RxJava 543

Utilisation de base 544

Mise en place d'une instance 544

Fermer une instance 544

Des modèles 545

Insérer ou mettre à jour des données 546


Interroger la base de données 546

Supprimer un objet 547

Chapitre 99: Doze Mode 548

Remarques 548

Examples 550

Exclure l'application de l'utilisation du mode veille 550

Liste blanche d'une application Android par programmation 551

Chapitre 100: Écran partagé / Activités multi-écrans 552

Examples 552

Split Screen introduit dans Android Nougat implémenté. 552

Chapitre 101: Écrans de support avec différentes résolutions, tailles 554

Remarques 554

Taille de l'écran 554

Densité de l'écran 554

Orientation 554

Unités 555

px 555

dans 555

mm 555

pt 555

dp ou tremper 555

sp 555

Examples 556

Utiliser des qualificateurs de configuration 556

Conversion de dp et sp en pixels 557

Taille du texte et différentes tailles d'écran Android 557

Chapitre 102: Ecriture des tests de l'interface utilisateur - Android 559

Introduction 559

Syntaxe 559

Remarques 559

Règles JUnit: 559


Appium 559

Paramètres 559

Examples 560

Exemple de MockWebServer 560

IdlingResource 562

la mise en oeuvre 563

REMARQUES 563

Exemple 563

Usage 564

Combinaison avec la règle JUnit 564

Chapitre 103: Éditer le texte 566

Examples 566

Travailler avec EditTexts 566

Personnalisation du InputType 568

Attribut `inputype` 569

Cacher SoftKeyboard 571

Icône ou bouton dans Custom Edit Text et son action et cliquez sur auditers. 571

Chapitre 104: Emplacement 574

Introduction 574

Remarques 574

LocationManager 574

FusedLocationProviderApi 575

Dépannage 577

Examples 584

API de localisation fusionnée 584

Exemple d'utilisation de l'activité w / LocationRequest 584

Exemple d'utilisation du service w / PendingIntent et BroadcastReceiver 586

Demande de mises à jour d'emplacement à l'aide de LocationManager 589

Demande de mises à jour d'emplacement sur un thread distinct à l'aide de LocationManager 590

Enregistrez geofence 592

Obtenir l'adresse de l'emplacement à l'aide de Geocoder 595


Obtenir des mises à jour de localisation dans un BroadcastReceiver 595

Chapitre 105: Émulateur 597

Remarques 597

Examples 597

Prendre des captures d'écran 597

Ouvrez le gestionnaire AVD 600

Simuler un appel 601

Résolution des erreurs lors du démarrage de l'émulateur 601

Chapitre 106: Événements / Intentions du bouton matériel (PTT, LWP, etc.) 603

Introduction 603

Examples 603

Dispositifs Sonim 603

PTT_KEY 603

YELLOW_KEY 603

SOS_KEY 603

GREEN_KEY 603

Enregistrement des boutons 603

RugGear Devices 604

Bouton PTT 604

Chapitre 107: Exécution instantanée dans Android Studio 605

Remarques 605

Examples 605

Activation ou désactivation d'Instant Run 605

Types de swaps de code dans Instant Run 608

Modifications de code non prises en charge lors de l'utilisation d'Instant Run 608

Chapitre 108: ExoPlayer 610

Examples 610

Ajouter ExoPlayer au projet 610

Utiliser ExoPlayer 610

Principales étapes pour lire de la vidéo et de l'audio à l'aide des implémentations TrackR 611

Chapitre 109: Facebook SDK pour Android 612


Syntaxe 612

Paramètres 612

Examples 612

Comment ajouter Facebook Login dans Android 612

Définition des autorisations d'accès aux données du profil Facebook 614

Créez votre propre bouton personnalisé pour la connexion Facebook 615

Un guide minimaliste pour la connexion / inscription à Facebook 616

Déconnexion de Facebook 617

Chapitre 110: Facturation dans l'application 618

Examples 618

Achats in-app consommables 618

Étapes en résumé: 618

Étape 1: 618

Étape 2: 618

Étape 3: 618

Étape 4: 619

Étape 5: 619

Étape 6: 622

(Tierce partie) Bibliothèque In-App v3 623

Chapitre 111: Fastjson 625

Introduction 625

Syntaxe 625

Examples 625

Analyse JSON avec Fastjson 625

Convertir les données de type Map en JSON String 627

Chapitre 112: Feuilles de fond 628

Introduction 628

Remarques 628

Examples 628

BottomSheetBehavior comme Google maps 628

Installation rapide 635


Feuilles de fond persistantes 635

Feuilles de fond modales avec BottomSheetDialogFragment 637

Feuilles de fond modales avec BottomSheetDialog 637

Ouvrez BottomSheet DialogFragment en mode étendu par défaut. 637

Chapitre 113: Fichier Zip dans Android 639

Examples 639

Fichier Zip sur Android 639

Chapitre 114: Fil 641

Examples 641

Exemple de fil avec sa description 641

Mise à jour de l'interface utilisateur à partir d'un thread d'arrière-plan 641

Chapitre 115: FileIO avec Android 643

Introduction 643

Remarques 643

Examples 643

Obtenir le dossier de travail 643

Écrire un tableau brut d'octets 643

Sérialiser l'objet 644

Ecriture sur stockage externe (carte SD) 644

Résoudre le problème "Invisible MTP files". 645

Travailler avec de gros fichiers 645

Chapitre 116: FileProvider 647

Examples 647

Partage d'un fichier 647

Spécifiez les répertoires dans lesquels les fichiers que vous souhaitez partager sont plac 647

Définir un FileProvider et le lier aux chemins de fichiers 647

Génère l'URI du fichier 648

Partager le fichier avec d'autres applications 648

Chapitre 117: Fileur 649

Examples 649

Ajouter un spinner à votre activité 649


Exemple de base de spinner 649

Chapitre 118: Firebase 652

Introduction 652

Remarques 652

Firebase - Documentation étendue: 652

Autres sujets connexes: 652

Examples 652

Créer un utilisateur Firebase 652

Se connecter utilisateur Firebase avec email et mot de passe 653

Envoyer un e-mail de réinitialisation du mot de passe Firebase 655

Mise à jour du courrier électronique d'un utilisateur Firebase 656

Changer le mot de passe 657

Ré-authentifier l'utilisateur Firebase 658

Opérations de stockage Firebase 660

Firebase Cloud Messaging 666

Configurer Firebase et le SDK FCM 666

Modifier le manifeste de votre application 666

Ajouter Firebase à votre projet Android 668

Ajouter Firebase à votre application 668

Ajouter le SDK 668

Firebase Realtime Database: comment définir / obtenir des données 669

Démo des notifications basées sur FCM 671

Déconnexion de Firebase 679

Chapitre 119: Firebase Cloud Messaging 680

Introduction 680

Examples 680

Configurer une application client Firebase Cloud Messaging sur Android 680

Jeton d'inscription 681

Ce code que j'ai implanté dans mon application pour repousser l'image, le message et aussi 681

Recevoir des messages 682

S'abonner à un sujet 683


Chapitre 120: Firebase Realtime DataBase 685

Remarques 685

Autres sujets connexes: 685

Examples 685

Gestionnaire d'événements Firebase Realtime DataBase 685

Installation rapide 686

Concevoir et comprendre comment récupérer des données en temps réel à partir de la base de 686

Étape 1: Créer une classe nommée Chat 687

Étape 2: créer des données JSON 687

Étape 3: Ajouter les auditeurs 687

Étape 4: Ajouter des données à la base de données 688

Exemple 689

Dénormalisation: Structure de base de données plate 689

Comprendre la base de données JSON Firebase 692

Récupération de données à partir de Firebase 693

Écoute des mises à jour d'enfants 694

Récupération de données avec pagination 695

Chapitre 121: FloatingActionButton 697

Introduction 697

Paramètres 697

Remarques 697

Documentation officielle: 697

Spécifications de conception matérielle: 698

Examples 698

Comment ajouter le FAB à la mise en page 698

Afficher et masquer FloatingActionButton sur Swipe 699

Afficher et masquer FloatingActionButton sur le défilement 701

Définition du comportement de FloatingActionButton 704

Chapitre 122: Formatage des numéros de téléphone avec motif. 705

Introduction 705

Examples 705
Patterns + 1 (786) 1234 5678 705

Chapitre 123: Fournisseur de contenu 706

Remarques 706

Examples 706

Implémentation d'une classe de fournisseur de contenu de base 706

Chapitre 124: Fragments 711

Introduction 711

Syntaxe 711

Remarques 712

Constructeur 712

Examples 712

Le pattern newInstance () 712

Navigation entre des fragments à l'aide d'un backstack et d'un motif de tissu statique 714

Passer des données d'Activité à Fragment en utilisant Bundle 715

Envoi d'événements à une activité avec une interface de rappel 715

Exemple 715

Envoyer un rappel à une activité lorsque le bouton du fragment est cliqué 715

Animer la transition entre les fragments 716

Communication entre fragments 718

Chapitre 125: Fresque 723

Introduction 723

Remarques 723

Examples 723

Premiers pas avec Fresco 723

Utiliser OkHttp 3 avec Fresco 724

Streaming JPEG avec Fresco en utilisant DraweeController 724

Chapitre 126: Fuite de fuite 726

Introduction 726

Remarques 726

Examples 726

Implémenter une fuite canarienne dans une application Android 726


Chapitre 127: Fuites de mémoire 727

Examples 727

Fuites de mémoire communes et comment les corriger 727

1. Fixez vos contextes: 727

2. Référence statique au contexte 727

3. Vérifiez que vous terminez réellement vos services. 728

4. Vérifiez l’utilisation des images et des bitmaps: 728

5. Si vous utilisez des récepteurs de diffusion, désinscrivez-les. 728

6. Si vous utilisez java.util.Observer (modèle Observer): 728

Évitez les fuites d'activités avec AsyncTask 728

Rappel anonyme dans les activités 729

Contexte d'activité dans les classes statiques 730

Détecter les fuites de mémoire avec la bibliothèque LeakCanary 731

Évitez les fuites d'activités avec les auditeurs 732

Alternative 1: Supprimer les auditeurs 734

Alternative 2: Utiliser des références faibles 735

Évitez les fuites de mémoire avec la classe anonyme, le gestionnaire, la tâche de minuteri 738

Chapitre 128: Genymotion pour Android 739

Introduction 739

Examples 739

Installer Genymotion, la version gratuite 739

Étape 1 - Installation de VirtualBox 739

Étape 2 - télécharger Genymotion 739

Étape 3 - Installation de Genymotion 739

Étape 4 - Installation des émulateurs de Genymotion 739

Étape 5 - Intégrer genymotion avec Android Studio 739

Étape 6 - Genymotion depuis Android Studio 740

Google framework sur Genymotion 740

Chapitre 129: Gestion des événements tactiles et animés 741

Introduction 741

Paramètres 741

Examples 741
Boutons 741

Surface 742

Gestion du multitouch dans une surface 743

Chapitre 130: Gestionnaire de raccourcis 745

Examples 745

Raccourcis du lanceur dynamique 745

Chapitre 131: Glisse 746

Introduction 746

Remarques 746

Examples 746

Ajouter Glide à votre projet 746

Chargement d'une image 747

ImageView 747

RecyclerView et ListView 748

Transformation du cercle de glissement (Charger l'image dans une image circulaire) 748

Transformations par défaut 749

Image des coins arrondis avec la cible Glide personnalisée 750

Préchargement d'images 750

Placeholder et gestion des erreurs 751

Charger l'image dans un ImageView circulaire sans transformations personnalisées 751

Échec du chargement de l'image Glide de manipulation 752

Chapitre 132: Glisser pour rafraîchir 754

Syntaxe 754

Examples 754

Balayer pour actualiser avec RecyclerView 754

Comment ajouter Swipe-to-Refresh à votre application 754

Chapitre 133: Google Maps API v2 pour Android 756

Paramètres 756

Remarques 756

Examples 756

Activité Google Map par défaut 756

Styles Google Map personnalisés 757


Ajouter des marqueurs à une carte 767

MapView: incorporation d'un GoogleMap dans une mise en page existante 768

Afficher la position actuelle dans une carte Google 770

Obtention de l'empreinte SH1 de votre fichier de clés de certificat 776

Ne lancez pas Google Maps lorsque la carte est cliquée (mode lite) 777

UISettings 777

Obtenir l'empreinte SHA1 du débogage 778

InfoWindow Click Listener 779

Changer le décalage 781

Chapitre 134: Google Play Store 782

Examples 782

Ouvrez Google Play Store Listing pour votre application 782

Ouvrez Google Play Store avec la liste de toutes les applications de votre compte d'éditeu 782

Chapitre 135: Gradle pour Android 784

Introduction 784

Syntaxe 784

Remarques 784

Gradle pour Android - Documentation étendue: 785

Examples 785

Un fichier de base build.gradle 785

DSL (langage spécifique au domaine) 785

Plugins 786

Comprendre les DSL dans l'exemple ci-dessus 786

Les dépendances 786

Spécification des dépendances spécifiques aux différentes configurations de construction 787

signatureConfig 788

Définition des arômes du produit 788

Ajout de dépendances spécifiques au produit 789

Ajout de ressources spécifiques au produit 790

Définir et utiliser les champs de configuration de la construction 790

BuildConfigField 790
ResValue 791

Centraliser les dépendances via le fichier "dependencies.gradle" 793

Une autre approche 794

Structure de répertoire pour les ressources spécifiques aux saveurs 795

Pourquoi y a-t-il deux fichiers build.gradle dans un projet Android Studio? 795

Exécuter un script shell à partir de gradle 796

Déboguer vos erreurs Gradle 796

Spécification de différents ID d'application pour les types de construction et les variant 797

Signer APK sans exposer le mot de passe du magasin de clés 798

Méthode A: Configurer la signature de version à l'aide d'un fichier keystore.properties 799

Méthode B: En utilisant une variable d'environnement 800

Gestion des versions de votre build via le fichier "version.properties" 800

Modification du nom apk de la sortie et ajout du nom de la version: 801

Désactiver la compression d'image pour une taille de fichier APK plus petite 802

Activer Proguard en utilisant gradle 802

Activer le support expérimental du plug-in NDK pour Gradle et AndroidStudio 802

Configurer le fichier MyApp / build.gradle 802

Configurez le fichier MyApp / app / build.gradle 803

Tester si le plugin est activé 804

Afficher toutes les tâches du projet de graduation 805

Supprimer automatiquement "non aligné" apk 806

Ignorer la variante de construction 807

Voir arbre de dépendance 807

Utilisez gradle.properties pour les versions centralisées de versionnumber / build 808

Afficher les informations de signature 809

Définition des types de construction 810

Chapitre 136: GreenDAO 811

Introduction 811

Examples 811

Méthodes d'aide pour les requêtes SELECT, INSERT, DELETE, UPDATE 811

Création d'une entité avec GreenDAO 3.X qui possède une clé primaire composite 813
Démarrer avec GreenDao v3.X 814

Chapitre 137: GreenRobot EventBus 817

Syntaxe 817

Paramètres 817

Examples 817

Création d'un objet événement 817

Recevoir des événements 817

Envoi d'événements 818

Passer un événement simple 818

Chapitre 138: Gson 821

Introduction 821

Syntaxe 821

Examples 822

Analyse JSON avec Gson 822

Analyse de la propriété JSON pour énumérer avec Gson 824

Analyse d'une liste avec Gson 824

Sérialisation / désérialisation JSON avec AutoValue et Gson 824

Analyse JSON en objet de classe générique avec Gson 825

Ajouter Gson à votre projet 826

Utiliser Gson pour charger un fichier JSON à partir du disque. 827

Ajout d'un convertisseur personnalisé à Gson 827

Utiliser Gson comme sérialiseur avec Retrofit 828

Analyse du tableau json en classe générique à l'aide de Gson 828

Deserializer JSON personnalisé avec Gson 829

Utiliser Gson avec héritage 831

Chapitre 139: HttpURLConnection 834

Syntaxe 834

Remarques 834

Examples 834

Créer un HttpURLConnection 834

Envoi d'une requête HTTP GET 835

Lecture du corps d'une requête HTTP GET 836


Utiliser HttpURLConnection pour multipart / form-data 836

Envoi d'une requête HTTP POST avec des paramètres 839

Fichier de téléchargement (POST) en utilisant HttpURLConnection 840

Une classe HttpURLConnection polyvalente pour gérer tous les types de requêtes HTTP 841

Usage 844

Chapitre 140: Images 9-Patch 845

Remarques 845

Examples 845

Coins arrondis basiques 845

Spinner de base 846

Lignes de remplissage facultatives 847

Chapitre 141: ImageView 848

Introduction 848

Syntaxe 848

Paramètres 848

Examples 848

Définir une ressource image 848

Définir alpha 849

ImageView ScaleType - Centre 850

ImageView ScaleType - CenterCrop 851

ImageView ScaleType - CenterInside 851

ImageView ScaleType - FitStart et FitEnd 851

ImageView ScaleType - FitCenter 851

ImageView ScaleType - FitXy 851

Définir le type d'échelle 851

Mettre la teinte 856

MLRoundedImageView.java 857

Chapitre 142: Indexation des applications Firebase 859

Remarques 859

Examples 861

URL de support 861

Ajouter l'API AppIndexing 862


Chapitre 143: Installation d'applications avec ADB 865

Examples 865

Installer une application 865

Désinstaller une application 865

Installer tous les fichiers apk dans le répertoire 865

Chapitre 144: Intégration de Google Signin sur Android 866

Introduction 866

Examples 866

Intégration de Google Auth dans votre projet. (Obtenir un fichier de configuration) 866

Mise en œuvre du code Google SignIn 866

Chapitre 145: Intégration de la passerelle Android Paypal 868

Remarques 868

Examples 868

Installez paypal dans votre code Android 868

Chapitre 146: Intégrer Google Connexion 870

Syntaxe 870

Paramètres 870

Examples 870

Connexion à Google avec classe d'assistance 870

Chapitre 147: Intégrer OpenCV dans Android Studio 873

Remarques 873

Examples 873

Instructions 873

Chapitre 148: Intention 882

Introduction 882

Syntaxe 882

Paramètres 883

Remarques 883

Mises en garde concernant l'utilisation d'une intention implicite 883

Activité de démarrage qui est une singleTask ou singleTop 884

Examples 884
Commencer une activité 884

Transmission de données entre activités 884

OriginActivity 885

DestinationActivity 885

Envoyer des emails 886

Obtenir un résultat d'une autre activité 887

Activité principale: 887

DetailActivity: 888

Quelques points à connaître: 888

Ouvrir une URL dans un navigateur 889

Ouverture avec le navigateur par défaut 889

Demander à l'utilisateur de sélectionner un navigateur 889

Les meilleures pratiques 890

Effacement d'une pile d'activités 890

Intention URI 891

Diffusion de messages vers d'autres composants 891

CustomTabsIntent pour les onglets personnalisés Chrome 892

Partage de plusieurs fichiers par intention 892

Motif de départ 893

Démarrer le service non lié à l'aide d'une intention 894

Partager l'intention 894

Démarrer le numéroteur 895

Ouvrir la carte Google avec la latitude et la longitude spécifiées 896

Transmission de données différentes via une intention dans l'activité 896

Affichage d'un sélecteur de fichier et lecture du résultat 898

Démarrer une activité de sélecteur de fichiers 898

Lecture du résultat 899

Passer objet personnalisé entre les activités 900

Parcelable 900

Sérialisable 902

Obtenir un résultat de l'activité au fragment 902


Chapitre 149: Intentions implicites 905

Syntaxe 905

Paramètres 905

Remarques 905

Examples 905

Intentions implicites et explicites 905

Intentions implicites 906

Chapitre 150: IntentService 907

Syntaxe 907

Remarques 907

Examples 907

Créer un IntentService 907

Exemple de service d'intention 907

Exemple de base IntentService 908

Chapitre 151: Interfaces 910

Examples 910

Auditeur personnalisé 910

Définir une interface 910

Créer un auditeur 910

Mettre en œuvre l'auditeur 910

Auditeur de déclenchement 911

Auditeur de base 912

Chapitre 152: Internationalisation et localisation (I18N et L10N) 914

Introduction 914

Remarques 914

Examples 914

Planification de la localisation: activez le support RTL dans Manifest 914

Planification de la localisation: ajout du support RTL dans les mises en page 915

Planification de la localisation: test des dispositions pour RTL 916

Codage pour la localisation: création de chaînes et de ressources par défaut 916

Codage pour la localisation: fournir des chaînes alternatives 917


Codage pour la localisation: fournir des mises en page alternatives 917

Chapitre 153: Jackson 919

Introduction 919

Examples 919

Exemple de liaison de données complète 919

Chapitre 154: Java sur Android 921

Introduction 921

Examples 921

Fonctionnalités Java 8 sous-ensemble avec Retrolambda 921

Chapitre 155: JCodec 924

Examples 924

Commencer 924

Obtenir un cadre de film 924

Chapitre 156: Journalisation et utilisation de Logcat 925

Syntaxe 925

Paramètres 925

Remarques 925

Définition 925

Quand utiliser 926

Liens utiles 926

Examples 926

Filtrage de la sortie logcat 926

Enregistrement 928

Enregistrement de base 928

Niveaux de journal 929

Motivation pour l'enregistrement 929

Choses à considérer lors de la journalisation: 930

La lisibilité du journal: 930

Performance: 930

Sécurité: 930

Conclusion: 931
Journal avec un lien vers la source directement depuis Logcat 931

Utiliser le logcat 932

Générer un code de journalisation 932

Utilisation d'Android Studio 933

Effacer les journaux 936

Chapitre 157: JSON dans Android avec org.json 937

Syntaxe 937

Remarques 937

Examples 937

Analyser un objet JSON simple 937

Créer un objet JSON simple 938

Ajouter JSONArray à JSONObject 939

Créez une chaîne JSON avec une valeur nulle. 939

Travailler avec une chaîne vide lors de l'analyse syntaxique de json 940

Utiliser JsonReader pour lire JSON depuis un flux 941

Créer un objet JSON imbriqué 942

Gestion de la clé dynamique pour la réponse JSON 942

Vérifier l'existence de champs sur JSON 943

Mise à jour des éléments dans le JSON 944

Chapitre 158: Le contexte 946

Introduction 946

Syntaxe 946

Remarques 946

Examples 946

Exemples de base 946

Chapitre 159: Le fichier manifeste 948

Introduction 948

Examples 948

Déclaration de composants 948

Déclaration des autorisations dans votre fichier manifeste 949

Chapitre 160: Lecteur multimédia 950

Syntaxe 950
Remarques 950

Examples 952

Création de base et jeu 952

Asynchrone préparer 952

Obtenir des sonneries système 953

Obtenir et définir le volume du système 954

Types de flux audio 954

Réglage du volume 954

Réglage du volume d'un pas 954

Définition de MediaPlayer pour utiliser un type de flux spécifique 955

Media Player avec progression de la mémoire tampon et position de lecture 955

Importer de l'audio dans androidstudio et le lire 957

Chapitre 161: Les notifications 959

Examples 959

Créer une notification simple 959

Spécifiez le contenu de la notification: 959

Créez l'intention de tirer sur le clic: 959

Enfin, créez la notification et affichez-la 959

Notification Heads Up avec Ticker pour les anciens appareils 959

Voici à quoi il ressemble sur Android Marshmallow avec la notification Heads Up: 960

Voici à quoi ça ressemble sur Android KitKat avec le Ticker: 961

Android 6.0 Guimauve: 961

Android 4.4.x KitKat: 962

Définition de différentes priorités dans la notification 963

Notifications de planification 964

Définir une notification personnalisée - affiche le texte intégral du contenu 965

Par exemple, vous avez ceci: 965

Mais vous souhaitez que votre texte soit entièrement montré: 966

Définir l'icône de notification personnalisée en utilisant la bibliothèque `Picasso`. 966

Obtenir dynamiquement la taille de pixel correcte pour la grande icône 967

Notification en cours avec le bouton Action 967

Chapitre 162: ListView 969


Introduction 969

Remarques 969

Examples 969

Filtrage avec CursorAdapter 969

Custom ArrayAdapter 970

Un ListView de base avec un ArrayAdapter 971

Chapitre 163: Localisation avec des ressources sous Android 973

Examples 973

Devise 973

Ajout de la traduction sur votre application Android 973

Type de répertoires de ressources sous le dossier "res" 974

Types de configuration et noms de qualificateur pour chaque dossier sous le répertoire "re 975

Liste exhaustive de tous les différents types de configuration et de leurs valeurs de qual 975

Changer la locale de l'application Android par programmation 978

Chapitre 164: Looper 983

Introduction 983

Examples 983

Créer un LooperThread simple 983

Exécuter une boucle avec un HandlerThread 983

Chapitre 165: LruCache 984

Remarques 984

Examples 984

Initialiser le cache 984

Ajout d'un bitmap (ressource) au cache 984

Obtenir un bitmap (Resouce) du cache 985

Chapitre 166: Manipulation de liens profonds 986

Introduction 986

Paramètres 986

Remarques 986

Le <intent-filter> 986

Plusieurs balises <data> 987

Ressources 987
Examples 987

Lien profond simple 987

Plusieurs chemins sur un seul domaine 987

Plusieurs domaines et plusieurs chemins 988

Les deux http et https pour le même domaine 988

Récupération des paramètres de requête 989

Utiliser pathPrefix 989

Chapitre 167: Manutentionnaire 991

Remarques 991

Examples 991

Utiliser un gestionnaire pour exécuter du code après un laps de temps retardé 991

HandlerThreads et communication entre les threads 991

Créer un gestionnaire pour le thread en cours 991

Création d'un gestionnaire pour le thread principal (thread d'interface utilisateur) 991

Envoyer un runnable d'un autre thread au thread principal 992

Créer un gestionnaire pour un autre HandlerThread et lui envoyer des événements 992

Arrêter le gestionnaire d'exécution 992

Utilisez Handler pour créer un minuteur (similaire à javax.swing.Timer) 993

Chapitre 168: MediaSession 995

Syntaxe 995

Remarques 995

Examples 995

Réception et traitement des événements de bouton 995

Chapitre 169: MediaStore 998

Examples 998

Récupérer des fichiers audio / MP3 à partir d'un dossier spécifique de l'appareil ou récup 998

Exemple avec activité 1000

Chapitre 170: Menu 1002

Syntaxe 1002

Paramètres 1002

Remarques 1002
Examples 1002

Menu d'options avec séparateurs 1002

Appliquer une police personnalisée à Menu 1003

Créer un menu dans une activité 1003

Étape 1: 1003

Étape 2: 1004

Emballer! 1004

Capture d'écran de l'apparence de votre propre menu: 1005

Chapitre 171: Métriques d'affichage du périphérique 1007

Examples 1007

Obtenir les dimensions des pixels des écrans 1007

Obtenir la densité de l'écran 1007

Formule px à dp, dp à px conversation 1007

Chapitre 172: Mises en page 1009

Introduction 1009

Syntaxe 1009

Remarques 1009

LayoutParams et Layout_ Attributes 1009

Impact des performances de l'utilisation de RelativeLayouts en haut de la hiérarchie de vo 1010

Examples 1011

LinearLayout 1011

Disposition relative 1012

Gravité et disposition gravitationnelle 1014

Disposition de la grille 1017

Mise en page en pourcentage 1019

FrameLayout 1020

Coordinateur 1021

Comportement du défilement du coordinateur 1023

Voir le poids 1024

Créer LinearLayout par programmation 1026

LayoutParams 1027

Chapitre 173: Mode PorterDuff 1031


Introduction 1031

Remarques 1031

Examples 1032

Créer un filtre de couleur PorterDuff 1032

Créer un PorterDuff XferMode 1033

Appliquer un masque radial (vignette) à un bitmap à l'aide de PorterDuffXfermode 1033

Chapitre 174: Modèles de conception 1034

Introduction 1034

Examples 1034

Exemple de classe Singleton 1034

Motif d'observateur 1035

Implémenter le motif de l'observateur 1035

Chapitre 175: Moshi 1036

Introduction 1036

Remarques 1036

Examples 1036

JSON dans Java 1036

sérialiser les objets Java en JSON 1036

Adaptateurs intégrés 1036

Chapitre 176: Moyen rapide pour configurer Retrolambda sur un projet Android. 1038

Introduction 1038

Examples 1038

Configuration et exemple d'utilisation: 1038

Chapitre 177: Multidex et la limite de méthode Dex 1040

Introduction 1040

Remarques 1040

Qu'est ce que le dex? 1040

Le problème: 1040

Que faire à ce sujet: 1040

Comment éviter la limite: 1041

Examples 1041
Multidex en utilisant MultiDexApplication directement 1041

Multidex en étendant l'application 1042

Activation de Multidex 1043

Configuration de Gradle 1043

Activer MultiDex dans votre application 1043

Méthode de comptage Références sur chaque version (Dexcount Gradle Plugin) 1043

Multidex en étendant MultiDexApplication 1044

Chapitre 178: MVVM (Architecture) 1046

Remarques 1046

Examples 1047

Exemple MVVM utilisant la bibliothèque DataBinding 1047

Chapitre 179: NavigationView 1055

Remarques 1055

Documentation officielle: 1055

Spécifications de conception matérielle: 1055

Examples 1055

Comment ajouter le NavigationView 1055

Ajouter un soulignement dans les éléments de menu 1060

Ajouter des séparateurs au menu 1061

Ajouter un menu Divider en utilisant par défaut DividerItemDecoration. 1062

Chapitre 180: NDK Android 1064

Examples 1064

Construire des exécutables natifs pour Android 1064

Comment nettoyer la construction 1065

Comment utiliser un makefile autre que Android.mk 1065

Comment se connecter à ndk 1065

Chapitre 181: Obtenir les noms de police du système et utiliser les polices 1067

Introduction 1067

Examples 1067

Obtenir les noms de police système 1067

Application d'une police système à un TextView 1067

Chapitre 182: OkHttp 1068


Examples 1068

Intercepteur de journalisation 1068

Réécriture des réponses 1068

Exemple d'utilisation de base 1068

Appel synchrone 1069

Asynchrone Get Call 1069

Affichage des paramètres du formulaire 1070

Publication d'une requête en plusieurs parties 1070

Configurer OkHttp 1071

Chapitre 183: Okio 1072

Examples 1072

Télécharger / Implémenter 1072

Décodeur PNG 1072

ByteString et Buffers 1073

Chapitre 184: Optimisation des performances 1074

Introduction 1074

Examples 1074

Enregistrer les recherches avec le modèle ViewHolder 1074

Chapitre 185: Optimisation du noyau Android 1075

Examples 1075

Configuration de RAM faible 1075

Comment ajouter un gouverneur de processeur 1075

I / O Schedulers 1077

Chapitre 186: ORMLite dans Android 1079

Examples 1079

Exemple Android OrmLite sur SQLite 1079

Installation de Gradle 1079

Assistant de base de données 1080

Objet persistant à SQLite 1082

Chapitre 187: Otto Event Bus 1084

Remarques 1084

Examples 1084
Passer un événement 1084

Recevoir un événement 1085

Chapitre 188: Outils Attributs 1086

Remarques 1086

Examples 1086

Attributs de conception 1086

Chapitre 189: Outils de rapport d'incident 1088

Remarques 1088

Examples 1088

Tissu - Crashlytics 1088

Comment configurer Fabric-Crashlytics 1088

Utilisation du plug-in Fabric IDE 1089

Rapport de collision avec ACRA 1093

Force un test de crash avec le tissu 1094

Capture se bloque avec Sherlock 1095

Chapitre 190: Pagination dans RecyclerView 1097

Introduction 1097

Examples 1097

MainActivity.java 1097

Chapitre 191: Pain grillé 1102

Introduction 1102

Syntaxe 1102

Paramètres 1102

Remarques 1102

Documentation officielle: 1103

Examples 1103

Définir la position d'un pain grillé 1103

Afficher un message de pain grillé 1103

Création d'un toast personnalisé 1104

Fil de manière sécurisée pour afficher Toast (Application Wide) 1105

Afficher le message Toast ci-dessus 1106

Un moyen sûr d'afficher un message Toast (pour AsyncTask) 1106


Chapitre 192: Parcelable 1107

Introduction 1107

Remarques 1107

Examples 1107

Rendre un objet personnalisé Parcelable. 1107

Objet parcellable contenant un autre objet parcellable 1108

Utiliser Enums avec Parcelable 1109

Chapitre 193: Peindre 1111

Introduction 1111

Examples 1111

Créer une peinture 1111

Configuration de Paint pour le texte 1111

Paramètres de dessin de texte 1111

Texte de mesure 1112

Mise en place de la peinture pour dessiner des formes 1112

Réglage des drapeaux 1112

Chapitre 194: Picasso 1114

Introduction 1114

Remarques 1114

Examples 1114

Ajout de la bibliothèque Picasso à votre projet Android 1114

Gradle. 1114

Maven: 1114

Placeholder et gestion des erreurs 1115

Redimensionnement et rotation 1115

Avatars circulaires avec Picasso 1115

Désactiver le cache dans Picasso 1117

Chargement de l'image à partir d'un stockage externe 1117

Téléchargement de l'image en tant que bitmap à l'aide de Picasso 1118

Annulation de demandes d'images à l'aide de Picasso 1118

Utiliser Picasso comme ImageGetter pour Html.fromHtml 1118


Essayez d'abord le cache disque hors connexion, puis connectez-vous et récupérez l'image 1120

Chapitre 195: Ping ICMP 1122

Introduction 1122

Examples 1122

Effectue un seul ping 1122

Chapitre 196: Piste audio 1123

Examples 1123

Générer le ton d'une fréquence spécifique 1123

Chapitre 197: Planification du travail 1124

Remarques 1124

Examples 1124

Utilisation de base 1124

Créer un nouveau JobService 1124

Ajoutez le nouveau JobService à votre AndroidManifest.xml 1124

Configurer et exécuter le travail 1125

Chapitre 198: Polices Personnalisées 1127

Examples 1127

Mettre une police personnalisée dans votre application 1127

Initialisation d'une police 1127

Utiliser une police personnalisée dans un TextView 1127

Appliquer la police sur TextView par xml (code Java non requis) 1127

Police personnalisée dans le texte de toile 1128

Chargement de police efficace 1129

Police personnalisée pour toute l'activité 1129

Travailler avec des polices dans Android O 1130

Chapitre 199: Port Mapping en utilisant la bibliothèque Cling dans Android 1132

Examples 1132

Ajout du support Cling à votre projet Android 1132

Mapper un port NAT 1132

Chapitre 200: Processeur d'annotation 1134

Introduction 1134
Examples 1134

@NonNull Annotation 1134

Types d'annotations 1134

Création et utilisation d'annotations personnalisées 1135

Chapitre 201: Programmation Android avec Kotlin 1137

Introduction 1137

Remarques 1137

Examples 1137

Installer le plugin Kotlin 1137

Configurer un projet Gradle existant avec Kotlin 1138

Créer une nouvelle activité Kotlin 1140

Conversion du code Java existant en Kotlin 1142

Commencer une nouvelle activité 1142

Chapitre 202: ProGuard - Obscurcir et réduire votre code 1143

Examples 1143

Règles pour certaines des bibliothèques les plus utilisées 1143

Activer ProGuard pour votre build 1145

Supprimer les instructions de journalisation de trace (et autres) au moment de la générati 1145

Protéger votre code contre les pirates 1146

Activation de ProGuard avec un fichier de configuration d'obscurcissement personnalisé 1147

Chapitre 203: Publier sur Play Store 1149

Examples 1149

Guide de soumission de l'application minimale 1149

Chapitre 204: Publier un fichier .aar sur Apache Archiva avec Gradle 1151

Examples 1151

Exemple d'implémentation simple 1151

Chapitre 205: Publier une bibliothèque dans les référentiels Maven 1153

Examples 1153

Publier un fichier .aar sur Maven 1153

Chapitre 206: Qu'est-ce que ProGuard? Qu'est-ce que l'utilisation dans Android? 1155

Introduction 1155

Examples 1155
Réduisez votre code et vos ressources avec proguard 1155

Chapitre 207: Rapport d'incident de Firebase 1157

Examples 1157

Comment ajouter Firebase Crash Reporting à votre application 1157

Comment signaler une erreur 1158

Chapitre 208: RechercherView 1159

Examples 1159

Appcompat SearchView avec l'observateur RxBindings 1159

SearchView dans la barre d'outils avec fragment 1161

Définition du thème pour SearchView 1163

Chapitre 209: Reconnaissance d'activité 1165

Introduction 1165

Examples 1165

Google Play ActivityRecognitionAPI 1165

Reconnaissance d'activité PathSense 1167

Chapitre 210: RecyclerView 1170

Introduction 1170

Paramètres 1170

Remarques 1170

Autres sujets connexes: 1171

Documentation officielle 1171

Versions plus anciennes: 1171

Examples 1172

Ajouter un RecyclerView 1172

Chargement plus fluide des articles 1173

Glisser-Déposer et Glisser avec RecyclerView 1174

Ajouter en-tête / pied de page à un RecyclerView 1175

Utiliser plusieurs ViewHolders avec ItemViewType 1177

Filtrer les éléments dans RecyclerView avec un SearchView 1179

Menu contextuel avec recyclerView 1179

Animer le changement de données 1181

Exemple utilisant SortedList 1183


RecyclerView avec DataBinding 1185

Défilement sans fin dans Recycleview. 1187

Afficher la vue par défaut jusqu'à ce que les éléments se chargent ou quand les données ne 1188

Ajouter des lignes de séparation aux éléments RecyclerView 1190

Chapitre 211: RecyclerView et LayoutManagers 1193

Examples 1193

GridLayoutManager avec comptage dynamique 1193

Ajout de la vue d'en-tête à recyclerview avec le gestionnaire gridlayout 1195

Liste simple avec LinearLayoutManager 1197

Disposition de l'activité 1197

Définir le modèle de données 1197

Mise en page des éléments de la liste 1198

Créez un adaptateur RecyclerView et ViewHolder 1198

(Générer des données aléatoires) 1200

Connectez le RecyclerView à la PlaceListAdapter et à l'ensemble de données 1200

Terminé! 1201

StaggeredGridLayoutManager 1201

Chapitre 212: RecyclerView onClickListeners 1204

Examples 1204

Nouvel exemple 1204

Kotlin et RxJava exemple 1205

Easy OnLongClick et OnClick Exemple 1206

Démo de l'adaptateur 1207

Item Cliquez sur les auditeurs 1209

Une autre façon d'implémenter un écouteur d'élément 1210

RecyclerView Click auditeur 1212

Chapitre 213: RenderScript 1215

Introduction 1215

Examples 1215

Commencer 1215

Mise en place de votre projet 1215


Comment fonctionne RenderScript 1216

Écrire votre premier script RenderScript 1216

RenderScript Boilerplate 1217

Variables globales 1218

Graines 1218

Noyaux en général 1218

Méthodes de RenderScript Runtime API 1219

Implémentation du noyau 1219

Appeler RenderScript en Java 1220

Les bases 1220

Création d'instances d'allocation 1221

Exemple complet 1222

Conclusion 1223

Flou une image 1224

Flou une vue 1226

BlurBitmapTask.java 1226

Usage: 1227

Chapitre 214: Ressources 1228

Examples 1228

Traduire une chaîne 1228

Définir des chaînes 1229

Définir un tableau de chaînes 1230

Définir les dimensions 1230

Définir des entiers 1231

Définir un tableau d'entiers 1231

Définir les couleurs 1232

Obtenir des ressources sans avertissements "obsolètes" 1233

Définir une ressource de menu et l'utiliser à l'intérieur d'Activité / Fragment 1234

Formatage de chaîne dans strings.xml 1235

Définir une liste d'états de couleurs 1236

Définir des cordes à cordes 1236

Importer un tableau d'objets définis dans les ressources 1237


9 patchs 1239

UN GUIDE SIMPLE À L'APPLICATION 9-PATCH POUR ANDROID UI 18 mai 2011 1240

Niveau de transparence des couleurs (alpha) 1243

Travailler avec le fichier strings.xml 1244

Chapitre 215: Retrofit2 1246

Introduction 1246

Remarques 1246

Examples 1246

Une demande GET simple 1246

Ajouter une journalisation à Retrofit2 1249

Télécharger un fichier via Multipart 1250

Rénovation avec un intercepteur OkHttp 1251

En-tête et corps: un exemple d'authentification 1251

Télécharger plusieurs fichiers à l'aide de l'option Rénovation en plusieurs parties 1252

Télécharger un fichier à partir du serveur à l'aide de Retrofit2 1254

Déboguer avec Stetho 1256

Retrofit 2 Convertisseur Xml personnalisé 1257

Une simple requête POST avec GSON 1259

Lecture de l'URL du formulaire XML avec Retrofit 2 1261

Chapitre 216: Retrofit2 avec RxJava 1264

Examples 1264

Retrofit2 avec RxJava 1264

Mise à niveau avec RxJava pour récupérer les données de manière asynchrone 1265

Exemple de requêtes imbriquées: plusieurs demandes, combiner les résultats 1267

Chapitre 217: RoboGuice 1269

Examples 1269

Exemple simple 1269

Installation pour les projets Gradle 1269

Annotation @ContentView 1269

@InjectResource annotation 1269

Annotation @InjectView 1270

Introduction à RoboGuice 1270


Chapitre 218: Robolectric 1273

Introduction 1273

Examples 1273

Test Robolectric 1273

Configuration 1273

Exécuter avec une classe d'application personnalisée 1273

Définir le SDK cible 1273

Exécuter avec un manifeste personnalisé 1274

Utilisez des qualificatifs 1274

Chapitre 219: Secure SharedPreferences 1275

Introduction 1275

Syntaxe 1275

Paramètres 1275

Remarques 1275

Examples 1275

Sécuriser une préférence partagée 1275

Chapitre 220: Secure SharedPreferences 1277

Introduction 1277

Syntaxe 1277

Paramètres 1277

Remarques 1277

Examples 1277

Sécuriser une préférence partagée 1277

Chapitre 221: Sécurité 1279

Examples 1279

Vérification de la signature de l'application - Détection de sabotage 1279

Chapitre 222: SensorManager 1280

Examples 1280

Récupération des événements de capteur 1280

Transformation du capteur en système de coordonnées mondial 1281

Décidez si votre appareil est statique ou non, en utilisant l'accéléromètre 1281


Chapitre 223: shell adb 1283

Introduction 1283

Syntaxe 1283

Paramètres 1283

Examples 1283

Envoyer du texte, des touches enfoncées et des événements tactiles au périphérique Android 1283

Liste des paquets 1285

Octroi & révocation d'autorisations API 23+ 1285

Imprimer les données d'application 1286

Enregistrement de l'affichage 1286

Modification des autorisations de fichier à l'aide de la commande chmod 1287

Définir la date / heure via adb 1288

Ouvrir les options du développeur 1289

Génération d'une diffusion "Boot Complete" 1289

Afficher le contenu de stockage externe / secondaire 1289

tuer un processus dans un appareil Android 1289

Chapitre 224: Signez votre application Android pour publication 1291

Introduction 1291

Examples 1291

Signer votre application 1291

Configurez le build.gradle avec la configuration de signature 1292

Chapitre 225: Snackbar 1294

Syntaxe 1294

Paramètres 1294

Remarques 1294

Documentation officielle 1294

Examples 1294

Créer un Snackbar simple 1295

Snack Bar Personnalisé 1295

Snackbar avec rappel 1296

Snackbar personnalisé 1296

Snackbar vs Toasts: Lequel dois-je utiliser? 1297


Snackbar personnalisé (vue inutile) 1298

Chapitre 226: Son et média Android 1299

Examples 1299

Comment choisir l'image et la vidéo pour api> 19 1299

Jouer des sons via SoundPool 1300

Chapitre 227: SpannableString 1302

Syntaxe 1302

Examples 1302

Ajouter des styles à un TextView 1302

Multi string, avec multi couleur 1305

Chapitre 228: SQLite 1307

Introduction 1307

Remarques 1307

Examples 1307

Utilisation de la classe SQLiteOpenHelper 1307

Insérer des données dans la base de données 1308

méthode onUpgrade () 1309

Lecture des données d'un curseur 1309

Créer un contrat, une aide et un fournisseur pour SQLite dans Android 1311

Mise à jour d'une ligne dans une table 1315

Effectuer une transaction 1316

Supprimer les lignes de la table 1316

Stocker l'image dans SQLite 1317

Créer une base de données à partir du dossier des ressources 1319

Exportation et importation d'une base de données 1321

Insert en vrac 1322

Chapitre 229: Stockage de fichiers dans le stockage interne et externe 1324

Syntaxe 1324

Paramètres 1324

Examples 1324

Utilisation du stockage interne 1324

Utilisation du stockage externe 1325


Android: Stockage interne et externe - Clarification de la terminologie 1326

Enregistrer la base de données sur la carte SD (Backup DB on SD) 1331

Récupérer le répertoire du périphérique: 1332

Chapitre 230: Stratégie de mode strict: outil permettant de détecter le bogue lors de la c 1335

Introduction 1335

Remarques 1335

Examples 1335

Le code ci-dessous sert à configurer le StrictMode for Thread Policies. Ce code doit être 1335

Le code ci-dessous traite des fuites de mémoire, comme il détecte lorsque dans SQLLite la 1335

Chapitre 231: Studio Android 1336

Examples 1336

Filtrer les journaux de l'interface utilisateur 1336

Créer une configuration de filtres 1337

Couleurs personnalisées du message logcat en fonction de l'importance du message 1339

Activer / désactiver la copie de ligne vide 1340

Raccourcis utiles pour Android Studio 1341

Android Studio Améliorez les performances 1343

Configurer Android Studio 1344

Afficher et ajouter des raccourcis dans Android Studio 1344

Le projet de construction de Gradle prend une éternité 1345

Créer un dossier d'actifs 1346

Chapitre 232: SyncAdapter avec régulièrement synchroniser les données 1348

Introduction 1348

Examples 1348

Adaptateur de synchronisation avec chaque minute demandant la valeur du serveur. 1348

Chapitre 233: Synchronisation des données avec l'adaptateur de synchronisation 1358

Examples 1358

Adaptateur de synchronisation factice avec fournisseur de stub 1358

Chapitre 234: TabLayout 1364

Examples 1364

Utiliser un TabLayout sans ViewPager 1364

Chapitre 235: Temps Utils 1365


Examples 1365

Convertir le format de date en millisecondes 1365

Pour vérifier dans une période 1366

GetCurrentRealTime 1366

Chapitre 236: TensorFlow 1368

Introduction 1368

Remarques 1368

Examples 1368

Comment utiliser 1368

Chapitre 237: Test d'interface utilisateur inter-app avec UIAutomator 1370

Syntaxe 1370

Remarques 1370

Examples 1370

Préparez votre projet et écrivez le premier test UIAutomator 1370

Rédiger des tests plus complexes à l'aide de UIAutomatorViewer 1371

Création d'une suite de tests de tests UIAutomator 1372

Chapitre 238: Test de l'interface utilisateur avec Espresso 1373

Remarques 1373

Expresso 1373

Dépannage 1373

Examples 1373

Configurer Espresso 1373

Créer une classe de test expresso 1374

Ouvrir Fermer DrawerLayout 1374

Test de l'interface utilisateur simple expresso 1375

Outils de test de l'interface utilisateur 1375

Comment ajouter du café au projet 1376

Configuration de l'appareil 1377

Écrire le test 1378

La navigation 1380

Effectuer une action sur une vue 1380

Trouver une vue avec onView 1381


Espresso personnalisés 1381

Espresso globale 1383

Entrer du texte dans EditText 1385

Effectuez Cliquez sur Afficher 1385

La vue de vérification est affichée 1385

Grouper une collection de classes de test dans une suite de tests 1385

Chapitre 239: Tests unitaires sous Android avec JUnit 1387

Remarques 1387

Examples 1387

Créer des tests unitaires locaux 1387

Exemple de classe de test 1387

Panne 1387

Astuce Créez rapidement des classes de test dans Android Studio 1388

Astuce Exécuter facilement des tests dans Android Studio 1388

Déplacement de la logique métier hors des composants Android 1389

Démarrer avec JUnit 1391

Installer 1391

Écrire un test 1392

Lancer un test 1393

Des exceptions 1394

Import statique 1395

Chapitre 240: Text to Speech (TTS) 1397

Examples 1397

Base texte-parole 1397

Implémentation de TextToSpeech sur les API 1399

Chapitre 241: TextInputLayout 1402

Introduction 1402

Remarques 1402

Examples 1402

Utilisation de base 1402

Gestion des erreurs 1402

Ajouter un compte de caractères 1403


La visibilité du mot de passe bascule 1403

TextInputEditText 1404

Personnalisation de l'apparence de TextInputLayout 1404

Chapitre 242: Thème DayNight (AppCompat v23.2 / API 14+) 1406

Examples 1406

Ajout du thème DayNight à une application 1406

Chapitre 243: Thème, Style, Attribut 1408

Examples 1408

Utiliser un thème personnalisé à l'échelle mondiale 1408

Définir les couleurs primaires, primaires et d'accentuation 1408

Utiliser un thème personnalisé par activité 1408

Couleur Overscroll (API 21+) 1409

Couleur d'ondulation (API 21+) 1409

Barre d'état de la lumière (API 23+) 1409

Barres de navigation et d'état translucides (API 19+) 1410

Couleur de la barre de navigation (API 21+) 1410

Héritage thématique 1410

Plusieurs thèmes dans une application 1411

changer de thème pour toutes les activités à la fois 1412

Chapitre 244: Tiroirs 1414

Examples 1414

Teinte à dessiner 1414

Make View avec des coins arrondis 1414

Vue circulaire 1415

Personnalisable 1416

Chapitre 245: Touch Events 1419

Examples 1419

Comment varier entre les événements tactiles des groupes de vues enfants et parents 1419

Chapitre 246: TransitionDrawable 1423

Examples 1423

Ajouter une transition ou un fondu enchaîné entre deux images. 1423

Étape 1: Créer une transition pouvant être dessinée en XML 1423


Étape 2: Ajoutez du code pour ImageView dans votre mise en page XML pour afficher le dessi 1423

Étape 3: Accédez à la transition XML pouvant être dessinée dans la méthode onCreate () de 1423

Animer la couleur d'arrière-plan des vues (couleur de commutation) avec TransitionDrawable 1424

Chapitre 247: Transitions d'éléments partagés 1425

Introduction 1425

Syntaxe 1425

Examples 1425

Transition d'éléments partagés entre deux fragments 1425

Chapitre 248: Un service 1428

Introduction 1428

Remarques 1428

Examples 1428

Démarrer un service 1428

Cycle de vie d'un service 1428

Définir le processus d'un service 1429

Création d'un service lié avec l'aide du classeur 1430

Créer un service à distance (via AIDL) 1431

Créer un service non lié 1433

Chapitre 249: URL de rappel 1436

Examples 1436

Exemple d'URL de rappel avec Instagram OAuth 1436

Chapitre 250: Validation du courrier électronique 1437

Examples 1437

Validation de l'adresse email 1437

Validation de l'adresse e-mail à l'aide de Patterns 1437

Chapitre 251: VectorDrawable et AnimatedVectorDrawable 1438

Examples 1438

Basic VectorDrawable 1438

En utilisant 1438

Mots clés 1439

AnimatedVectorDrawable de base 1440

Utiliser des traits 1441


Compatibilité vectorielle via AppCompat 1443

Chapitre 252: Vérifier la connexion de données 1445

Examples 1445

Vérifier la connexion de données 1445

Vérifier la connexion à l'aide de ConnectivityManager 1445

Utiliser les intentions du réseau pour effectuer des tâches tant que les données sont auto 1445

Chapitre 253: Vérifiez la connectivité Internet 1447

Introduction 1447

Syntaxe 1447

Paramètres 1447

Remarques 1447

Examples 1447

Vérifiez si l'appareil est connecté à Internet 1447

Comment vérifier la force du réseau dans Android? 1448

Comment vérifier la force du réseau 1448

Chapitre 254: Versions Android 1452

Remarques 1452

Examples 1453

Vérification de la version Android sur l'appareil au moment de l'exécution 1453

Chapitre 255: Versions du SDK de projet 1455

Introduction 1455

Paramètres 1455

Remarques 1455

Examples 1456

Définition des versions du SDK du projet 1456

Chapitre 256: Vibration 1457

Examples 1457

Démarrer avec Vibration 1457

Vibrer indéfiniment 1457

Motifs de vibration 1457

Arrêter Vibrer 1458

Vibrer pendant une fois 1458


Chapitre 257: VideoView 1459

Examples 1459

VideoView Créer 1459

Lire une vidéo à partir d'une URL à l'aide de VideoView 1459

Chapitre 258: VideoView optimisé 1461

Introduction 1461

Examples 1461

VideoView optimisée dans ListView 1461

Chapitre 259: ViewFlipper 1473

Introduction 1473

Examples 1473

ViewFlipper avec image glissant 1473

Chapitre 260: ViewPager 1475

Introduction 1475

Remarques 1475

Examples 1475

Utilisation de base de ViewPager avec des fragments 1475

ViewPager avec TabLayout 1477

ViewPager avec PreférenceFragment 1479

Ajouter un ViewPager 1480

ViewPager avec un indicateur de points 1481

Onglet imbriquéMise en forme dans ViewPager 1482

TabLayout séparé 1482

selected_dot.xml 1482

default_dot.xml 1483

tab_selector.xml 1483

Configuration de OnPageChangeListener 1483

Chapitre 261: voie rapide 1485

Remarques 1485

Examples 1485

Fastfile pour créer et télécharger plusieurs versions de Beta par Crashlytics 1485
Ligne Fastfile pour créer et installer toutes les versions d'un type de construction donné 1488

Chapitre 262: Voir Calculs Dimensions 1489

Remarques 1489

Examples 1489

Calcul des dimensions de vue initiales dans une activité 1489

Chapitre 263: Volée 1491

Introduction 1491

Syntaxe 1491

Remarques 1491

Installation 1491

Documentation officielle 1491

Examples 1492

Basic StringRequest en utilisant la méthode GET 1492

Annuler une demande 1492

Ajout d'attributs de conception personnalisés à NetworkImageView 1493

Demander JSON 1494

Ajouter des en-têtes personnalisés à vos requêtes [par exemple pour l'authentification de 1494

Classe d'assistance pour gérer les erreurs de volley 1495

Authentification du serveur distant à l'aide de StringRequest via la méthode POST 1497

Utiliser Volley pour les requêtes HTTP 1498

Réponse booléenne variable du serveur avec demande json dans volley 1500

Utiliser JSONArray comme corps de requête 1501

Chapitre 264: WebView 1503

Introduction 1503

Remarques 1503

Examples 1503

Dialogues d'alerte JavaScript dans WebView - Comment les faire fonctionner 1503

Communication de Javascript vers Java (Android) 1503

Communication de Java à Javascript 1505

Ouvrir un exemple de numéroteur 1505

Dépannage de WebView en imprimant des messages de console ou par le débogage à distance 1506

Impression des messages de la console Webview dans logcat 1506


Débogage à distance des appareils Android avec Chrome 1506

Activer le débogage USB sur votre appareil Android 1506

Connectez et découvrez votre appareil Android 1507

Ouvrir un fichier local / Créer un contenu dynamique dans Webview 1507

Chapitre 265: Widgets 1508

Remarques 1508

Examples 1508

Déclaration Manifeste - 1508

Métadonnées 1508

Classe AppWidgetProvider 1508

Deux widgets avec une déclaration de mise en page différente 1509

Créer / intégrer un widget de base en utilisant Android Studio 1510

Droit sur votre application ==> Nouveau ==> Widget ==> Widget App 1510

Chapitre 266: XMPP s'inscrire à la session et à chatter exemple simple 1512

Examples 1512

Exemple d'enregistrement de base et de chat d'enregistrement XMPP 1512

Chapitre 267: Xposed 1521

Examples 1521

Créer un module Xposed 1521

Accrocher une méthode 1521

Chapitre 268: Youtube-API 1524

Remarques 1524

Examples 1524

Lancer StandAlonePlayerActivity 1524

Activité prolongeant YouTubeBaseActivity 1524

YoutubePlayerFragment dans Portrait Activty 1525

API du lecteur YouTube 1528

Consommer YouTube Data API sur Android 1530

Crédits 1534
À propos
You can share this PDF with anyone you feel could benefit from it, downloaded the latest version
from: android

It is an unofficial and free Android ebook created for educational purposes. All the content is
extracted from Stack Overflow Documentation, which is written by many hardworking individuals at
Stack Overflow. It is neither affiliated with Stack Overflow nor official Android.

The content is released under Creative Commons BY-SA, and the list of contributors to each
chapter are provided in the credits section at the end of this book. Images may be copyright of
their respective owners unless otherwise specified. All trademarks and registered trademarks are
the property of their respective company owners.

Use the content presented in this book at your own risk; it is not guaranteed to be correct nor
accurate, please send your feedback and corrections to [email protected]

https://riptutorial.com/fr/home 1
Chapitre 1: Démarrer avec Android
Remarques
Si vous souhaitez en savoir plus sur le paramètre Android Gradle Plugin, consultez la
documentation android-gradle .

Si vous êtes intéressé par les émulateurs alternatifs, vous pouvez regarder Genymotion . Il fournit
un plan gratuit et nécessite moins de RAM.

Versions

Version Niveau API Code de version Date de sortie

1.0 1 BASE 2008-09-23

1.1 2 BASE_1_1 2009-02-09

1,5 3 CUPCAKE 2009-04-27

1.6 4 DONUT 2009-09-15

2.0 5 ECLAIR 2009-10-26

2.0.1 6 ECLAIR_0_1 2009-12-03

2.1.x 7 ECLAIR_MR1 2010-01-12

2.2.x 8 FROYO 2010-05-20

2.3 9 GINGERBREAD 2010-12-06

2.3.3 dix GINGERBREAD_MR1 2011-02-09

3.0.x 11 HONEYCOMB 2011-02-22

3.1.x 12 HONEYCOMB_MR1 2011-05-10

3.2.x 13 HONEYCOMB_MR2 2011-07-15

4.0 14 ICE_CREAM_SANDWICH 2011-10-18

4.0.3 15 ICE_CREAM_SANDWICH_MR1 2011-12-16

4.1 16 JELLY_BEAN 2012-07-09

4.2 17 JELLY_BEAN_MR1 2012-11-13

https://riptutorial.com/fr/home 2
Version Niveau API Code de version Date de sortie

4.3 18 JELLY_BEAN_MR2 2013-07-24

4.4 19 KITKAT 2013-10-31

4.4W 20 KITKAT_WATCH 2014-06-25

5.0 21 LOLLIPOP 2014-11-12

5.1 22 LOLLIPOP_MR1 2015-03-09

6,0 23 M (guimauve) 2015-10-05

7.0 24 N (Nougat) 2016-08-22

7.1 25 N_MR1 (Nougat MR1) 2016-10-04

8.0 26 O (Aperçu du développeur 4) 2017-07-24

Examples
Configurer Android Studio

Android Studio est l'IDE de développement Android officiellement pris en charge et recommandé
par Google. Android Studio est fourni avec Android SDK Manager , un outil permettant de
télécharger les composants du Android SDK requis pour commencer à développer des applications.

Installation des outils Android Studio et Android SDK :

1. Téléchargez et installez Android Studio .


2. Téléchargez les outils SDK et les outils de plate-forme SDK les plus récents en ouvrant
Android Studio, puis en suivant les instructions de mise à jour de l'outil SDK Android . Vous
devez installer les derniers packages stables disponibles.

Si vous avez besoin de travailler sur d'anciens projets construits à l'aide d'anciennes
versions de SDK, vous devrez peut-être également télécharger ces versions

Depuis Android Studio 2.2, une copie de la dernière OpenJDK est fournie avec l’installation et est
le JDK (Java Development Kit) recommandé pour tous les projets Android Studio. Cela supprime
la nécessité d'installer le package JDK d'Oracle. Pour utiliser le SDK fourni, procédez comme suit:

1. Ouvrez votre projet dans Android Studio et sélectionnez Fichier> Structure du projet dans
la barre de menus.
2. Dans la page Emplacement du SDK et sous JDK , cochez la case Utiliser le JDK intégré .
3. Cliquez sur OK .

Configurer Android Studio

https://riptutorial.com/fr/home 3
Android Studio permet d'accéder à deux fichiers de configuration via le menu Aide :

• studio.vmoptions : personnalisez les options de la machine virtuelle Java (JVM) de Studio,


telles que la taille du tas et la taille du cache. Notez que sur les machines Linux, ce fichier
peut être nommé studio64.vmoptions , selon votre version d'Android Studio.
• idea.properties : personnalise les propriétés d'Android Studio, telles que le chemin du
dossier des plug-ins ou la taille de fichier maximale prise en charge.

Changer / ajouter un thème


Vous pouvez le changer selon vos préférences. File->Settings->Editor->Colors & Fonts-> et
sélectionnez un thème.Vous pouvez également télécharger de nouveaux thèmes à partir de
http://color-themes.com/ Une fois que vous avez téléchargé le fichier .jar.zip , allez dans File ->
Import Settings... et choisissez le fichier téléchargé.

Compiler les applications


Créez un nouveau projet ou ouvrez un projet existant dans Android Studio et appuyez sur le
bouton de lecture vert dans la barre d'outils supérieure pour l'exécuter. S'il est gris, vous
devez attendre une seconde pour permettre à Android Studio d'indexer correctement certains
fichiers, dont la progression est visible dans la barre d'état inférieure.

Si vous souhaitez créer un projet à partir du shell, vérifiez que vous disposez d'un fichier
local.properties créé automatiquement par Android Studio. Si vous devez créer le projet sans
Android Studio, vous avez besoin d'une ligne commençant par sdk.dir= suivi du chemin d'accès à
votre installation SDK.

Ouvrez un shell et accédez au répertoire du projet. Entrez ./gradlew aR et appuyez sur Entrée. aR
est un raccourci pour assembleRelease , qui télécharge toutes les dépendances pour vous et
construit l'application. Le fichier APK final sera dans ProjectName/ModuleName/build/outputs/apk et
s'appellera ModuleName-release.apk .

Créer un nouveau projet

Configurer Android Studio


Commencez par configurer Android Studio , puis ouvrez-le. Maintenant, vous êtes prêt à créer
votre première application Android!

Remarque: ce guide est basé sur Android Studio 2.2, mais le processus sur les autres
versions est essentiellement le même.

Configurez votre projet

https://riptutorial.com/fr/home 4
Configuration de base
Vous pouvez démarrer un nouveau projet de deux manières:

• Cliquez sur Start a New Android Studio Project partir de l'écran d'accueil.
• Accédez à File → New Project si un projet est déjà ouvert.

Ensuite, vous devez décrire votre application en remplissant certains champs:

1. Nom de l'application - Ce nom sera affiché à l'utilisateur.

Exemple: Hello World . Vous pouvez toujours le modifier ultérieurement dans le fichier
AndroidManifest.xml .

2. Domaine de la société - Il s'agit du qualificatif correspondant au nom du package de votre


projet.

Exemple: stackoverflow.com .

3. Nom du package (aka applicationId ) - Ceci est le nom du package de projet complet.

Il doit suivre la notation inversée des noms de domaine ( DNS inversé ): domaine de premier
niveau . Compagnie Domaine. [ Segment de la société . ] Nom de l'application .

Exemple: com.stackoverflow.android.helloworld ou com.stackoverflow.helloworld . Vous


pouvez toujours modifier votre application en la remplaçant dans votre fichier de graduation .

N'utilisez pas le préfixe par défaut "com.example" sauf si vous n'avez pas l'intention de
soumettre votre application au Google Play Store. Le nom du package sera votre
application unique dans Google Play.

4. Emplacement du projet - C'est le répertoire dans lequel votre projet sera stocké.

https://riptutorial.com/fr/home 5
https://riptutorial.com/fr/home 6
Graphique des distributions de versions Android actuelles, affichées lorsque vous cliquez sur
Aidez-moi à choisir.

La fenêtre Distribution de plate-forme Android affiche la distribution des appareils mobiles


exécutant chaque version d'Android, comme illustré à la Figure 2. Cliquez sur un niveau d'API
pour afficher la liste des fonctionnalités introduites dans la version correspondante d'Android. Cela
vous aide à choisir le niveau minimum d'API doté de toutes les fonctionnalités dont vos
applications ont besoin pour pouvoir accéder à autant de périphériques que possible. Puis cliquez
sur OK .

Maintenant, choisissez les plates-formes et la version du SDK Android que l'application prendra
en charge.

https://riptutorial.com/fr/home 7
https://riptutorial.com/fr/home 8
Google Play Store pour déterminer les périphériques sur lesquels une application peut être
installée. Par exemple, l'application Stack Exchange prend en charge Android 4.1+.

Android Studio vous indiquera (approximativement) quel pourcentage d'appareils sera pris en
charge, compte tenu du SDK minimum spécifié.

Les niveaux inférieurs de l'API ciblent davantage de périphériques mais disposent de


moins de fonctionnalités.

Lorsque vous décidez du kit SDK minimum , vous devez tenir compte des statistiques de
Dashboards , qui vous donneront des informations sur la version des appareils ayant visité le
Google Play Store au cours de la dernière semaine.

De: Dashboards sur le site Web des développeurs Android.

Ajouter une activité


Nous allons maintenant sélectionner une activité par défaut pour notre application. Dans Android,
une Activity est un écran unique qui sera présenté à l'utilisateur. Une application peut héberger
plusieurs activités et naviguer entre elles. Pour cet exemple, choisissez Empty Activity et cliquez
sur Suivant.

https://riptutorial.com/fr/home 9
Ici, si vous le souhaitez, vous pouvez changer le nom de l'activité et de la mise en page. Une
bonne pratique consiste à conserver l' Activity comme suffixe pour le nom de l'activité et
activity_ comme préfixe pour le nom de la mise en page. Si nous les laissons par défaut, Android
Studio générera pour nous une activité appelée MainActivity et un fichier de mise en page appelé
activity_main . Maintenant, cliquez sur Finish .

Android Studio créera et configurera notre projet, ce qui peut prendre un certain temps en fonction
du système.

Inspection du projet
Pour comprendre comment fonctionne Android, jetons un coup d’œil à certains fichiers créés pour
nous.

Sur le volet gauche d'Android Studio, nous pouvons voir la structure de notre application Android .

Tout d'abord, ouvrons AndroidManifest.xml en double-cliquant dessus. Le fichier manifeste Android


décrit certaines des informations de base sur une application Android. Il contient la déclaration de
nos activités, ainsi que des composants plus avancés.

Si une application a besoin d'accéder à une fonctionnalité protégée par une autorisation, elle doit
déclarer qu'elle requiert cette autorisation avec un élément <uses-permission> dans le manifeste.

https://riptutorial.com/fr/home 10
Ensuite, lorsque l'application est installée sur le périphérique, le programme d'installation
détermine s'il convient ou non d'accorder l'autorisation demandée en vérifiant les autorités ayant
signé les certificats de l'application et, dans certains cas, en demandant à l'utilisateur. Une
application peut également protéger ses propres composants (activités, services, récepteurs de
diffusion et fournisseurs de contenu) avec des autorisations. Il peut utiliser l'une des autorisations
définies par Android (répertoriées dans android.Manifest.permission) ou déclarées par d'autres
applications. Ou il peut définir les siens.

<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stackoverflow.helloworld">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
</application>
</manifest>

Ensuite, ouvrons activity_main.xml qui se trouve dans app/src/main/res/layout/ . Ce fichier


contient des déclarations pour les composants visuels de notre MainActivity. Vous verrez le
concepteur visuel. Cela vous permet de faire glisser et de déposer des éléments sur la mise en
page sélectionnée.

Vous pouvez également basculer vers le concepteur de mise en page XML en cliquant sur "Texte"
en bas de Android Studio, comme illustré ici:

https://riptutorial.com/fr/home 11
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.stackexchange.docs.helloworld.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>

Vous verrez un widget appelé TextView dans cette présentation, avec la propriété android:text
définie sur "Hello World!". Ceci est un bloc de texte qui sera affiché à l'utilisateur lors de
l'exécution de l'application.

Vous pouvez en savoir plus sur les mises en page et les attributs .

Ensuite, regardons MainActivity . C'est le code Java qui a été généré pour MainActivity .

public class MainActivity extends AppCompatActivity {

// The onCreate method is called when an Activity starts


// This is where we will set up our layout
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// setContentView sets the Activity's layout to a specified XML layout

https://riptutorial.com/fr/home 12
// In our case we are using the activity_main layout
setContentView(R.layout.activity_main);
}
}

Comme défini dans notre manifeste Android, MainActivity sera lancé par défaut lorsqu'un
utilisateur lance l'application HelloWorld .

Enfin, ouvrez le fichier nommé build.gradle situé dans app/ .


Android Studio utilise le système de génération Gradle pour compiler et créer des applications et
des bibliothèques Android.

apply plugin: 'com.android.application'

android {
signingConfigs {
applicationName {
keyAlias 'applicationName'
keyPassword 'password'
storeFile file('../key/applicationName.jks')
storePassword 'anotherPassword'
}
}
compileSdkVersion 26
buildToolsVersion "26.0.0"

defaultConfig {
applicationId "com.stackexchange.docs.helloworld"
minSdkVersion 16
targetSdkVersion 26
versionCode 1
versionName "1.0"
signingConfig signingConfigs.applicationName
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}

dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:26.0.0'
}

Ce fichier contient des informations sur la version et la version de votre application. Vous pouvez
également l'utiliser pour ajouter des dépendances à des bibliothèques externes. Pour l'instant,
n'apportons aucune modification.

Il est conseillé de toujours sélectionner la dernière version disponible pour les dépendances:

• buildToolsVersion : 26.0.0
• com.android.support:appcompat-v7 : 26.0.0 (juillet 2017)

https://riptutorial.com/fr/home 13
• base de feu : 11.0.4 (août 2017)

compileSdkVersion

compileSdkVersion est votre façon de dire à Gradle quelle version du SDK Android compiler votre
application. L'utilisation du nouveau SDK Android est une exigence pour utiliser l'une des
nouvelles API ajoutées à ce niveau.

Il convient de souligner que la modification de votre compileSdkVersion ne modifie pas le


comportement à l'exécution. Bien que de nouveaux avertissements / erreurs du compilateur
puissent être présents lors du changement de votre compileSdkVersion , votre compileSdkVersion
n'est pas inclus dans votre APK: il est purement utilisé au moment de la compilation.

Par conséquent, il est fortement recommandé de toujours compiler avec le dernier SDK. Vous
obtiendrez tous les avantages des nouvelles vérifications de compilation sur le code existant,
éviterez les API récemment obsolètes et serez prêt à utiliser de nouvelles API.

minSdkVersion

Si compileSdkVersion définit les dernières API disponibles, minSdkVersion est la limite inférieure de
votre application. minSdkVersion est l'un des signaux utilisés par Google Play Store pour déterminer
sur quel périphérique d'un utilisateur une application peut être installée.

Il joue également un rôle important pendant le développement: par défaut, les linteaux contre
votre projet vous avertissent lorsque vous utilisez des API au-dessus de votre minSdkVersion , vous
aidant ainsi à éviter le problème d'exécution d'une API inexistante. La vérification de la version du
système à l'exécution est une technique courante lors de l'utilisation des API uniquement sur les
versions de plate-forme plus récentes.

targetSdkVersion

targetSdkVersion est la méthode principale targetSdkVersion Android pour targetSdkVersion la


targetSdkVersion la targetSdkVersion n'appliquant pas les changements de comportement à moins
que targetSdkVersion soit mis à jour. Cela vous permet d'utiliser de nouvelles API avant de
modifier les comportements. La mise à jour pour cibler le dernier SDK devrait être une priorité
élevée pour chaque application. Cela ne signifie pas que vous devez utiliser chaque nouvelle
fonctionnalité introduite, ni mettre à jour aveuglément votre targetSdkVersion sans le tester.

targetSDKVersion est la version d'Android qui constitue la limite supérieure des outils disponibles.
Si targetSDKVersion est inférieur à 23, l'application n'a pas besoin de demander des autorisations
à l'exécution pour une instance, même si l'application est exécutée sur API 23+.
TargetSDKVersion n'empêche pas les versions Android au-dessus de la version Android
sélectionnée d'exécuter l'application.

Vous pouvez trouver plus d'informations sur le plugin Gradle:

• Un exemple de base
• Introduction au plugin Gradle pour Android et au wrapper
• Introduction à la configuration des méthodes build.gradle et DSL

https://riptutorial.com/fr/home 14
Exécution de l'application
Maintenant, exécutons notre application HelloWorld. Vous pouvez soit exécuter un appareil virtuel
Android (que vous pouvez configurer en utilisant le Gestionnaire AVD dans Android Studio,
comme décrit dans l'exemple ci-dessous) ou connecter votre propre appareil Android via un câble
USB.

Configurer un appareil Android


Pour exécuter une application à partir d'Android Studio sur votre appareil Android, vous devez
activer le USB Debugging dans les Developer Options du Developer Options dans les paramètres de
votre appareil.

Settings > Developer options > USB debugging

Si les Developer Options ne sont pas visibles dans les paramètres, accédez à About Phone et
appuyez sur le Build Number sept fois. Cela permettra aux Developer Options de s'afficher dans vos
paramètres.

Settings > About phone > Build number

Vous devrez peut-être également modifier la configuration de build.gradle pour build.gradle une
version de votre périphérique.

Exécution depuis Android Studio


Cliquez sur le bouton vert Run dans la barre d'outils située en haut de Android Studio. Dans la
fenêtre qui apparaît, sélectionnez le périphérique sur lequel vous souhaitez exécuter l'application
(démarrez un périphérique virtuel Android si nécessaire ou reportez-vous à la section
Configuration d'un périphérique virtuel Android si vous devez en configurer un), puis cliquez sur OK
.

Sur les appareils fonctionnant sous Android 4.4 (KitKat) et éventuellement plus haut, une fenêtre
contextuelle apparaîtra pour autoriser le débogage USB. Cliquez sur OK pour accepter.

L'application va maintenant installer et exécuter sur votre appareil Android ou émulateur.

Emplacement du fichier APK


Lorsque vous préparez votre application pour la publication, vous configurez, créez et testez une

https://riptutorial.com/fr/home 15
version finale de votre application. Les tâches de configuration sont simples et impliquent des
tâches de base de nettoyage du code et de modification du code qui permettent d'optimiser votre
application. Le processus de génération est similaire au processus de génération de débogage et
peut être effectué à l'aide des outils JDK et Android SDK. Les tâches de test servent de
vérification finale, garantissant que votre application fonctionne comme prévu dans des conditions
réelles. Lorsque vous avez terminé de préparer votre demande de publication, vous disposez d'un
fichier APK signé, que vous pouvez distribuer directement aux utilisateurs ou distribuer via un
marché d'applications tel que Google Play.

Studio Android

Puisque dans les exemples ci-dessus, Gradle est utilisé, l'emplacement du fichier APK généré est:
<Your Project Location>/app/build/outputs/apk/app-debug.apk

IntelliJ

Si vous utilisez IntelliJ avant de passer à Studio et importez directement votre projet IntelliJ, rien
n'a changé. L'emplacement de la sortie sera le même sous:

out/production/...

Note: ceci deviendra parfois obsolète autour de 1.0

Éclipse

Si vous importez directement le projet Android Eclipse, ne le faites pas! Dès que vous avez des
dépendances dans votre projet (jars ou projets de bibliothèque), cela ne fonctionnera pas et votre
projet ne sera pas correctement configuré. Si vous n'avez pas de dépendances, l'apk se trouverait
au même endroit que vous le trouveriez dans Eclipse:

bin/...

Programmation Android sans IDE

Voici un exemple minimaliste de Hello World qui utilise uniquement les outils Android les plus
élémentaires.

Exigences et hypothèses
• Oracle JDK 1.7 ou version ultérieure
• Android SDK Tools (juste les outils de ligne de commande )

Cet exemple suppose que Linux. Vous devrez peut-être ajuster la syntaxe de votre propre plate-
forme.

Configuration du SDK Android


https://riptutorial.com/fr/home 16
Après avoir déballé la version du SDK:

1. Installez des packages supplémentaires à l'aide du gestionnaire du SDK. N'utilisez pas la


android update sdk --no-ui comme indiqué dans le fichier Readme.txt fourni; Il télécharge
environ 30 Go de fichiers inutiles. Au lieu de cela, utilisez le gestionnaire de SDK interactif
android sdk pour obtenir le minimum recommandé de paquets.

2. Ajoutez les répertoires JDK et SDK suivants à votre exécution PATH. Ceci est facultatif,
mais les instructions ci-dessous l'assument.

• JDK / bin
• SDK / platform-tools
• SDK / outils
• SDK / build-tools / LATEST (tel qu'installé à l'étape 1)

3. Créez un périphérique virtuel Android. Utilisez le gestionnaire AVD interactif ( android avd ).
Vous devrez peut-être bricoler un peu et chercher des conseils; les instructions sur site ne
sont pas toujours utiles.

(Vous pouvez également utiliser votre propre appareil)

4. Exécutez le périphérique:

emulator -avd DEVICE

5. Si l'écran de l'appareil semble être verrouillé, faites-le glisser pour le déverrouiller.

Laissez-le fonctionner pendant que vous codez l'application.

Coder l'application
6. Passez à un répertoire de travail vide.

7. Faites le fichier source:

mkdir --parents src/dom/domain


touch src/dom/domain/SayingHello.java

Contenu:

package dom.domain;
import android.widget.TextView;

public final class SayingHello extends android.app.Activity


{
protected @Override void onCreate( final android.os.Bundle activityState )
{
super.onCreate( activityState );
final TextView textV = new TextView( SayingHello.this );

https://riptutorial.com/fr/home 17
textV.setText( "Hello world" );
setContentView( textV );
}
}

8. Ajouter un manifeste:

touch AndroidManifest.xml

Contenu:

<?xml version='1.0'?>
<manifest xmlns:a='http://schemas.android.com/apk/res/android'
package='dom.domain' a:versionCode='0' a:versionName='0'>
<application a:label='Saying hello'>
<activity a:name='dom.domain.SayingHello'>
<intent-filter>
<category a:name='android.intent.category.LAUNCHER'/>
<action a:name='android.intent.action.MAIN'/>
</intent-filter>
</activity>
</application>
</manifest>

9. Créez un sous-répertoire pour les ressources déclarées:

mkdir res

Laissez le vide pour le moment.

Construire le code
10. Générez la source pour les déclarations de ressources. Remplacez ici le chemin d'accès
correct à votre SDK et l' API installée pour la construire (par exemple "android-23"):

aapt package -f \
-I SDK/platforms/android-API/android.jar \
-J src -m \
-M AndroidManifest.xml -S res -v

Les déclarations de ressources (décrites ci-dessous) sont facultatives. Pendant ce temps,


l'appel ci-dessus ne fait rien si res / est toujours vide.

11. Compilez le code source en bytecode Java (.java → .class):

javac \
-bootclasspath SDK/platforms/android-API/android.jar \
-classpath src -source 1.7 -target 1.7 \
src/dom/domain/*.java

https://riptutorial.com/fr/home 18
12. Traduire le bytecode de Java en Android (.class → .dex):

En utilisant d'abord Jill (.class → .jayce):

java -jar SDK/build-tools/LATEST/jill.jar \


--output classes.jayce src

Puis Jack (.jayce → .dex):

java -jar SDK/build-tools/LATEST/jack.jar \


--import classes.jayce --output-dex .

Android bytecode s'appelait auparavant "Dalvik executable code", et donc "dex".

Vous pouvez remplacer les étapes 11 et 12 par un seul appel à Jack si vous le souhaitez; il
peut compiler directement depuis le source Java (.java → .dex). Mais la compilation avec
javac présente des avantages. C'est un outil mieux connu, mieux documenté et plus
largement applicable.

13. Emballez les fichiers de ressources, y compris le manifeste:

aapt package -f \
-F app.apkPart \
-I SDK/platforms/android-API/android.jar \
-M AndroidManifest.xml -S res -v

Cela se traduit par un fichier APK partiel (package d'application Android).

14. Créez le fichier APK complet à l'aide de l'outil ApkBuilder :

java -classpath SDK/tools/lib/sdklib.jar \


com.android.sdklib.build.ApkBuilderMain \
app.apkUnalign \
-d -f classes.dex -v -z app.apkPart

Il avertit, "CET OUTIL EST PÉRIMÉ. Voir --help pour plus d'informations." Si --help échoue
avec une ArrayIndexOutOfBoundsException , ne transmettez pas les arguments à la place:

java -classpath SDK/tools/lib/sdklib.jar \


com.android.sdklib.build.ApkBuilderMain

Il explique que l'interface de ligne de commande ( ApkBuilderMain ) est déconseillée au lieu


d'appeler directement l'API Java ( ApkBuilder ). (Si vous savez comment faire cela depuis la
ligne de commande, veuillez mettre à jour cet exemple.)

15. Optimiser l'alignement des données de l'APK ( pratique recommandée ):

zipalign -f -v 4 app.apkUnalign app.apk

https://riptutorial.com/fr/home 19
Installation et exécution
16. Installez l'application sur l'appareil Android:

adb install -r app.apk

17. Démarrez l'application:

adb shell am start -n dom.domain/.SayingHello

Il devrait courir et dire bonjour.

C'est tout. C'est ce qu'il faut pour dire bonjour en utilisant les outils Android de base.

Déclaration d'une ressource


Cette section est facultative. Les déclarations de ressources ne sont pas nécessaires pour une
application simple "bonjour monde". Si elles ne sont pas nécessaires pour votre application, vous
pouvez simplifier quelque peu la construction en omettant l'étape 10 et en supprimant la référence
au répertoire res / de l'étape 13.

Sinon, voici un bref exemple de la façon de déclarer une ressource et de la référencer.

18. Ajoutez un fichier de ressources:

mkdir res/values
touch res/values/values.xml

Contenu:

<?xml version='1.0'?>
<resources>
<string name='appLabel'>Saying hello</string>
</resources>

19. Référencez la ressource à partir du manifeste XML. Ceci est un style de référence déclaratif:

<!-- <application a:label='Saying hello'> -->


<application a:label='@string/appLabel'>

20. Référencez la même ressource de la source Java. Ceci est une référence impérative:

// v.setText( "Hello world" );


v.setText( "This app is called "
+ getResources().getString( R.string.appLabel ));

https://riptutorial.com/fr/home 20
21. Testez les modifications ci-dessus en reconstruisant, en réinstallant et en réexécutant
l'application (étapes 10 à 17).

Il devrait redémarrer et dire: "Cette application s'appelle Dire bonjour".

Désinstallation de l'application
adb uninstall dom.domain

Voir également
• question originale - La question originale qui a incité cet exemple
• Exemple de travail - Un script de construction qui utilise les commandes ci-dessus

Principes de base de l'application

Les applications Android sont écrites en Java. Les outils du SDK Android compilent les fichiers de
code, de données et de ressources dans un fichier APK (package Android). Généralement, un
fichier APK contient tout le contenu de l'application.

Chaque application s'exécute sur sa propre machine virtuelle (VM) afin que l'application puisse
s'exécuter isolée des autres applications. Le système Android fonctionne avec le principe du
moindre privilège. Chaque application n'a accès qu'aux composants dont elle a besoin pour faire
son travail, pas plus. Cependant, une application peut partager des données avec d'autres
applications, par exemple en partageant l'ID utilisateur Linux entre les applications, ou les
applications peuvent demander l'autorisation d'accéder aux données du périphérique telles que la
carte SD, les contacts, etc.

Composants de l'application
Les composants de l'application sont les éléments constitutifs d'une application Android. Chaque
composant joue un rôle spécifique dans une application Android qui sert un objectif distinct et a
des cycles de vie distincts (le flux de comment et quand le composant est créé et détruit). Voici les
quatre types de composants d'application:

1. Activités: Une activité représente un seul écran avec une interface utilisateur. Une
application Android peut avoir plusieurs activités. (Par exemple, une application de
messagerie peut avoir une activité pour répertorier tous les emails, une autre pour afficher le
contenu de chaque email et une autre pour composer un nouvel email). Toutes les activités
d'une application fonctionnent ensemble pour créer une expérience utilisateur.
2. Services: un service s'exécute en arrière-plan pour effectuer des opérations de longue
durée ou pour exécuter des tâches pour des processus distants. Un service ne fournit
aucune interface utilisateur, il s'exécute uniquement en arrière-plan avec l'entrée de
l'utilisateur. (Par exemple, un service peut lire de la musique en arrière-plan lorsque

https://riptutorial.com/fr/home 21
l'utilisateur se trouve dans une autre application ou il peut télécharger des données sur
Internet sans bloquer l'interaction de l'utilisateur avec l'appareil Android.)
3. Fournisseurs de contenu: un fournisseur de contenu gère les données d'application
partagée. Il existe quatre manières de stocker des données dans une application: elles
peuvent être écrites dans un fichier et stockées dans le système de fichiers, insérées ou
mises à jour dans une base de données SQLite, publiées sur le Web ou enregistrées dans
tout autre emplacement de stockage persistant. . Grâce à des fournisseurs de contenu,
d'autres applications peuvent interroger ou même modifier les données. (Par exemple, le
système Android fournit un fournisseur de contenu qui gère les informations de contact de
l'utilisateur afin que toute application autorisée puisse interroger les contacts.) Les
fournisseurs de contenu peuvent également enregistrer les données privées de l'application
pour une meilleure intégrité des données.
4. Récepteurs de diffusion: un récepteur de diffusion répond aux diffusions d’annonces
diffusées à l’échelle du système (par exemple, une émission annonçant que l’écran est
éteint, que la batterie est faible, etc.) ou d’applications (par exemple, téléchargé sur
l'appareil et est disponible pour qu'ils puissent l'utiliser). Les récepteurs de diffusion n'ont pas
d'interface utilisateur, mais ils peuvent afficher une notification dans la barre d'état pour
alerter l'utilisateur. Les récepteurs de diffusion sont généralement utilisés comme
passerelles vers d'autres composants de l'application, principalement des activités et des
services.

Un aspect unique du système Android est que toute application peut démarrer le composant d'une
autre application (par exemple, si vous souhaitez faire un appel, envoyer des SMS, ouvrir une
page Web ou afficher une photo, il existe déjà une application l'utiliser, au lieu de développer une
nouvelle activité pour la même tâche).

Lorsque le système démarre un composant, il lance le processus pour cette application (s'il n'est
pas déjà lancé, c'est-à-dire qu'un seul processus par application peut s'exécuter à tout moment
sur un système Android) et instancie les classes nécessaires pour ce composant. Ainsi, le
composant s'exécute sur le processus de cette application à laquelle il appartient. Par
conséquent, contrairement aux applications sur d'autres systèmes, les applications Android n'ont
pas de point d'entrée unique (il n'y a pas de méthode main() ).

Comme le système exécute chaque application dans un processus distinct, une application ne
peut pas activer directement les composants d'une autre application, quel que soit le système
Android. Ainsi, pour démarrer le composant d'une autre application, une application doit envoyer
un message au système spécifiant l'intention de démarrer ce composant, puis le système
démarrera ce composant.

Le contexte
Les instances de la classe android.content.Context fournissent la connexion au système Android
qui exécute l'application. L'instance de contexte est nécessaire pour accéder aux ressources du
projet et aux informations globales sur l'environnement de l'application.

Prenons un exemple facile à comprendre: Considérez que vous êtes dans un hôtel et que vous
voulez manger quelque chose. Vous appelez le room-service et demandez-leur de vous apporter

https://riptutorial.com/fr/home 22
des choses ou de nettoyer des choses pour vous. Maintenant, pensez à cet hôtel comme une
application Android, vous-même en tant qu’activité et le room-service est alors votre contexte, ce
qui vous permet d’accéder aux ressources de l’hôtel comme le room-service, les produits
alimentaires, etc.

Encore un autre exemple, vous êtes dans un restaurant assis sur une table, chaque table a un
accompagnateur, chaque fois que vous voulez commander des produits alimentaires, vous
demandez au préposé de le faire. Le préposé place ensuite votre commande et vos produits
alimentaires sont servis sur votre table. Encore une fois dans cet exemple, le restaurant est une
application Android, les tables ou les clients sont des composants App, les produits alimentaires
sont les ressources de votre application et le standardiste est votre contexte, ce qui vous permet
d'accéder aux ressources comme des produits alimentaires.

L'activation de l'un des composants ci-dessus nécessite l'instance du contexte. Non seulement ce
qui précède, mais presque toutes les ressources système: la création de l'interface utilisateur à
l'aide de vues (abordées plus loin), la création d'une instance de services système, le démarrage
de nouvelles activités ou services nécessitent tous un contexte.

Une description plus détaillée est écrite ici .

Configuration d'un AVD (Android Virtual Device)

TL; DR Il nous permet essentiellement de simuler des appareils réels et de tester nos applications
sans appareil réel.

Selon Android Developer Documentation ,

une définition de périphérique virtuel Android (AVD) vous permet de définir les
caractéristiques d’un appareil Android Phone, Tablet, Android Wear ou Android TV que
vous souhaitez simuler dans l’émulateur Android. Le gestionnaire AVD vous aide à
créer et à gérer facilement des AVD.

Pour configurer un AVD, procédez comme suit:

1. Cliquez sur ce bouton pour afficher le gestionnaire AVD:

2. Vous devriez voir une boîte de dialogue comme celle-ci:

https://riptutorial.com/fr/home 23
3. Cliquez maintenant sur le bouton + Create Virtual Device... Cela fera apparaître la boîte de
dialogue Virtual Device Configuration:

https://riptutorial.com/fr/home 24
4. Sélectionnez n'importe quel périphérique de votre choix, puis cliquez sur Next :

https://riptutorial.com/fr/home 25
5. Ici, vous devez choisir une version Android pour votre émulateur. Vous devrez peut-être aussi
le télécharger en premier en cliquant sur Download . Après avoir choisi une version, cliquez sur Next
.

https://riptutorial.com/fr/home 26
6. Entrez ici un nom pour votre émulateur, l'orientation initiale et si vous souhaitez afficher un
cadre autour de lui. Après avoir choisi tous ces éléments, cliquez sur Finish .

7. Vous avez maintenant un nouveau AVD prêt à lancer vos applications dessus.

https://riptutorial.com/fr/home 27
Lire Démarrer avec Android en ligne: https://riptutorial.com/fr/android/topic/85/demarrer-avec-
android

https://riptutorial.com/fr/home 28
Chapitre 2: Accès aux bases de données
SQLite à l'aide de la classe ContentValues
Examples
Insertion et mise à jour de lignes dans une base de données SQLite

Tout d'abord, vous devez ouvrir votre base de données SQLite, ce qui peut être fait comme suit:

SQLiteDatabase myDataBase;
String mPath = dbhelper.DATABASE_PATH + dbhelper.DATABASE_NAME;
myDataBase = SQLiteDatabase.openDatabase(mPath, null, SQLiteDatabase.OPEN_READWRITE);

Après avoir ouvert la base de données, vous pouvez facilement insérer ou mettre à jour des lignes
à l'aide de la classe ContentValues . Les exemples suivants supposent qu'un prénom est donné par
str_edtfname et un nom de famille par str_edtlname . Vous devez également remplacer table_name
par le nom de votre table que vous souhaitez modifier.

Insérer des données


ContentValues values = new ContentValues();
values.put("First_Name", str_edtfname);
values.put("Last_Name", str_edtlname);
myDataBase.insert("table_name", null, values);

Mise à jour des données


ContentValues values = new ContentValues();
values.put("First_Name", str_edtfname);
values.put("Last_Name", str_edtlname);
myDataBase.update("table_name", values, "id" + " = ?", new String[] {id});

Lire Accès aux bases de données SQLite à l'aide de la classe ContentValues en ligne:
https://riptutorial.com/fr/android/topic/10154/acces-aux-bases-de-donnees-sqlite-a-l-aide-de-la-
classe-contentvalues

https://riptutorial.com/fr/home 29
Chapitre 3: ACRA
Syntaxe
• android: nom = ". ACRAHandler"
• ACRA.init (this, config);
• la classe publique ACRAHandler étend l'application {

Paramètres

Paramètre La description

Définit les paramètres ACRA, tels que l'emplacement à signaler, le


@ReportCrashes
contenu personnalisé, etc.

formeUri le chemin du fichier qui signale le plantage

Remarques
• ACRA ne prend plus en charge les formulaires Google, vous avez donc besoin d'un
backend: https://github.com/ACRA/acra/wiki/Backends

Examples
ACRAHandler

Exemple de classe d'extension d'application pour gérer le reporting:

@ReportsCrashes(

formUri = "https://backend-of-your-choice.com/",//Non-password protected.


customReportContent = { /* */ReportField.APP_VERSION_NAME,
ReportField.PACKAGE_NAME,ReportField.ANDROID_VERSION,
ReportField.PHONE_MODEL,ReportField.LOGCAT },
mode = ReportingInteractionMode.TOAST,
resToastText = R.string.crash

)
public class ACRAHandler extends Application {
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);

final ACRAConfiguration config = new ConfigurationBuilder(this)

.build();

// Initialise ACRA

https://riptutorial.com/fr/home 30
ACRA.init(this, config);

Exemple manifeste

<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
<!-- etc -->

>

<!-- Internet is required. READ_LOGS are to ensure that the Logcat is transmitted-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_LOGS"/>

<application
android:allowBackup="true"
android:name=".ACRAHandler"<!-- Activates ACRA on startup -->
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >

<!-- Activities -->


</application>

</manifest>

Installation

Maven

<dependency>
<groupId>ch.acra</groupId>
<artifactId>acra</artifactId>
<version>4.9.2</version>
<type>aar</type>
</dependency>

Gradle

compile 'ch.acra:acra:4.9.2'

Lire ACRA en ligne: https://riptutorial.com/fr/android/topic/1324/acra

https://riptutorial.com/fr/home 31
Chapitre 4: Activité
Introduction
Une activité représente un seul écran avec une interface utilisateur . Une application Android
peut avoir plusieurs activités. Par exemple, une application de messagerie peut avoir une activité
pour répertorier tous les e-mails, une autre activité pour afficher le contenu des e-mails, une autre
activité pour composer un nouvel e-mail. Toutes les activités d'une application fonctionnent
ensemble pour créer une expérience utilisateur parfaite.

Syntaxe
• annuler onCreate (Bundle savedInstanceState) // Appelé au démarrage de l'activité.

• void onPostCreate (Bundle savedInstanceState) // Appelé à la fin du démarrage de l'activité


(après onStart () et onRestoreInstanceState (Bundle) ont été appelés).

• void onStart () // Appelé après onCreate (Bundle) - ou après onRestart () lorsque l'activité a
été arrêtée, mais est à nouveau affichée pour l'utilisateur.

• void onResume () // Appelé après onRestoreInstanceState (Bundle), onRestart () ou


onPause (), pour que votre activité commence à interagir avec l'utilisateur.

• void onPostResume () // Appelé lorsque l'activité est terminée (après l'appel de onResume
()).

• void onRestart () // Appelé après onStop () lorsque l'activité en cours est affichée à nouveau
pour l'utilisateur (l'utilisateur y est retourné).

• void onPause () // Appelé dans le cadre du cycle de vie d'une activité lorsqu'une activité est
en arrière-plan, mais n'a pas encore été tué.

• void onStop () // Appelé lorsque l'utilisateur n'est plus visible.

• void onDestroy () // Effectue tout nettoyage final avant la destruction d'une activité.

• void onNewIntent (Intention intentionnelle) // Ceci est appelé pour les activités qui définissent
launchMode sur "singleTop" dans leur package, ou si un client a utilisé l'indicateur
FLAG_ACTIVITY_SINGLE_TOP lors de l'appel de startActivity (Intent).

• annulez onSaveInstanceState (Bundle outState) // Appelé pour récupérer l'état par instance
d'une activité avant d'être tué pour que l'état puisse être restauré dans onCreate (Bundle) ou
onRestoreInstanceState (Bundle) (le Bundle rempli par cette méthode sera transmis aux
deux ).

• void onRestoreInstanceState (Bundle savedInstanceState) // Cette méthode est appelée


après onStart () lorsque l'activité est en cours de réinitialisation à partir d'un état

https://riptutorial.com/fr/home 32
précédemment enregistré, donné ici dans savedInstanceState.

Paramètres

Paramètre Détails

Intention Peut être utilisé avec startActivity pour lancer une activité

Paquet Un mappage des clés String vers diverses valeurs parcellables .

Le contexte Interface vers des informations globales sur un environnement d'application.

Remarques
Une activité est un composant d'application qui fournit un écran avec lequel les utilisateurs
peuvent interagir pour faire quelque chose, comme composer le numéro du téléphone, prendre
une photo, envoyer un courrier électronique ou afficher une carte. Chaque activité se voit attribuer
une fenêtre dans laquelle dessiner son interface utilisateur. La fenêtre remplit généralement
l'écran, mais peut être plus petite que l'écran et flotter au-dessus des autres fenêtres.

Examples
Exclure une activité de l'historique de la pile arrière

Que l'activité B puisse être ouverte et que d'autres activités puissent être lancées. Mais l'utilisateur
ne devrait pas le rencontrer lors de la navigation dans les activités de tâche.

https://riptutorial.com/fr/home 33
La solution la plus simple consiste à définir l'attribut noHistory sur true pour cette <activity> dans
AndroidManifest.xml :

<activity
android:name=".B"
android:noHistory="true">

Ce même comportement est également possible à partir du code si B appelle finish() avant de
démarrer l'activité suivante:

finish();
startActivity(new Intent(context, C.class));

L'utilisation typique du drapeau noHistory est avec "Splash Screen" ou Login Activities.

Activité Android Explication de LifeCycle

Supposons une application avec une MainActivity qui puisse appeler l'activité suivante en cliquant

https://riptutorial.com/fr/home 34
sur un bouton.

public class MainActivity extends AppCompatActivity {

private final String LOG_TAG = MainActivity.class.getSimpleName();


@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d(LOG_TAG, "calling onCreate from MainActivity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from MainActivity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from MainActivity");
}

@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from MainActivity");
}

@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from MainActivity");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from MainActivity");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from MainActivity");
}
public void toNextActivity(){
Log.d(LOG_TAG, "calling Next Activity");
Intent intent = new Intent(this, NextActivity.class);
startActivity(intent);
} }

et

public class NextActivity extends AppCompatActivity {


private final String LOG_TAG = NextActivity.class.getSimpleName();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_next);

https://riptutorial.com/fr/home 35
Log.d(LOG_TAG, "calling onCreate from Next Activity");
}
@Override
protected void onStart() {
super.onStart();
Log.d(LOG_TAG, "calling onStart from Next Activity");
}
@Override
protected void onResume() {
super.onResume();
Log.d(LOG_TAG, "calling onResume from Next Activity");
}

@Override
protected void onPause() {
super.onPause();
Log.d(LOG_TAG, "calling onPause from Next Activity");
}

@Override
protected void onStop() {
super.onStop();
Log.d(LOG_TAG, "calling onStop from Next Activity");
}

@Override
protected void onDestroy() {
super.onDestroy();
Log.d(LOG_TAG, "calling onDestroy from Next Activity");
}

@Override
protected void onRestart() {
super.onRestart();
Log.d(LOG_TAG, "calling onRestart from Next Activity");
} }

Lorsque l'application est créée pour la première fois


D / MainActivity: appel de onCreate à partir de MainActivity
D / MainActivity: appel de onStart depuis MainActivity
D / MainActivity: appel à onResume à partir de MainActivity
sont appelés

Quand l'écran dort


08: 11: 03.142 D / MainActivity: appel de onPause à partir de MainActivity
08: 11: 03.192 D / MainActivity: appel de onStop depuis MainActivity
sont appelés. Et encore quand il se réveille
08: 11: 55.922 D / MainActivity: appel de onRestart à partir de MainActivity
08: 11: 55.962 D / MainActivity: appel de onStart depuis MainActivity
08: 11: 55.962 D / MainActivity: appel de onResume à partir de MainActivity
sont appelés

Cas 1: quand l'activité suivante est appelée à partir de l'activité principale


D / MainActivity: appel à l'activité suivante
D / MainActivity: appel de onPause à partir de MainActivity

https://riptutorial.com/fr/home 36
D / NextActivity: appeler onCreate à partir de l'activité suivante
D / NextActivity: appel de onStart à partir de l'activité suivante
D / NextActivity: appeler onResume à partir de l'activité suivante
D / MainActivity: appel de onStop depuis MainActivity

Lorsque vous revenez à l'activité principale à partir de l'activité suivante à l'aide du bouton retour
D / NextActivity: appeler onPause à partir de l'activité suivante
D / MainActivity: appeler onRestart à partir de MainActivity
D / MainActivity: appel de onStart depuis MainActivity
D / MainActivity: appel à onResume à partir de MainActivity
D / NextActivity: appeler onStop à partir de l'activité suivante
D / NextActivity: appeler onDestroy à partir de l'activité suivante

Cas 2: Lorsque l'activité est partiellement masquée (lorsque le bouton Vue d'ensemble est
enfoncé) ou lorsque l'application passe en arrière-plan et qu'une autre application la masque
complètement
D / MainActivity: appel de onPause à partir de MainActivity
D / MainActivity: appel de onStop depuis MainActivity
et lorsque l'application est de retour au premier plan prête à accepter les entrées utilisateur,
D / MainActivity: appeler onRestart à partir de MainActivity
D / MainActivity: appel de onStart depuis MainActivity
D / MainActivity: appel à onResume à partir de MainActivity
sont appelés

Cas 3: Lorsqu'une activité est appelée pour remplir une intention implicite et que l'utilisateur a
effectué une sélection. Par exemple, lorsque vous appuyez sur le bouton Partager et que
l'utilisateur doit sélectionner une application dans la liste des applications affichées
D / MainActivity: appel de onPause à partir de MainActivity

L'activité est visible mais pas active maintenant. Lorsque la sélection est terminée et que
l'application est active
D / MainActivity: appel à onResume à partir de MainActivity
est appelé

Cas4:
Lorsque l'application est tuée en arrière-plan (pour libérer des ressources pour une autre
application au premier plan), onPause (pour le périphérique pré-en nid d'abeilles) ou onStop (pour
le périphérique en nid d'abeille) sera le dernier à être appelé avant la fin de l'application.

onCreate et onDestroy seront appelés au maximum une fois à chaque exécution de l'application.
Mais onPause, onStop, onRestart, onStart, onResume peuvent être appelés plusieurs fois au
cours du cycle de vie.

Mode de lancement d'activité

Le mode de lancement définit le comportement d'une activité nouvelle ou existante dans la tâche.
Il existe des modes de lancement possibles:

https://riptutorial.com/fr/home 37
• la norme
• unique
• singleTask
• seule instance

Il doit être défini dans le manifeste Android dans l'élément <activity/> tant android:launchMode .

<activity
android:launchMode=["standard" | "singleTop" | "singleTask" | "singleInstance"] />

La norme:
Valeur par défaut. Si ce mode est défini, une nouvelle activité sera toujours créée pour chaque
nouvelle intention. Il est donc possible d'obtenir de nombreuses activités du même type. Une
nouvelle activité sera placée en haut de la tâche. Il existe une différence pour les différentes
versions d'Android: si l'activité commence à partir d'une autre application, sur les androïdes <=
4.4, elle sera placée dans la même tâche que l'application de démarrage, mais la nouvelle tâche>
= 5.0 sera créée.

SingleTop:
Ce mode est presque identique à la standard . De nombreuses instances d'activité singleTop
peuvent être créées. La différence est que, si une instance d'activité existe déjà en haut de la pile
en cours, onNewIntent() sera appelé au lieu de créer une nouvelle instance.

SingleTask:
L'activité avec ce mode de lancement ne peut avoir qu'une seule instance dans le système . Une
nouvelle tâche pour l'activité sera créée, si elle n'existe pas. Sinon, la tâche avec activité sera
déplacée vers l'avant et onNewIntent sera appelée.

Seule instance:
Ce mode est similaire à singleTask . La différence est que la tâche qui détient une activité avec
singleInstance ne peut avoir que cette activité et rien de plus. Lorsque l'activité d' singleInstance
crée une autre activité, une nouvelle tâche sera créée pour placer cette activité.

Présentation de l'interface utilisateur avec setContentView

La classe d'activité prend soin de créer une fenêtre dans laquelle vous pouvez placer votre
interface utilisateur avec setContentView .

https://riptutorial.com/fr/home 38
Il existe trois méthodes setContentView :

• setContentView(int layoutResID) - Définit le contenu de l'activité à partir d'une ressource de


présentation.
• setContentView(View view) - Définit le contenu de l'activité sur une vue explicite.
• setContentView(View view, ViewGroup.LayoutParams params) - Définit le contenu de l'activité sur
une vue explicite avec les paramètres fournis.

Lorsque setContentView est appelée, cette vue est placée directement dans la hiérarchie de vues
de l'activité. Elle peut elle-même être une hiérarchie de vues complexe.

Exemples
Définir le contenu du fichier de ressources:
Ajoutez le fichier de ressources (main.xml dans cet exemple) avec la hiérarchie de vue:

<?xml version="1.0" encoding="utf-8"?>


<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello" />

</FrameLayout>

Définissez-le comme contenu dans l'activité:

public final class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

// The resource will be inflated,


// adding all top-level views to the activity.
setContentView(R.layout.main);
}
}

Définir le contenu à une vue explicite:

public final class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {

https://riptutorial.com/fr/home 39
super.onCreate(savedInstanceState);

// Creating view with container


final FrameLayout root = new FrameLayout(this);
final TextView text = new TextView(this);
text.setText("Hello");
root.addView(text);

// Set container as content view


setContentView(root);
}
}

Effacer votre pile d'activité actuelle et lancer une nouvelle activité

Si vous souhaitez effacer votre pile d'activité actuelle et lancer une nouvelle activité (par exemple,
vous déconnecter de l'application et lancer une activité de connexion), il semble qu'il y ait deux
approches.

1. Cible (API> = 16)

Appeler finishAffinity() partir d'une activité

2. Cible (11 <= API <16)

Intent intent = new Intent(this, LoginActivity.class);


intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK
|Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();

Fin de l'application avec exclure des Récents

Définissez d'abord une ExitActivity dans AndroidManifest.xml

<activity
android:name="com.your_example_app.activities.ExitActivity"
android:autoRemoveFromRecents="true"
android:theme="@android:style/Theme.NoDisplay" />

Après la classe ExitActivity

/**
* Activity to exit Application without staying in the stack of last opened applications
*/
public class ExitActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

if (Utils.hasLollipop()) {
finishAndRemoveTask();
} else if (Utils.hasJellyBean()) {
finishAffinity();

https://riptutorial.com/fr/home 40
} else {
finish();
}
}

/**
* Exit Application and Exclude from Recents
*
* @param context Context to use
*/
public static void exitApplication(ApplicationContext context) {
Intent intent = new Intent(context, ExitActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK |
Intent.FLAG_ACTIVITY_NO_ANIMATION | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(intent);
}
}

Up Navigation pour les activités

La navigation haut s'effectue dans Android en ajoutant android:parentActivityName="" dans


Manifest.xml à la balise d'activité. Avec cette balise, vous indiquez au système l'activité parentale
d'une activité.

Comment est-il fait?

<uses-permission android:name="android.permission.INTERNET" />

<application
android:name=".SkillSchoolApplication"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".ui.activities.SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
<activity android:name=".ui.activities.MainActivity" />
<activity android:name=".ui.activities.HomeActivity"
android:parentActivityName=".ui.activities.MainActivity/> // HERE I JUST TOLD THE SYSTEM
THAT MainActivity is the parent of HomeActivity
</application>

Maintenant, quand je clique sur la flèche dans la barre d'outils de HomeActivity, cela me ramène à
l'activité parent.

Code Java

Ici, je vais écrire le code Java approprié pour cette fonctionnalité.

https://riptutorial.com/fr/home 41
public class HomeActivity extends AppCompatActivity {
@BindView(R.id.toolbar)
Toolbar toolbar;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_home);
ButterKnife.bind(this);
//Since i am using custom tool bar i am setting refernce of that toolbar to Actionbar.
If you are not using custom then you can simple leave this and move to next line
setSupportActionBar(toolbar);
getSupportActionBar.setDisplayHomeAsUpEnabled(true); // this will show the back arrow
in the tool bar.
}
}

Si vous exécutez ce code, vous verrez que lorsque vous appuyez sur le bouton retour, vous
revenez à MainActivity. Pour une meilleure compréhension de Up Navigation, je vous
recommande de lire docs

Vous pouvez plus personnaliser ce comportement selon vos besoins en remplaçant

@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
NavUtils.navigateUpFromSameTask(this); // Here you will write your logic for handling
up navigation
return true;
}
return super.onOptionsItemSelected(item);
}

Piratage simple

C'est un simple hack qui est principalement utilisé pour naviguer vers l'activité parent si le parent
est en backstack. En appelant onBackPressed() si id est égal à android.R.id.home

@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
switch (id) {
case android.R.id.home:
onBackPressed();
return true;
}
return super.onOptionsItemSelected(item);
}

Lire Activité en ligne: https://riptutorial.com/fr/android/topic/1481/activite

https://riptutorial.com/fr/home 42
Chapitre 5: ADB (Android Debug Bridge)
Introduction
ADB (Android Debug Bridge) est un outil de ligne de commande utilisé pour communiquer avec
une instance d'émulateur ou un périphérique Android connecté.

Vue d'ensemble de la BAD

Une grande partie de ce sujet a été divisée en deux parties:

Remarques
Liste des exemples déplacés dans le shell adb :

• Octroi & révocation d'autorisations API 23+


• Envoyer du texte, des touches enfoncées et des événements tactiles au périphérique
Android via ADB
• Liste des paquets
• Enregistrement de l'affichage
• Ouvrir les options du développeur
• Définir la date / heure via adb
• Modification des autorisations de fichier à l'aide de la commande chmod
• Génération d'une diffusion "Boot Complete"
• Imprimer les données d'application
• Afficher le contenu de stockage externe / secondaire
• http://stackoverflow.com/documentation/android/9408/adb-shell/29140/adb-shell
• tuer un processus dans un appareil Android

Examples
Imprimer la liste détaillée des appareils connectés

Pour obtenir une liste détaillée de tous les périphériques connectés à adb , écrivez la commande
suivante dans votre terminal:

adb devices -l

Exemple de sortie

List of devices attached


ZX1G425DC6 device usb:336592896X product:shamu model:Nexus_6 device:shamu
013e4e127e59a868 device usb:337641472X product:bullhead model:Nexus_5X device:bullhead
ZX1D229KCN device usb:335592811X product:titan_retde model:XT1068
device:titan_umtsds

https://riptutorial.com/fr/home 43
A50PL device usb:331592812X

• La première colonne est le numéro de série de l'appareil. Si elle commence par emulator- ,
cet appareil est un émulateur.
• usb: le chemin du périphérique dans le sous-système USB.
• product: le code produit de l'appareil. Ceci est très spécifique au fabricant et, comme vous
pouvez le voir dans le cas de l'appareil Archos A50PL ci-dessus, il peut être vide.
• model: le modèle d'appareil. Comme le product , peut être vide.
• device: le code de l'appareil. Ceci est également très spécifique au fabricant et peut être
vide.

Lire les informations sur l'appareil

Écrivez la commande suivante dans votre terminal:

adb shell getprop

Cela imprimera toutes les informations disponibles sous la forme de paires clé / valeur.

Vous pouvez simplement lire des informations spécifiques en ajoutant le nom d'une clé spécifique
à la commande. Par exemple:

adb shell getprop ro.product.model

Voici quelques informations intéressantes que vous obtenez:

• ro.product.model : Nom du modèle du périphérique (par exemple, Nexus 6P)


• ro.build.version.sdk : Niveau API du périphérique (par exemple 23)
• ro.product.brand : ro.product.brand marque de l'appareil (par ex. Samsung)

Exemple complet de sortie

[dalvik.vm.dex2oat-Xms]: [64m]
[dalvik.vm.dex2oat-Xmx]: [512m]
[dalvik.vm.heapsize]: [384m]
[dalvik.vm.image-dex2oat-Xms]: [64m]
[dalvik.vm.image-dex2oat-Xmx]: [64m]
[dalvik.vm.isa.x86.variant]: [dalvik.vm.isa.x86.features=default]
[dalvik.vm.isa.x86_64.features]: [default]
[dalvik.vm.isa.x86_64.variant]: [x86_64]
[dalvik.vm.lockprof.threshold]: [500]
[dalvik.vm.stack-trace-file]: [/data/anr/traces.txt]
[debug.atrace.tags.enableflags]: [0]
[debug.force_rtl]: [0]
[dev.bootcomplete]: [1]
[gsm.current.phone-type]: [1]
[gsm.defaultpdpcontext.active]: [true]
[gsm.network.type]: [UMTS]
[gsm.nitz.time]: [1469106902492]
[gsm.operator.alpha]: [Android]
[gsm.operator.iso-country]: [us]

https://riptutorial.com/fr/home 44
[gsm.operator.isroaming]: [false]
[gsm.operator.numeric]: [310260]
[gsm.sim.operator.alpha]: [Android]
[gsm.sim.operator.iso-country]: [us]
[gsm.sim.operator.numeric]: [310260]
[gsm.sim.state]: [READY]
[gsm.version.ril-impl]: [android reference-ril 1.0]
[init.svc.adbd]: [running]
[init.svc.bootanim]: [stopped]
[init.svc.console]: [running]
[init.svc.debuggerd]: [running]
[init.svc.debuggerd64]: [running]
[init.svc.drm]: [running]
[init.svc.fingerprintd]: [running]
[init.svc.gatekeeperd]: [running]
[init.svc.goldfish-logcat]: [stopped]
[init.svc.goldfish-setup]: [stopped]
[init.svc.healthd]: [running]
[init.svc.installd]: [running]
[init.svc.keystore]: [running]
[init.svc.lmkd]: [running]
[init.svc.logd]: [running]
[init.svc.logd-reinit]: [stopped]
[init.svc.media]: [running]
[init.svc.netd]: [running]
[init.svc.perfprofd]: [running]
[init.svc.qemu-props]: [stopped]
[init.svc.ril-daemon]: [running]
[init.svc.servicemanager]: [running]
[init.svc.surfaceflinger]: [running]
[init.svc.ueventd]: [running]
[init.svc.vold]: [running]
[init.svc.zygote]: [running]
[init.svc.zygote_secondary]: [running]
[net.bt.name]: [Android]
[net.change]: [net.dns2]
[net.dns1]: [10.0.2.3]
[net.dns2]: [10.0.2.4]
[net.eth0.dns1]: [10.0.2.3]
[net.eth0.dns2]: [10.0.2.4]
[net.eth0.gw]: [10.0.2.2]
[net.gprs.local-ip]: [10.0.2.15]
[net.hostname]: [android-5e1af924d72dc578]
[net.qtaguid_enabled]: [1]
[net.tcp.default_init_rwnd]: [60]
[persist.sys.dalvik.vm.lib.2]: [libart.so]
[persist.sys.profiler_ms]: [0]
[persist.sys.timezone]: [Europe/Vienna]
[persist.sys.usb.config]: [adb]
[qemu.gles]: [1]
[qemu.hw.mainkeys]: [0]
[qemu.sf.fake_camera]: [none]
[qemu.sf.lcd_density]: [560]
[rild.libargs]: [-d /dev/ttyS0]
[rild.libpath]: [/system/lib/libreference-ril.so]
[ro.allow.mock.location]: [0]
[ro.baseband]: [unknown]
[ro.board.platform]: []
[ro.boot.hardware]: [ranchu]
[ro.bootimage.build.date]: [Thu Jul 7 15:56:30 UTC 2016]
[ro.bootimage.build.date.utc]: [1467906990]

https://riptutorial.com/fr/home 45
[ro.bootimage.build.fingerprint]:
[Android/sdk_google_phone_x86_64/generic_x86_64:6.0/MASTER/3038907:userdebug/test-keys]
[ro.bootloader]: [unknown]
[ro.bootmode]: [unknown]
[ro.build.characteristics]: [emulator]
[ro.build.date]: [Thu Jul 7 15:55:30 UTC 2016]
[ro.build.date.utc]: [1467906930]
[ro.build.description]: [sdk_google_phone_x86_64-userdebug 6.0 MASTER 3038907 test-keys]
[ro.build.display.id]: [sdk_google_phone_x86_64-userdebug 6.0 MASTER 3038907 test-keys]
[ro.build.fingerprint]:
[Android/sdk_google_phone_x86_64/generic_x86_64:6.0/MASTER/3038907:userdebug/test-keys]
[ro.build.flavor]: [sdk_google_phone_x86_64-userdebug]
[ro.build.host]: [vpak15.mtv.corp.google.com]
[ro.build.id]: [MASTER]
[ro.build.product]: [generic_x86_64]
[ro.build.tags]: [test-keys]
[ro.build.type]: [userdebug]
[ro.build.user]: [android-build]
[ro.build.version.all_codenames]: [REL]
[ro.build.version.base_os]: []
[ro.build.version.codename]: [REL]
[ro.build.version.incremental]: [3038907]
[ro.build.version.preview_sdk]: [0]
[ro.build.version.release]: [6.0]
[ro.build.version.sdk]: [23]
[ro.build.version.security_patch]: [2015-10-01]
[ro.com.google.locationfeatures]: [1]
[ro.config.alarm_alert]: [Alarm_Classic.ogg]
[ro.config.nocheckin]: [yes]
[ro.config.notification_sound]: [OnTheHunt.ogg]
[ro.crypto.state]: [unencrypted]
[ro.dalvik.vm.native.bridge]: [0]
[ro.debuggable]: [1]
[ro.hardware]: [ranchu]
[ro.hardware.audio.primary]: [goldfish]
[ro.kernel.android.checkjni]: [1]
[ro.kernel.android.qemud]: [1]
[ro.kernel.androidboot.hardware]: [ranchu]
[ro.kernel.clocksource]: [pit]
[ro.kernel.console]: [0]
[ro.kernel.ndns]: [2]
[ro.kernel.qemu]: [1]
[ro.kernel.qemu.gles]: [1]
[ro.opengles.version]: [131072]
[ro.product.board]: []
[ro.product.brand]: [Android]
[ro.product.cpu.abi]: [x86_64]
[ro.product.cpu.abilist]: [x86_64,x86]
[ro.product.cpu.abilist32]: [x86]
[ro.product.cpu.abilist64]: [x86_64]
[ro.product.device]: [generic_x86_64]
[ro.product.locale]: [en-US]
[ro.product.manufacturer]: [unknown]
[ro.product.model]: [Android SDK built for x86_64]
[ro.product.name]: [sdk_google_phone_x86_64]
[ro.radio.use-ppp]: [no]
[ro.revision]: [0]
[ro.runtime.firstboot]: [1469106908722]
[ro.secure]: [1]
[ro.serialno]: []
[ro.wifi.channels]: []

https://riptutorial.com/fr/home 46
[ro.zygote]: [zygote64_32]
[selinux.reload_policy]: [1]
[service.bootanim.exit]: [1]
[status.battery.level]: [5]
[status.battery.level_raw]: [50]
[status.battery.level_scale]: [9]
[status.battery.state]: [Slow]
[sys.boot_completed]: [1]
[sys.sysctl.extra_free_kbytes]: [43200]
[sys.sysctl.tcp_def_init_rwnd]: [60]
[sys.usb.config]: [adb]
[sys.usb.state]: [adb]
[vold.has_adoptable]: [1]
[wlan.driver.status]: [unloaded]
[xmpp.auto-presence]: [true]

Connecter ADB à un périphérique via WiFi

La configuration ADB standard implique une connexion USB à un périphérique physique.


Si vous préférez, vous pouvez passer en mode TCP / IP et connecter ADB via WiFi.

Appareil non enraciné


1. Obtenez sur le même réseau:

• Assurez-vous que votre appareil et votre ordinateur sont sur le même réseau.

2. Connectez le périphérique à l'ordinateur hôte à l'aide d'un câble USB.

3. Connectez adb à un périphérique via le réseau:

Alors que votre appareil est connecté à adb via USB, adb la commande suivante pour écouter
une connexion TCP / IP sur un port (par défaut 5555):

• Tapez adb tcpip <port> (passez en mode TCP / IP).


• Déconnectez le câble USB du périphérique cible.
• Tapez adb connect <ip address>:<port> (le port est facultatif; par défaut 5555).

Par exemple:

adb tcpip 5555


adb connect 192.168.0.101:5555

Si vous ne connaissez pas l'adresse IP de votre appareil, vous pouvez:

• vérifiez l'adresse IP dans les paramètres WiFi de votre appareil.


• utiliser ADB pour découvrir l'IP (via USB):
1. Connectez l'appareil à l'ordinateur via USB
2. Dans une ligne de commande, tapez adb shell ifconfig et copiez l'adresse IP de
votre périphérique

https://riptutorial.com/fr/home 47
Pour revenir au débogage via USB, utilisez la commande suivante:

adb usb

Vous pouvez également connecter ADB via WiFi en installant un plug-in sur Android Studio.
Pour ce faire, accédez à Paramètres> Plug -ins et Parcourir les référentiels, recherchez ADB
WiFi , installez-le et rouvrez Android Studio. Vous verrez une nouvelle icône dans votre
barre d'outils, comme indiqué dans l'image suivante. Connectez l'appareil à l'ordinateur hôte
via USB et cliquez sur cette icône AndroidWiFiADB . Il affichera un message indiquant si
votre appareil est connecté ou non. Une fois connecté, vous pouvez débrancher votre clé
USB.

Appareil enraciné
Remarque: Certains appareils qui sont enracinés peuvent utiliser l'App WiFi ADB du Play Store
pour activer cela de manière simple. En outre, pour certains périphériques (en particulier ceux
dotés de ROM CyanogenMod), cette option est présente dans les options de développement
parmi les paramètres. L'activer vous donnera l'adresse IP et le numéro de port requis pour vous
connecter à adb en exécutant simplement adb connect <ip address>:<port> .

Lorsque vous avez un périphérique rooté mais que vous n'avez pas accès à
un câble USB

Le processus est expliqué en détail dans la réponse suivante:


http://stackoverflow.com/questions/2604727/how-can-i-connect-to-android-with-adb-over-
tcp/3623727#3623727 Les commandes les plus importantes sont montrés ci-dessous.

Ouvrez un terminal dans l'appareil et tapez ce qui suit:

su
setprop service.adb.tcp.port <a tcp port number>
stop adbd
start adbd

Par exemple:

setprop service.adb.tcp.port 5555

Et sur votre ordinateur:

adb connect <ip address>:<a tcp port number>

Par exemple:

https://riptutorial.com/fr/home 48
adb connect 192.168.1.2:5555

Pour l'éteindre:

setprop service.adb.tcp.port -1
stop adbd
start adbd

Éviter le délai d'attente

Par défaut, adb après 5000 ms. Cela peut arriver dans certains cas, comme le WiFi lent ou un
grand APK.

Un simple changement dans la configuration de Gradle peut faire l'affaire:

android {
adbOptions {
timeOutInMs 10 * 1000
}
}

Extraire (pousser) des fichiers de (vers) l'appareil

Vous pouvez extraire (télécharger) des fichiers du périphérique en exécutant la commande


suivante:

adb pull <remote> <local>

Par exemple:

adb pull /sdcard/ ~/

Vous pouvez également pousser (télécharger) des fichiers de votre ordinateur vers le
périphérique:

adb push <local> <remote>

Par exemple:

adb push ~/image.jpg /sdcard/

Exemple pour récupérer une base de données depuis un périphérique

sudo adb -d shell "run-as com.example.name cat /data/da/com.example.name


/databases/DATABASE_NAME > /sdcard/file

Redémarrer le périphérique

https://riptutorial.com/fr/home 49
Vous pouvez redémarrer votre appareil en exécutant la commande suivante:

adb reboot

Effectuez cette commande pour redémarrer dans bootloader:

adb reboot bootloader

Redémarrez en mode de récupération:

adb reboot recovery

Sachez que l’appareil ne s’arrêtera pas en premier!

Activer / désactiver le Wifi

Allumer:

adb shell svc wifi enable

Éteindre:

adb shell svc wifi disable

Voir les appareils disponibles

Commander:

adb devices

Exemple de résultat:

List of devices attached


emulator-5554 device
PhoneRT45Fr54 offline
123.454.67.45 no device

Première colonne - numéro de série de l'appareil

Deuxième colonne - état de la connexion

Documentation Android

Connecter le périphérique par IP

Entrer les commandes dans les applications dispositif terminal

https://riptutorial.com/fr/home 50
su
setprop service.adb.tcp.port 5555
stop adbd
start adbd

Après cela, vous pouvez utiliser CMD et ADB pour vous connecter en utilisant la commande
suivante

adb connect 192.168.0.101.5555

Et vous pouvez le désactiver et renvoyer ADB sur USB avec

setprop service.adb.tcp.port -1
stop adbd
start adbd

Depuis un ordinateur, si vous avez déjà un accès USB (aucune racine requise)

Il est encore plus facile de passer à l’utilisation du Wi-Fi si vous avez déjà une connexion USB. À
partir d’une ligne de commande sur l’ordinateur sur lequel le périphérique est connecté via USB,
émettez les commandes

adb tcpip 5555


adb connect 192.168.0.101:5555

Remplacez 192.168.0.101 par l'adresse IP du périphérique

Démarrer / arrêter adb

Démarrer ADB:

adb kill-server

Arrêtez ADB:

adb start-server

Voir logcat

Vous pouvez exécuter logcat tant que commande adb ou directement à l'invite du shell de votre
émulateur ou périphérique connecté. Pour afficher la sortie du journal à l'aide d' adb , accédez à
votre répertoire platform-tools / toolkit SDK et exécutez:

$ adb logcat

Vous pouvez également créer une connexion shell à un périphérique puis exécuter:

$ adb shell

https://riptutorial.com/fr/home 51
$ logcat

Une commande utile est:

adb logcat -v threadtime

Cela affiche la date, l'heure d'appel, la priorité, la balise et le PID et le TID du thread émettant le
message dans un format de message long.

Filtration

Les journaux Logcat ont été appelés niveaux de journalisation:

V - Verbose, D - Debug, I - Info, W - Avertissement, E - Erreur, F - Fatal, S - Silencieux

Vous pouvez également filtrer logcat par niveau de journalisation. Par exemple, si vous souhaitez
uniquement afficher le niveau de débogage:

adb logcat *:D

Logcat peut être filtré par un nom de package, bien sûr, vous pouvez le combiner avec le filtre de
niveau de journalisation:

adb logcat <package-name>:<log level>

Vous pouvez également filtrer le journal à l'aide de grep (plus d'informations sur le filtrage des
résultats de logcat ici ):

adb logcat | grep <some text>

Dans Windows, le filtre peut être utilisé avec findstr, par exemple:

adb logcat | findstr <some text>

Pour afficher un autre tampon de journal [main | events | radio], exécutez le logcat avec l'option -b
:

adb logcat -b radio

Enregistrer la sortie dans le fichier:

adb logcat > logcat.txt

Enregistrez la sortie dans le fichier tout en le regardant:

adb logcat | tee logcat.txt

https://riptutorial.com/fr/home 52
Nettoyage des journaux:

adb logcat -c

Commande ADB directe vers un périphérique spécifique dans un paramètre


multi-périphérique

1. Ciblez un appareil par numéro de série

Utilisez l'option -s suivie d'un nom de périphérique pour sélectionner le périphérique sur lequel la
commande adb doit s'exécuter. Les options -s doivent être en première ligne, avant la commande.

adb -s <device> <command>

Exemple:

adb devices

List of devices attached


emulator-5554 device
02157df2d1faeb33 device

adb -s emulator-5554 shell

Exemple # 2:

adb devices -l

List of devices attached


06157df65c6b2633 device usb:1-3 product:zerofltexx model:SM_G920F device:zeroflte
LC62TB413962 device usb:1-5 product:a50mgp_dug_htc_emea model:HTC_Desire_820G_dual_sim
device:htc_a50mgp_dug

adb -s usb:1-3 shell

2. Ciblez un périphérique lorsque seul un type de périphérique est connecté

Vous pouvez cibler le seul émulateur en cours d'exécution avec -e

adb -e <command>

Ou vous pouvez cibler le seul périphérique USB connecté avec -d

adb -d <command>

Prendre une capture d'écran et une vidéo (pour kitkat uniquement) à partir
d'un écran de périphérique

https://riptutorial.com/fr/home 53
Capture d'écran: Option 1 (pure adb)
La commande shell adb nous permet d'exécuter des commandes à l'aide du shell intégré d'un
périphérique. La commande shell screencap capture le contenu actuellement visible sur un
périphérique et l'enregistre dans un fichier image donné, par exemple /sdcard/screen.png :

adb shell screencap /sdcard/screen.png

Vous pouvez ensuite utiliser la commande pull pour télécharger le fichier depuis le périphérique
dans le répertoire actuel de votre ordinateur:

adb pull /sdcard/screen.png

Capture d'écran: Option 2 (plus rapide)


Exécutez le one-liner suivant:

(Guimauve et plus tôt):

adb shell screencap -p | perl -pe 's/\x0D\x0A/\x0A/g' > screen.png

(Nougat et plus tard):

adb shell screencap -p > screen.png

L' -p redirige la sortie de la commande screencap vers stdout. L'expression Perl dans laquelle elle
est dirigée nettoie certains problèmes de fin de ligne sur Marshmallow et les versions antérieures.
Le flux est ensuite écrit dans un fichier nommé screen.png dans le répertoire en cours. Voir cet
article et cet article pour plus d'informations.

Vidéo
cela ne fonctionne que dans KitKat et via ADB uniquement. Cela ne fonctionne pas sous Kitkat
Pour commencer à enregistrer l'écran de votre appareil, exécutez la commande suivante:

adb shell screenrecord /sdcard/example.mp4 , Cette commande lance l'enregistrement de l'écran de


votre appareil en utilisant les paramètres par défaut et enregistre la vidéo résultante dans un
fichier dans le fichier /sdcard/example.mp4 de votre appareil.

Une fois l'enregistrement terminé, appuyez sur Ctrl + C (z sous Linux) dans la fenêtre d'invite de
commandes pour arrêter l'enregistrement à l'écran. Vous pouvez ensuite trouver le fichier
d'enregistrement d'écran à l'emplacement que vous avez spécifié. Notez que l'enregistrement
d'écran est enregistré dans la mémoire interne de votre appareil et non sur votre ordinateur.

https://riptutorial.com/fr/home 54
Les paramètres par défaut consistent à utiliser la résolution d'écran standard de votre appareil, à
encoder la vidéo à un débit de 4 Mbits / s et à définir la durée maximale d'enregistrement sur
l'écran à 180 secondes. Pour plus d'informations sur les options de ligne de commande que vous
pouvez utiliser, exécutez la commande suivante:

adb shell screenrecord –help , Cela fonctionne sans rooter le périphérique. J'espère que cela
t'aides.

Effacer les données d'application

On peut effacer les données d'utilisateur d'une application spécifique en utilisant adb :

adb shell pm clear <package>

C'est la même chose que pour parcourir les paramètres du téléphone, sélectionnez l'application et
appuyez sur le bouton Effacer les données.

• pm appelle le gestionnaire de paquets sur l'appareil


• clear supprime toutes les données associées à un package

Envoi de diffusion

Il est possible d'envoyer la diffusion à BroadcastReceiver avec adb .

Dans cet exemple, nous envoyons la diffusion avec l'action com.test.app.ACTION et la chaîne extra
dans le bundle 'foo'='bar' :

adb shell am broadcast -a action com.test.app.ACTION --es foo "bar"

Vous pouvez mettre tout autre type pris en charge pour regrouper, pas seulement les chaînes:

--ez - booléen
--ei - entier
--el - long
--ef - float
--eu - uri
--eia - int array (séparé par ',')
--ela - tableau long (séparé par ',')
--efa - tableau flottant (séparé par ',')
--esa - tableau de chaînes (séparé par ',')

Pour envoyer l'intention à un paquet / classe spécifique, le paramètre -n ou -p peut être utilisé.
Envoi à forfait:

-p com.test.app

Envoi d'un composant spécifique ( SomeReceiver de classe en com.test.app package ):

https://riptutorial.com/fr/home 55
-n com.test.app/.SomeReceiver

Exemples utiles:

• Envoi d'une diffusion "boot complete"


• Envoi d'une diffusion "heure changée" après mise à l'heure via la commande adb

Installer et exécuter une application

Pour installer un fichier APK , utilisez la commande suivante:

adb install path/to/apk/file.apk

ou si l'application existe et que nous souhaitons la réinstaller

adb install -r path/to/apk/file.apk

Pour désinstaller une application , il faut spécifier son package

adb uninstall application.package.name

Utilisez la commande suivante pour démarrer une application avec un nom de package fourni (ou
une activité spécifique dans une application):

adb shell am start -n adb shell am start <package>/<activity>

Par exemple, pour démarrer Waze:

adb shell am start -n adb shell am start com.waze/com.waze.FreeMapAppActivity

Sauvegarde

Vous pouvez utiliser la commande de adb backup pour sauvegarder votre appareil.

adb backup [-f <file>] [-apk|-noapk] [-obb|-noobb] [-shared|-noshared] [-all]


[-system|nosystem] [<packages...>]

-f <filename> spécifie le nom de fichier par défaut: crée une sauvegarde.ab dans le répertoire en
cours

-apk|noapk activer / désactiver la sauvegarde de .apks eux-mêmes par défaut: -noapk

-obb|noobb activer / désactiver la sauvegarde des fichiers supplémentaires par défaut: -noobb

-shared|nosharedpartagé / contenu de la carte SD du périphérique de sauvegarde -shared|noshared


par défaut: -noshared

-all sauvegarde tous les apllications installés

https://riptutorial.com/fr/home 56
-system|nosystem inclut les applications système par défaut: -system

<packages> une liste de paquets à sauvegarder (ex: com.example.android.myapp) (non nécessaire


si -all est spécifié)

Pour une sauvegarde complète du périphérique, y compris tout, utilisez

adb backup -apk -obb -shared -all -system -f fullbackup.ab

Remarque: La sauvegarde complète peut prendre beaucoup de temps.

Pour restaurer une sauvegarde, utilisez

adb restore backup.ab

Installer ADB sur un système Linux

Comment installer Android Debugging Bridge (ADB) sur un système Linux avec le terminal
utilisant les référentiels de votre distribution.

Installer sur le système Ubuntu / Debian via apt:

sudo apt-get update


sudo apt-get install adb

Installer sur le système Fedora / CentOS via yum:

sudo yum check-update


sudo yum install android-tools

Installer sur le système Gentoo avec portage:

sudo emerge --ask dev-util/android-tools

Installer sur le système openSUSE avec zypper:

sudo zypper refresh


sudo zypper install android-tools

Installer sur le système Arch avec pacman:

sudo pacman -Syyu


sudo pacman -S android-tools

Énumérer toutes les autorisations qui nécessitent une subvention d'exécution


des utilisateurs sur Android 6.0

https://riptutorial.com/fr/home 57
adb shell pm list permissions -g -d

Afficher les données internes d'une application (données / données / ) sur un


appareil

Tout d'abord, assurez-vous que votre application peut être sauvegardée dans AndroidManifest.xml
, à savoir android:allowBackup n'est pas false .

Commande de sauvegarde:

adb -s <device_id> backup -noapk <sample.package.id>

Créez un tar avec la commande dd:

dd if=backup.ab bs=1 skip=24 | python -c "import


zlib,sys;sys.stdout.write(zlib.decompress(sys.stdin.read()))" > backup.tar

Extraire le goudron:

tar -xvf backup.tar

Vous pouvez ensuite afficher le contenu extrait.

Afficher la pile d'activités

adb -s <serialNumber> shell dumpsys activity activities

Très utile lorsqu'il est utilisé avec la commande watch unix:

watch -n 5 "adb -s <serialNumber> shell dumpsys activity activities | sed -En -e '/Stack #/p'
-e '/Running activities/,/Run #0/p'"

Afficher et extraire les fichiers de cache d'une application

Vous pouvez utiliser cette commande pour répertorier les fichiers de votre propre apk déboguable:

adb shell run-as <sample.package.id> ls /data/data/sample.package.id/cache

Et ce script pour tirer du cache, cela copie le contenu à sdcard d'abord, le tire puis le supprime à
la fin:

#!/bin/sh
adb shell "run-as <sample.package.id> cat '/data/data/<sample.package.id>/$1' > '/sdcard/$1'"
adb pull "/sdcard/$1"
adb shell "rm '/sdcard/$1'"

Ensuite, vous pouvez extraire un fichier du cache comme ceci:

https://riptutorial.com/fr/home 58
./pull.sh cache/someCachedData.txt

Obtenir le fichier de base de données via ADB

sudo adb -d shell "run-as com.example.name cat /data/da/com.example.name


/databases/STUDENT_DATABASE > /sdcard/file

Lire ADB (Android Debug Bridge) en ligne: https://riptutorial.com/fr/android/topic/1051/adb--


android-debug-bridge-

https://riptutorial.com/fr/home 59
Chapitre 6: AdMob
Syntaxe
• compiler 'com.google.firebase: annonces firebase: 10.2.1' // REMARQUE: DÉFINIR LA
NOUVELLE VERSION SI DISPONIBLE
• <uses-permission android:name="android.permission.INTERNET" /> Obligatoire pour récupérer
l'annonce
• AdRequest adRequest = new AdRequest.Builder (). Build (); // Bannière publicitaire
• AdView mAdView = (AdView) findViewById (R.id.adView) // Annonce publicitaire
• mAdView.loadAd (adRequest); // Bannière publicitaire

Paramètres

Param Détails

L'ID de votre annonce. Obtenez votre identifiant sur le site admob.


"Bien que cela ne soit pas obligatoire, le stockage de vos valeurs
annonces: adUnitId =
d’identifiant de bloc d’annonces dans un fichier de ressources est
"@ string /
une bonne pratique. Au fur et à mesure que votre application se
main_screen_ad"
développe fichier, vous ne devez jamais chercher dans votre code à
leur recherche. " [ 1 ]

Remarques
• Nécessite un compte Admob valide
• Lisez la politique d'admob . Assurez-vous de ne rien faire qui puisse suspendre votre
compte d'admob

Examples
Exécution

Remarque: Cet exemple nécessite un compte Admob valide et un code d'annonce Admob valide.

Build.gradle au niveau de l'application


Passez à la dernière version si existante:

compile 'com.google.firebase:firebase-ads:10.2.1'

https://riptutorial.com/fr/home 60
Manifeste
L'autorisation Internet est requise pour accéder aux données d'annonce. Notez qu'il n'est pas
nécessaire de demander cette autorisation (en utilisant API 23+) car il s'agit d'une autorisation
normale et non dangereuse:

<uses-permission android:name="android.permission.INTERNET" />

XML
L'exemple XML suivant montre une bannière publicitaire:

<com.google.android.gms.ads.AdView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/adView"
ads:adSize="BANNER"
ads:adUnitId="@string/main_screen_ad" />

Pour le code d'autres types, reportez-vous à l' aide de Google AdMob .

Java
Le code suivant concerne l'intégration de bannières publicitaires. Notez que d'autres types
d'annonces peuvent nécessiter une intégration différente:

// Alternative for faster initialization.


// MobileAds.initialize(getApplicationContext(), "AD_UNIT_ID");

AdView mAdView = (AdView) findViewById(R.id.adView);


// Add your device test ID if you are doing testing before releasing.
// The device test ID can be found in the admob stacktrace.
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);

Ajoutez les méthodes de cycle de vie AdView dans les méthodes onResume() , onPause() et
onDestroy() de votre activité:

@Override
public void onPause() {
if (mAdView != null) {
mAdView.pause();
}
super.onPause();
}

@Override
public void onResume() {

https://riptutorial.com/fr/home 61
super.onResume();
if (mAdView != null) {
mAdView.resume();
}
}

@Override
public void onDestroy() {
if (mAdView != null) {
mAdView.destroy();
}
super.onDestroy();
}

Lire AdMob en ligne: https://riptutorial.com/fr/android/topic/5334/admob

https://riptutorial.com/fr/home 62
Chapitre 7: Affichage
Introduction
Tout ce qui concerne la personnalisation de TextView dans le SDK Android

Syntaxe
• TextView (contexte contextuel)
• (TextView) findViewById (int id)
• void setText (int resid)
• void setText (texte CharSequence) // Vous pouvez utiliser String comme argument

Remarques
Essayez de l'utiliser dans la conception XML ou par programme.

Examples
Textview avec une taille de texte différente

Vous pouvez archiver différents Textsizes dans une Textview avec un Span

TextView textView = (TextView) findViewById(R.id.textView);


Spannable span = new SpannableString(textView.getText());
span.setSpan(new RelativeSizeSpan(0.8f), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(span)

Personnalisation de TextView

public class CustomTextView extends TextView {

private float strokeWidth;


private Integer strokeColor;
private Paint.Join strokeJoin;
private float strokeMiter;

public CustomTextView(Context context) {


super(context);
init(null);
}

public CustomTextView(Context context, AttributeSet attrs) {


super(context, attrs);
init(attrs);
}

https://riptutorial.com/fr/home 63
public CustomTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(attrs);
}

public void init(AttributeSet attrs) {

if (attrs != null) {
TypedArray a = getContext().obtainStyledAttributes(attrs,
R.styleable.CustomTextView);

if (a.hasValue(R.styleable.CustomTextView_strokeColor)) {
float strokeWidth =
a.getDimensionPixelSize(R.styleable.CustomTextView_strokeWidth, 1);
int strokeColor = a.getColor(R.styleable.CustomTextView_strokeColor,
0xff000000);
float strokeMiter =
a.getDimensionPixelSize(R.styleable.CustomTextView_strokeMiter, 10);
Paint.Join strokeJoin = null;
switch (a.getInt(R.styleable.CustomTextView_strokeJoinStyle, 0)) {
case (0):
strokeJoin = Paint.Join.MITER;
break;
case (1):
strokeJoin = Paint.Join.BEVEL;
break;
case (2):
strokeJoin = Paint.Join.ROUND;
break;
}
this.setStroke(strokeWidth, strokeColor, strokeJoin, strokeMiter);
}
}
}

public void setStroke(float width, int color, Paint.Join join, float miter) {
strokeWidth = width;
strokeColor = color;
strokeJoin = join;
strokeMiter = miter;
}

@Override
public void onDraw(Canvas canvas) {
super.onDraw(canvas);

int restoreColor = this.getCurrentTextColor();


if (strokeColor != null) {
TextPaint paint = this.getPaint();
paint.setStyle(Paint.Style.STROKE);
paint.setStrokeJoin(strokeJoin);
paint.setStrokeMiter(strokeMiter);
this.setTextColor(strokeColor);
paint.setStrokeWidth(strokeWidth);
super.onDraw(canvas);
paint.setStyle(Paint.Style.FILL);
this.setTextColor(restoreColor);
}
}
}

https://riptutorial.com/fr/home 64
Usage:

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

CustomTextView customTextView = (CustomTextView) findViewById(R.id.pager_title);


}
}

Disposition:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@mipmap/background">

<pk.sohail.gallerytest.activity.CustomTextView
android:id="@+id/pager_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_centerVertical="true"
android:gravity="center"
android:text="@string/txt_title_photo_gallery"
android:textColor="@color/white"
android:textSize="30dp"
android:textStyle="bold"
app:outerShadowRadius="10dp"
app:strokeColor="@color/title_text_color"
app:strokeJoinStyle="miter"
app:strokeWidth="2dp" />

</RelativeLayout>

attars:

<?xml version="1.0" encoding="utf-8"?>


<resources>

<declare-styleable name="CustomTextView">

<attr name="outerShadowRadius" format="dimension" />


<attr name="strokeWidth" format="dimension" />
<attr name="strokeMiter" format="dimension" />
<attr name="strokeColor" format="color" />
<attr name="strokeJoinStyle">
<enum name="miter" value="0" />
<enum name="bevel" value="1" />
<enum name="round" value="2" />
</attr>
</declare-styleable>

https://riptutorial.com/fr/home 65
</resources>

Utilisation par programme:

CustomTextView mtxt_name = (CustomTextView) findViewById(R.id.pager_title);


//then use
setStroke(float width, int color, Paint.Join join, float miter);
//method before setting
setText("Sample Text");

TextView Spannable

Un TextView pouvant être TextView peut être utilisé dans Android pour mettre en évidence une
partie particulière du texte avec une couleur, un style, une taille et / ou un événement de clic
différents dans un seul widget TextView .

Considérer que vous avez défini un TextView comme suit:

TextView textview=findViewById(R.id.textview);

Ensuite, vous pouvez appliquer différentes mises en évidence comme indiqué ci-dessous:

• Couleur Spanable: pour définir une couleur différente sur une partie du texte, vous pouvez
utiliser ForegroundColorSpan , comme illustré dans l'exemple suivant:

Spannable spannable = new SpannableString(firstWord+lastWord);


spannable.setSpan(new ForegroundColorSpan(firstWordColor), 0, firstWord.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan(new ForegroundColorSpan(lastWordColor), firstWord.length(),
firstWord.length()+lastWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
textview.setText( spannable );

Sortie créée par le code ci-dessus:

• Police Spanable: pour définir une taille de police différente sur une partie du texte, vous
pouvez utiliser RelativeSizeSpan , comme illustré dans l'exemple suivant:

Spannable spannable = new SpannableString(firstWord+lastWord);


spannable.setSpan(new RelativeSizeSpan(1.1f),0, firstWord.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // set size
spannable.setSpan(new RelativeSizeSpan(0.8f), firstWord.length(), firstWord.length() +
lastWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); // set size
textview.setText( spannable );

Sortie créée par le code ci-dessus:

https://riptutorial.com/fr/home 66
• Police de caractères Spanable: pour définir une police de caractères différente sur une
partie du texte, vous pouvez utiliser un TypefaceSpan personnalisé, comme illustré dans
l'exemple suivant:

Spannable spannable = new SpannableString(firstWord+lastWord);


spannable.setSpan( new CustomTypefaceSpan("SFUIText-Bold.otf",fontBold), 0,
firstWord.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannable.setSpan( new CustomTypefaceSpan("SFUIText-Regular.otf",fontRegular),
firstWord.length(), firstWord.length() + lastWord.length(),
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
text.setText( spannable );

Cependant, pour que le code ci-dessus fonctionne, la classe CustomTypefaceSpan doit être
dérivée de la classe TypefaceSpan . Cela peut être fait comme suit:

public class CustomTypefaceSpan extends TypefaceSpan {


private final Typeface newType;

public CustomTypefaceSpan(String family, Typeface type) {


super(family);
newType = type;
}

@Override
public void updateDrawState(TextPaint ds) {
applyCustomTypeFace(ds, newType);
}

@Override
public void updateMeasureState(TextPaint paint) {
applyCustomTypeFace(paint, newType);
}

private static void applyCustomTypeFace(Paint paint, Typeface tf) {


int oldStyle;
Typeface old = paint.getTypeface();
if (old == null) {
oldStyle = 0;
} else {
oldStyle = old.getStyle();
}
int fake = oldStyle & ~tf.getStyle();
if ((fake & Typeface.BOLD) != 0) {
paint.setFakeBoldText(true);
}

if ((fake & Typeface.ITALIC) != 0) {


paint.setTextSkewX(-0.25f);
}

paint.setTypeface(tf);
}
}

https://riptutorial.com/fr/home 67
TextView avec image

Android permet aux programmeurs de placer des images aux quatre coins d'un TextView . Par
exemple, si vous créez un champ avec un objet TextView et que vous souhaitez montrer que le
champ est modifiable, les développeurs placent généralement une icône d'édition à proximité de
ce champ. Android nous offre une option intéressante appelée composé extractible pour un
TextView :

<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:drawablePadding="4dp"
android:drawableRight="@drawable/edit"
android:text="Hello world"
android:textSize="18dp" />

Vous pouvez définir le dessin sur n'importe quel côté de votre TextView comme suit:

android:drawableLeft="@drawable/edit"
android:drawableRight="@drawable/edit"
android:drawableTop="@drawable/edit"
android:drawableBottom="@drawable/edit"

Le paramétrage du dessin peut également être réalisé par programmation de la manière suivante:

yourTextView.setCompoundDrawables(leftDrawable, rightDrawable, topDrawable, bottomDrawable);

La définition de l'un des paramètres remis à setCompoundDrawables() sur null supprimera l'icône du
côté correspondant de TextView .

Texte barré

Barré le texte entier


String sampleText = "This is a test strike";
textView.setPaintFlags(tv.getPaintFlags()| Paint.STRIKE_THRU_TEXT_FLAG);
textView.setText(sampleText);

Output: Ceci est un test de frappe

Barré seulement des parties du texte


String sampleText = "This is a test strike";
SpannableStringBuilder spanBuilder = new SpannableStringBuilder(sampleText);

https://riptutorial.com/fr/home 68
StrikethroughSpan strikethroughSpan = new StrikethroughSpan();
spanBuilder.setSpan(
strikethroughSpan, // Span to add
0, // Start
4, // End of the span (exclusive)
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE // Text changes will not reflect in the strike
changing
);
textView.setText(spanBuilder);

Output: Ceci est un test de frappe

Personnalisation du thème et du style

MainActivity.java:

public class MainActivity extends AppCompatActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:custom="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical"
tools:context=".MainActivity">

<com.customthemeattributedemo.customview.CustomTextView
style="?mediumTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="@string/message_hello"
custom:font_family="@string/bold_font" />

<com.customthemeattributedemo.customview.CustomTextView
style="?largeTextStyle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="20dp"
android:text="@string/message_hello"
custom:font_family="@string/bold_font" />
</LinearLayout>

CustomTextView.java:

https://riptutorial.com/fr/home 69
public class CustomTextView extends TextView {

private static final String TAG = "TextViewPlus";


private Context mContext;

public CustomTextView(Context context) {


super(context);
mContext = context;
}

public CustomTextView(Context context, AttributeSet attrs) {


super(context, attrs);
mContext = context;
setCustomFont(context, attrs);
}

public CustomTextView(Context context, AttributeSet attrs, int defStyle) {


super(context, attrs, defStyle);
mContext = context;
setCustomFont(context, attrs);
}

private void setCustomFont(Context ctx, AttributeSet attrs) {


TypedArray customFontNameTypedArray = ctx.obtainStyledAttributes(attrs,
R.styleable.CustomTextView);
String customFont =
customFontNameTypedArray.getString(R.styleable.CustomTextView_font_family);
Typeface typeface = null;
typeface = Typeface.createFromAsset(ctx.getAssets(), customFont);
setTypeface(typeface);
customFontNameTypedArray.recycle();
}
}

attrs.xml:

<?xml version="1.0" encoding="utf-8"?>


<resources>

<attr name="mediumTextStyle" format="reference" />


<attr name="largeTextStyle" format="reference" />

<declare-styleable name="CustomTextView">

<attr name="font_family" format="string" />


<!--- Your other attributes -->

</declare-styleable>
</resources>

strings.xml:

<resources>
<string name="app_name">Custom Style Theme Attribute Demo</string>
<string name="message_hello">Hello Hiren!</string>

<string name="bold_font">bold.ttf</string>
</resources>

https://riptutorial.com/fr/home 70
styles.xml:

<resources>

<!-- Base application theme. -->


<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>

<item name="mediumTextStyle">@style/textMedium</item>
<item name="largeTextStyle">@style/textLarge</item>
</style>

<style name="textMedium" parent="textParentStyle">


<item name="android:textAppearance">@android:style/TextAppearance.Medium</item>
</style>

<style name="textLarge" parent="textParentStyle">


<item name="android:textAppearance">@android:style/TextAppearance.Large</item>
</style>

<style name="textParentStyle">
<item name="android:textColor">@android:color/white</item>
<item name="android:background">@color/colorPrimary</item>
<item name="android:padding">5dp</item>
</style>

</resources>

Rendre RelativeSizeSpan aligné sur le haut

Pour rendre un RelativeSizeSpan aligné sur le haut, une classe personnalisée peut être dérivée de
la classe SuperscriptSpan . Dans l'exemple suivant, la classe dérivée est nommée
TopAlignSuperscriptSpan :

activity_main.xml:

<TextView
android:id="@+id/txtView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:textSize="26sp" />

MainActivity.java:

TextView txtView = (TextView) findViewById(R.id.txtView);

SpannableString spannableString = new SpannableString("RM123.456");


spannableString.setSpan( new TopAlignSuperscriptSpan( (float)0.35 ), 0, 2,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE );
txtView.setText(spannableString);

https://riptutorial.com/fr/home 71
TopAlignSuperscriptSpan.java:

private class TopAlignSuperscriptSpan extends SuperscriptSpan {


//divide superscript by this number
protected int fontScale = 2;

//shift value, 0 to 1.0


protected float shiftPercentage = 0;

//doesn't shift
TopAlignSuperscriptSpan() {}

//sets the shift percentage


TopAlignSuperscriptSpan( float shiftPercentage ) {
if( shiftPercentage > 0.0 && shiftPercentage < 1.0 )
this.shiftPercentage = shiftPercentage;
}

@Override
public void updateDrawState( TextPaint tp ) {
//original ascent
float ascent = tp.ascent();

//scale down the font


tp.setTextSize( tp.getTextSize() / fontScale );

//get the new font ascent


float newAscent = tp.getFontMetrics().ascent;

//move baseline to top of old font, then move down size of new font
//adjust for errors with shift percentage
tp.baselineShift += ( ascent - ascent * shiftPercentage )
- (newAscent - newAscent * shiftPercentage );
}

@Override
public void updateMeasureState( TextPaint tp ) {
updateDrawState( tp );
}
}

Capture d'écran de référence:

https://riptutorial.com/fr/home 72
Pinchzoom sur TextView

activity_main.xml :

<?xml version="1.0" encoding="utf-8"?>


<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >

<TextView
android:id="@+id/mytv"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:text="This is my sample text for pinch zoom demo, you can zoom in and out
using pinch zoom, thanks" />

</RelativeLayout>

MainActivity.java :

import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

public class MyTextViewPinchZoomClass extends Activity implements OnTouchListener {

final static float STEP = 200;


TextView mytv;
float mRatio = 1.0f;
int mBaseDist;
float mBaseRatio;
float fontsize = 13;

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

mytv = (TextView) findViewById(R.id.mytv);


mytv.setTextSize(mRatio + 13);
}

public boolean onTouchEvent(MotionEvent event) {


if (event.getPointerCount() == 2) {
int action = event.getAction();
int pureaction = action & MotionEvent.ACTION_MASK;
if (pureaction == MotionEvent.ACTION_POINTER_DOWN) {
mBaseDist = getDistance(event);
mBaseRatio = mRatio;
} else {
float delta = (getDistance(event) - mBaseDist) / STEP;
float multi = (float) Math.pow(2, delta);
mRatio = Math.min(1024.0f, Math.max(0.1f, mBaseRatio * multi));

https://riptutorial.com/fr/home 73
mytv.setTextSize(mRatio + 13);
}
}
return true;
}

int getDistance(MotionEvent event) {


int dx = (int) (event.getX(0) - event.getX(1));
int dy = (int) (event.getY(0) - event.getY(1));
return (int) (Math.sqrt(dx * dx + dy * dy));
}

public boolean onTouch(View v, MotionEvent event) {


return false;
}
}

Single TextView avec deux couleurs différentes

Le texte coloré peut être créé en transmettant le texte et un nom de couleur de police à la fonction
suivante:

private String getColoredSpanned(String text, String color) {


String input = "<font color=" + color + ">" + text + "</font>";
return input;
}

Le texte en couleur peut alors être défini sur un TextView (ou même sur un Button , EditText , etc.)
en utilisant l'exemple de code ci-dessous.

Tout d'abord, définissez un TextView comme suit:

TextView txtView = (TextView)findViewById(R.id.txtView);

Ensuite, créez un texte de couleur différente et assignez-le aux chaînes:

String name = getColoredSpanned("Hiren", "#800000");


String surName = getColoredSpanned("Patel","#000080");

Enfin, définissez les deux chaînes de couleurs différentes sur le TextView :

txtView.setText(Html.fromHtml(name+" "+surName));

Capture d'écran de référence:

https://riptutorial.com/fr/home 74
Lire Affichage en ligne: https://riptutorial.com/fr/android/topic/4212/affichage

https://riptutorial.com/fr/home 75
Chapitre 8: Affichage des annonces Google
Examples
Configuration de base de l'annonce

Vous devrez ajouter les éléments suivants à vos dépendances:

compile 'com.google.firebase:firebase-ads:10.2.1'

puis mettez ceci dans le même fichier.

apply plugin: 'com.google.gms.google-services'

Ensuite, vous devrez ajouter des informations pertinentes dans votre fichier strings.xml.

<string name="banner_ad_unit_id">ca-app-pub-####/####</string>

Ensuite, placez un avis là où vous le souhaitez et modifiez-le comme n'importe quelle autre vue.

<com.google.android.gms.ads.AdView
android:id="@+id/adView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_alignParentBottom="true"
ads:adSize="BANNER"
ads:adUnitId="@string/banner_ad_unit_id">
</com.google.android.gms.ads.AdView>

Et last but not least, lancez ceci dans votre onCreate.

MobileAds.initialize(getApplicationContext(), "ca-app-pub-YOUR_ID");
AdView mAdView = (AdView) findViewById(R.id.adView);
AdRequest adRequest = new AdRequest.Builder().build();
mAdView.loadAd(adRequest);

Si vous copiez-collé exactement, vous devriez maintenant avoir une petite bannière publicitaire.
Placez simplement plus de vues AdViews partout où vous en avez besoin pour plus.

Ajouter une annonce interstitielle

Les annonces interstitielles sont des annonces en plein écran qui couvrent l'interface de leur
application hôte. Ils sont généralement affichés à des points de transition naturels dans le flux
d'une application, par exemple entre les activités ou pendant la pause entre les niveaux d'un jeu.

Assurez-vous de disposer des autorisations nécessaires dans votre fichier Manifest :

<uses-permission android:name="android.permission.INTERNET" />


<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

https://riptutorial.com/fr/home 76
1. Accédez à votre compte AdMob .

2. Cliquez sur l'onglet Monétiser .

3. Sélectionnez ou créez l'application et choisissez la plate-forme.

4. Sélectionnez Interstitial et indiquez un nom de bloc d'annonces.

5. Une fois le bloc d'annonces créé, vous pouvez remarquer l'ID du bloc d'annonces sur le
tableau de bord. Par exemple: ca-app-pub-00000000000/000000000

6. Ajouter des dépendances

compile 'com.google.firebase:firebase-ads:10.2.1'

Celui-ci devrait être en bas.

apply plugin: 'com.google.gms.google-services'

Ajoutez votre identifiant de bloc d'annonces à votre strings.xml

<string name="interstitial_full_screen">ca-app-pub-00000000/00000000</string>

Ajoutez ConfigChanges et métadonnées à votre manifeste:

<activity
android:name="com.google.android.gms.ads.AdActivity"

android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|uiMode|screenSize|smallestScree

android:theme="@android:style/Theme.Translucent" />

et

<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

Activité:

public class AdActivity extends AppCompatActivity {

private String TAG = AdActivity.class.getSimpleName();


InterstitialAd mInterstitialAd;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);

mInterstitialAd = new InterstitialAd(this);

https://riptutorial.com/fr/home 77
// set the ad unit ID
mInterstitialAd.setAdUnitId(getString(R.string.interstitial_full_screen));

AdRequest adRequest = new AdRequest.Builder()


.build();

// Load ads into Interstitial Ads


mInterstitialAd.loadAd(adRequest);

mInterstitialAd.setAdListener(new AdListener() {
public void onAdLoaded() {
showInterstitial();
}
});
}

private void showInterstitial() {


if (mInterstitialAd.isLoaded()) {
mInterstitialAd.show();
}
}

Cette AdActivity affichera maintenant une annonce en plein écran.

Lire Affichage des annonces Google en ligne:


https://riptutorial.com/fr/android/topic/5984/affichage-des-annonces-google

https://riptutorial.com/fr/home 78
Chapitre 9: AIDL
Introduction
AIDL est un langage de définition d'interface Android.

Quelle? Pourquoi? Comment ?

Quelle? C'est un service limité. Ce service AIDL sera actif jusqu'à ce qu'au moins l'un des clients
existe. Il fonctionne sur la base du concept de marshaling et unmarshaling.

Pourquoi? Les applications distantes peuvent accéder à votre service + Multi Threading (demande
d’application distante).

Comment? Créez le fichier .aidl Implémentez l'interface Exposez l'interface aux clients

Examples
Service AIDL

ICalculator.aidl

// Declare any non-default types here with import statements

interface ICalculator {
int add(int x,int y);
int sub(int x,int y);
}

AidlService.java

public class AidlService extends Service {

private static final String TAG = "AIDLServiceLogs";


private static final String className = " AidlService";

public AidlService() {
Log.i(TAG, className+" Constructor");
}

@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
Log.i(TAG, className+" onBind");
return iCalculator.asBinder();
}

@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, className+" onCreate");

https://riptutorial.com/fr/home 79
}

@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, className+" onDestroy");
}

ICalculator.Stub iCalculator = new ICalculator.Stub() {


@Override
public int add(int x, int y) throws RemoteException {
Log.i(TAG, className+" add Thread Name: "+Thread.currentThread().getName());
int z = x+y;
return z;
}

@Override
public int sub(int x, int y) throws RemoteException {
Log.i(TAG, className+" add Thread Name: "+Thread.currentThread().getName());
int z = x-y;
return z;
}
};

Connexion de service

// Return the stub as interface


ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.i(TAG, className + " onServiceConnected");
iCalculator = ICalculator.Stub.asInterface(service);
}

@Override
public void onServiceDisconnected(ComponentName name) {

unbindService(serviceConnection);
}
};

Lire AIDL en ligne: https://riptutorial.com/fr/android/topic/9504/aidl

https://riptutorial.com/fr/home 80
Chapitre 10: Ajout d'un FuseView à un projet
Android
Introduction
Exportez un Fuse.View depuis fusetools et utilisez-le dans un projet Android existant.

Notre objectif est d'exporter la totalité de l' application hikr et de l'utiliser dans une Activity .

Le travail final peut être trouvé @ lucamtudor / hikr-fuse-view

Examples
hikr app, juste un autre android.view.View

Conditions préalables

• vous devriez avoir un fusible installé ( https://www.fusetools.com/downloads)


• vous devriez avoir fait le tutoriel d'introduction
• dans le terminal: fuse install android
• dans le terminal: uno install Fuse.Views

Étape 1

git clone https://github.com/fusetools/hikr

Étape 2 : Ajouter une référence de package à Fuse.Views

Recherchez le fichier hikr.unoproj dans le dossier racine du projet et ajoutez "Fuse.Views" au


tableau "Packages" .

{
"RootNamespace":"",
"Packages": [
"Fuse",
"FuseJS",
"Fuse.Views"
],
"Includes": [
"*",
"Modules/*.js:Bundle"
]
}

https://riptutorial.com/fr/home 81
Étape 3 : Créer le composant HikrApp pour conserver l'application entière

3.1 Dans le dossier racine du projet, créez un nouveau fichier appelé HikrApp.ux et collez le
contenu de MainView.ux .

HikrApp.ux

<App Background="#022328">
<iOS.StatusBarConfig Style="Light" />
<Android.StatusBarConfig Color="#022328" />

<Router ux:Name="router" />

<ClientPanel>
<Navigator DefaultPath="splash">
<SplashPage ux:Template="splash" router="router" />
<HomePage ux:Template="home" router="router" />
<EditHikePage ux:Template="editHike" router="router" />
</Navigator>
</ClientPanel>
</App>

3.2 Dans HikrApp.ux

• remplacer les balises <App> par <Page>


• add ux:Class="HikrApp" à l'ouverture <Page>
• remove <ClientPanel> , nous n'avons plus à nous soucier de la barre d'état ou des boutons
de navigation du bas

HikrApp.ux

<Page ux:Class="HikrApp" Background="#022328">


<iOS.StatusBarConfig Style="Light" />
<Android.StatusBarConfig Color="#022328" />

<Router ux:Name="router" />

<Navigator DefaultPath="splash">
<SplashPage ux:Template="splash" router="router" />
<HomePage ux:Template="home" router="router" />
<EditHikePage ux:Template="editHike" router="router" />
</Navigator>
</Page>

3.3 Utilisez le nouveau HikrApp composant à l' intérieur MainView.ux

Remplacez le contenu du fichier MainView.ux par:

<App>
<HikrApp/>
</App>

Notre application est de retour à son comportement normal, mais nous l'avons maintenant extrait
d'un composant distinct appelé HikrApp

https://riptutorial.com/fr/home 82
Étape 4 Dans MainView.ux remplacez les balises <App> par <ExportedViews> et ajoutez
ux:Template="HikrAppView" à <HikrApp />

<ExportedViews>
<HikrApp ux:Template="HikrAppView" />
</ExportedViews>

Rappelez-vous le modèle HikrAppView , car nous en aurons besoin pour obtenir une référence à
notre vue depuis Java.

Note À partir des documents de fusibles:

ExportedViews se comportera comme une App lors de la fuse preview normale des fuse
preview et lors de la uno build

Pas vrai. Vous obtiendrez cette erreur lors de la prévisualisation depuis Fuse Studio:

Erreur: Impossible de trouver une balise App dans l'un des fichiers UX inclus. Avez-
vous oublié d'inclure le fichier UX contenant la balise d'application?

Étape 5 SplashPage.ux le <DockPanel> dans un <GraphicsView>

<Page ux:Class="SplashPage">
<Router ux:Dependency="router" />

<JavaScript File="SplashPage.js" />

<GraphicsView>
<DockPanel ClipToBounds="true">
<Video Layer="Background" File="../Assets/nature.mp4" IsLooping="true"
AutoPlay="true" StretchMode="UniformToFill" Opacity="0.5">
<Blur Radius="4.75" />
</Video>

<hikr.Text Dock="Bottom" Margin="10" Opacity=".5" TextAlignment="Center"


FontSize="12">original video by Graham Uhelski</hikr.Text>

<Grid RowCount="2">
<StackPanel Alignment="VerticalCenter">
<hikr.Text Alignment="HorizontalCenter" FontSize="70">hikr</hikr.Text>
<hikr.Text Alignment="HorizontalCenter" Opacity=".5">get out
there</hikr.Text>
</StackPanel>

<hikr.Button Text="Get Started" FontSize="18" Margin="50,0"


Alignment="VerticalCenter" Clicked="{goToHomePage}" />
</Grid>
</DockPanel>
</GraphicsView>

https://riptutorial.com/fr/home 83
</Page>

Étape 6 Exportez le projet de fusible en tant que bibliothèque aar

• dans le terminal, dans le dossier du projet racine: uno clean


• dans le terminal, dans le dossier du projet racine: uno build -t=android -DLIBRARY

Étape 7 Préparez votre projet Android

• copier l'arar de .../rootHikeProject/build/Android/Debug/app/build/outputs/aar/app-debug.aar


vers .../androidRootProject/app/libs
• Ajouter flatDir { dirs 'libs' } au fichier racine build.gradle

// Top-level build file where you can add configuration options common to all sub-
projects/modules.

buildscript { ... }

...

allprojects {
repositories {
jcenter()
flatDir {
dirs 'libs'
}
}
}

...

• ajouter compile(name: 'app-debug', ext: 'aar') aux dépendances dans app/build.gradle

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
applicationId "com.shiftstudio.fuseviewtest"
minSdkVersion 16
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

https://riptutorial.com/fr/home 84
}

dependencies {
compile(name: 'app-debug', ext: 'aar')
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
testCompile 'junit:junit:4.12'
}

• Ajoutez les propriétés suivantes à l'activité dans AndroidManifest.xml

android:launchMode="singleTask"
android:taskAffinity=""
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize"

Votre AndroidManifest.xml ressemblera à ceci:

<?xml version="1.0" encoding="utf-8"?>


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.shiftstudio.fuseviewtest">

<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity
android:name=".MainActivity"
android:launchMode="singleTask"
android:taskAffinity=""
android:configChanges="orientation|keyboardHidden|screenSize|smallestScreenSize">
<intent-filter>
<action android:name="android.intent.action.MAIN" />

<category android:name="android.intent.category.LAUNCHER" />


</intent-filter>
</activity>
</application>

</manifest>

Étape 8 : Afficher le Fuse.View HikrAppView dans votre Activity

• Notez que votre Activity doit hériter de FuseViewsActivity

public class MainActivity extends FuseViewsActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

https://riptutorial.com/fr/home 85
setContentView(R.layout.activity_main);

final ViewHandle fuseHandle = ExportedViews.instantiate("HikrAppView");

final FrameLayout root = (FrameLayout) findViewById(R.id.fuse_root);


final View fuseApp = fuseHandle.getView();
root.addView(fuseApp);
}
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.shiftstudio.fuseviewtest.MainActivity">

<TextView
android:layout_width="wrap_content"
android:layout_gravity="center_horizontal"
android:textSize="24sp"
android:textStyle="bold"
android:layout_height="wrap_content"
android:text="Hello World, from Kotlin" />

<FrameLayout
android:id="@+id/fuse_root"
android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
android:layout_width="wrap_content"
android:text="THIS IS FROM NATIVE.\nBEHIND FUSE VIEW"
android:layout_gravity="center"
android:textStyle="bold"
android:textSize="30sp"
android:background="@color/colorAccent"
android:textAlignment="center"
android:layout_height="wrap_content" />

</FrameLayout>

</LinearLayout>

Remarque
Lorsque vous appuyez sur le bouton de retour, sur Android, l'application se bloque. Vous pouvez
suivre le problème sur le forum des fusibles .

https://riptutorial.com/fr/home 86
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadcab1 in tid 18026
(io.fuseviewtest)

[ 05-25 11:52:33.658 16567:16567 W/ ]

debuggerd: handling request: pid=18026 uid=10236 gid=10236 tid=18026

Et le résultat final est quelque chose comme ça. Vous pouvez également trouver un court clip sur
github .

https://riptutorial.com/fr/home 87
https://riptutorial.com/fr/home 88
https://riptutorial.com/fr/android/topic/10052/ajout-d-un-fuseview-a-un-projet-android

https://riptutorial.com/fr/home 89
Chapitre 11: AlarmManager
Examples
Exécuter une intention ultérieurement

1. Créez un récepteur. Cette classe recevra l'intention et la traitera comme vous le souhaitez.

public class AlarmReceiver extends BroadcastReceiver


{
@Override
public void onReceive(Context context, Intent intent)
{
// Handle intent
int reqCode = intent.getExtras().getInt("requestCode");
...
}
}

2. Donnez une intention à AlarmManager. Cet exemple déclenchera l'intention d'être envoyé à
AlarmReceiver après 1 minute.

final int requestCode = 1337;


AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent,
PendingIntent.FLAG_UPDATE_CURRENT);
am.set( AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 60000 , pendingIntent );

Comment annuler une alarme

Si vous souhaitez annuler une alarme et que vous n'avez pas de référence au PendingIntent
d'origine utilisé pour définir l'alarme, vous devez recréer un PendingIntent exactement comme lors
de sa création initiale.

Un Intent est considéré comme égal par le AlarmManager :

si leur action, données, type, classe et catégories sont les mêmes. Cela ne compare
aucune donnée supplémentaire incluse dans les intentions.

Le code de demande de chaque alarme est généralement défini comme une constante:

public static final int requestCode = 9999;

Donc, pour une simple alarme configurée comme ceci:

Intent intent = new Intent(this, AlarmReceiver.class);


intent.setAction("SomeAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent,

https://riptutorial.com/fr/home 90
PendingIntent.FLAG_UPDATE_CURRENT);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
alarmManager.setExact(AlarmManager.RTC_WAKEUP, targetTimeInMillis, pendingIntent);

Voici comment créer une nouvelle référence PendingIntent que vous pouvez utiliser pour annuler
l’alarme avec une nouvelle référence AlarmManager:

Intent intent = new Intent(this, AlarmReceiver.class);


intent.setAction("SomeAction");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, requestCode, intent,
PendingIntent.FLAG_NO_CREATE);
AlarmManager alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE);
if(pendingIntent != null) {
alarmManager.cancel(pendingIntent);
}

Création d'alarmes exactes sur toutes les versions Android

Avec de plus en plus d'optimisations de la batterie dans le système Android au fil du temps, les
méthodes du AlarmManager ont également considérablement changé (pour permettre une
synchronisation plus souple). Cependant, pour certaines applications, il doit toujours être aussi
précis que possible sur toutes les versions Android. L'assistant suivant utilise la méthode la plus
précise disponible sur toutes les plates-formes pour planifier un PendingIntent :

public static void setExactAndAllowWhileIdle(AlarmManager alarmManager, int type, long


triggerAtMillis, PendingIntent operation) {
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M){
alarmManager.setExactAndAllowWhileIdle(type, triggerAtMillis, operation);
} else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
alarmManager.setExact(type, triggerAtMillis, operation);
} else {
alarmManager.set(type, triggerAtMillis, operation);
}
}

Le mode API23 + Doze interfère avec AlarmManager

Android 6 (API23) a introduit le mode Doze qui interfère avec AlarmManager. Il utilise certaines
fenêtres de maintenance pour gérer les alarmes. Même si vous avez utilisé
setExactAndAllowWhileIdle() vous ne pouvez pas vous assurer que votre alarme se déclenche au
moment voulu.

Vous pouvez désactiver ce comportement pour votre application en utilisant les paramètres de
votre téléphone ( Settings/General/Battery & power saving/Battery usage/Ignore optimizations ou
similaire)

Dans votre application, vous pouvez vérifier ce paramètre ...

String packageName = getPackageName();


PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm.isIgnoringBatteryOptimizations(packageName)) {
// your app is ignoring Doze battery optimization

https://riptutorial.com/fr/home 91
}

... et éventuellement afficher la boîte de dialogue des paramètres respectifs:

Intent intent = new Intent();


String packageName = getPackageName();
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
intent.setAction(Settings.ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONS);
intent.setData(Uri.parse("package:" + packageName));
startActivity(intent);

Lire AlarmManager en ligne: https://riptutorial.com/fr/android/topic/1361/alarmmanager

https://riptutorial.com/fr/home 92
Chapitre 12: Amélioration des dialogues
d'alerte
Introduction
Cette rubrique concerne l'amélioration d'un AlertDialog avec des fonctionnalités supplémentaires.

Examples
Boîte de dialogue d'alerte contenant un lien cliquable

Pour afficher une boîte de dialogue contenant un lien pouvant être ouvert en cliquant dessus, vous
pouvez utiliser le code suivant:

AlertDialog.Builder builder1 = new AlertDialog.Builder(youractivity.this);

builder1.setMessage(Html.fromHtml("your message,<a href=\"http://www.google.com\">link</a>"));

builder1.setCancelable(false);
builder1.setPositiveButton("ok", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});

AlertDialog Alert1 = builder1.create();


Alert1 .show();
((TextView)Alert1.findViewById(android.R.id.message)).setMovementMethod(LinkMovementMethod.getInstance(

Lire Amélioration des dialogues d'alerte en ligne:


https://riptutorial.com/fr/android/topic/10163/amelioration-des-dialogues-d-alerte

https://riptutorial.com/fr/home 93
Chapitre 13: Amélioration des performances
Android à l'aide des polices Icon
Remarques
Les polices d'icône sont comme les types de police normaux qui ont des symboles au lieu de
lettres. Il peut être utilisé dans votre application avec le plus de facilité.

Elles sont:

• Flexible
• Évolutive
• Vecteurs
• Processable Rapide
• Poids léger
• Accessible

Effet sur la taille

L'exportation d'une image de différentes tailles pour des appareils Android coûterait à votre
application une taille d'actif supplémentaire d'environ 30 Ko par image. Tout en ajoutant un fichier
de polices (.ttf) avec environ 36 icônes, cela ne coûterait que 9 Ko. Imaginez le cas si vous
ajoutez 36 fichiers individuels de différentes configurations, ce serait environ 1000 Ko. C'est une
quantité raisonnable d'espace que vous économiserez en utilisant des polices d'icônes.

Limites des polices Icon.

• Les polices d'icônes peuvent être utilisées dans le tiroir de navigation. Leur utilisation dans
les vues de navigation en tant qu'icône des éléments de menu n'est pas possible car le
fichier de menu ne peut pas être créé sans spécifier le titre. Il est donc conseillé d'utiliser les
fichiers svg comme ressources pour ces icônes.

• Les polices d'icône ne peuvent pas être utilisées dans un bouton d'action flottant. comme ils
n'ont pas d'attribut setText() .

• Les polices externes ne peuvent pas être appliquées à partir de XML. Ils doivent être
spécifiés en utilisant le fichier java. Ou bien vous devez étendre la vue de base et créer une
vue telle que spécifiée dans cet article.

Examples
Comment intégrer les polices Icon

Pour utiliser les polices d'icônes, suivez simplement les étapes ci-dessous:

https://riptutorial.com/fr/home 94
• Ajouter le fichier de police à votre projet

Vous pouvez créer votre fichier d'icône de police à partir de sites Web en ligne tels que
icomoon , où vous pouvez télécharger des fichiers SVG contenant les icônes requises, puis
télécharger la police d'icône créée. Ensuite, placez le fichier de police .ttf dans un dossier
nommé polices (nommez-le comme vous le souhaitez) dans le dossier assets:

• Créer une classe d'assistance

Maintenant, créez la classe d'assistance suivante afin d'éviter de répéter le code


d'initialisation de la police:

public class FontManager {


public static final String ROOT = "fonts/";
FONT_AWESOME = ROOT + "myfont.ttf";
public static Typeface getTypeface(Context context) {
return Typeface.createFromAsset(context.getAssets(), FONT_AWESOME);
}
}

Vous pouvez utiliser la classe Typeface pour sélectionner la police à partir des actifs. De cette
façon, vous pouvez définir la police sur différentes vues, par exemple sur un bouton:

Button button=(Button) findViewById(R.id.button);


Typeface iconFont=FontManager.getTypeface(getApplicationContext());
button.setTypeface(iconFont);

Maintenant, la police de caractères du bouton a été remplacée par la police d’icône


nouvellement créée.

• Ramassez les icônes que vous voulez

Ouvrez le fichier styles.css attaché à la police d'icône. Vous y trouverez les styles avec les
caractères Unicode de vos icônes:

https://riptutorial.com/fr/home 95
.icon-arrow-circle-down:before {
content: “\e001”;
}
.icon-arrow-circle-left:before {
content: “\e002”;
}
.icon-arrow-circle-o-down:before {
content: “\e003”;
}
.icon-arrow-circle-o-left:before {
content: “\e004”;
}

Ce fichier de ressources servira de dictionnaire, qui associe le caractère Unicode associé à


une icône spécifique à un nom lisible par l'homme. Maintenant, créez les ressources de
chaîne comme suit:

<resources>
<! — Icon Fonts -->
<string name=”icon_arrow_circle_down”>&#xe001; </string>
<string name=”icon_arrow_circle_left”>&#xe002; </string>
<string name=”icon_arrow_circle-o_down”>&#x