SlideShare una empresa de Scribd logo
1 de 84
Descargar para leer sin conexión
GDG Finistère
2013-11-30

Avec le soutien de :
Avec le soutien de :
Horacio Gonzalez
Spaniard lost in Brittany, Java developer,
dreamer and all-around geek
● Senior Software Engineer at Cityzen Data
○

Cityzen Data provides a scalable, secure, ethical
and open platform for sensor data

● Leader du FinistJUG, du GDG Finistère
et de la communauté BreizhBeans
http://lostinbrittany.org/
+Horacio.Gonzalez
@LostInBrittany
Avec le soutien de :
Stéphane Castrec
Ingénieur logiciel.
Passionné par l'innovation et
le développement mobile.
● Crédit Mutuel Arkea

http://stephanecastrec.info
@_Stephane_

Avec le soutien de :
Qui-sommes nous ?
● FinistJUG :
Java User Group du Finistère
http://finistjug.fr
@FinistJUG
● GDG Finistère :
Google Developers Group du Finistère
http://finistgdg.fr
@FinistGDG
Avec le soutien de :
Avec le soutien de :
C’est quoi Android ?
● Système d'exploitation sur noyau Linux

Image : newcircle

Avec le soutien de :
Dalvik ?
Machine virtuelle open-source utilisée
sur Android
● Exécutant des fichiers .dex
○
○
○

Format différent du bytecode Java
Instructions basées sur des registres
■ pas sur une pile comme en Java
Avec des optimisations
■ pas de duplication de Strings
constantes…

● Espace d’addressage 32 bits
● Pas compatible avec une JVM
Le compilateur Dex compile le
bytecode Java en bytecode Dex
Avec le soutien de :
Terminaux Android
Partout !
●
●
●
●
●
●
●
●

Smartphones
Tablettes
Netbooks
Téléviseurs
Autoradios
Domotique
Open-hardware
...

Image : Android Community

Avec le soutien de :
Quelques chiffres
● 900 millions de terminaux activés
● 1,5 millions d’activations par jour
● 50 milliards d’applications installés

Terminaux activés
●
●
●

2011 : 100 millions
2012 : 400 millions
2013 : 900 millions

Avec le soutien de :
Avec le soutien de :
Du point de vue d’un développeur
Des points forts :
● Développement en Java
● Un SDK complet, open-source et multi-plateforme
○ Des IDEs basés sur des outils confirmés
■ IntelliJ IDEA et Eclipse
○ Des exemples, de la documentation
○ Des APIs riches
○ Un émulateur
Avec le soutien de :
Android Studio
● Nouveu IDE pour Android
○
○
○

○

Basé sur IntelliJ IDEA
Actuellement en v.0.3.x
IDE Android complet
■ Syntaxe, refactoring, corrections, templates
■ Editeur graphique d’écrans (layouts)
■ Émulateur des diifférents terminaux
Outillage additionnel :
■ Construction : Gradle
■ Performance : Lint
■ Signature d’applications : ProGuard

● Ancien IDE encore disponible
○
○

Eclipse IDE avec ADT (Android Developer Tools)
Presque aussi complet que Android Studio
■ Mais il n’évoluera plus
Avec le soutien de :
Fondements d’une application
● Applications écrites en Java
● Compilation avec SDK Android
○ Génération d’un fichier .apk

● Les applications tournent dans un sandbox
○ User, VM et processus Linux isolés par application
○ Principe du moindre de privilèges

● Communication entre applications

Avec le soutien de :
Avec le soutien de :
Arborescence
●

/src
○ /src/java
○

○
●

/src/res
■ /src/res/layout
■ /src/res/menu
■ /src/res/values-xxx
■ /src/res/drawable-xxx
/src/AndroidManifest.xml

/build.gradle

Avec le soutien de :
Anatomie d’une application Android
●
●
●
●
●
●
●

Activities
Services
Content Providers
Intents & Intent Filters
Processes & Threads
Permissions
Manifest

Image : Android4Fans

Avec le soutien de :
Avec le soutien de :
Activités (Activities)
● Une Activité peut être assimilée à un écran qu’une
application propose à son utilisateur
○

La transition entre deux écrans correspond au lancement d’une
Activité ou au retour sur une Activité placée en arrière-plan

● Une Activité est composée de deux volets :
○

La logique et la gestion du cycle de vie
■ Implémentées en Java dans une classe héritant de Activity

○

L'interface utilisateur, qui peut être définie
■ Soit dans le code de l’Activité
■ Soit dans un gabarit (layout)
● Fichier XML placé dans les ressources de l’application
● Approche plus générale à favoriser
Avec le soutien de :
Plusieurs Activités par application
● Une application peut avoir plusieurs Activités
○
○
○

Une Activité par écran de l’application
Une seule Activité est active à un instant donné
■ L’Activité précédente est mis en pause
Les Activités d’une application sont gérées dans le Back Stack
(une pile)

Avec le soutien de :
Activités et Tâches (Tasks)
● Tâche : série d’activités avec lesquelles l’utilisateur
intéragit pour faire quelque chose
○
○
○

Unité d’exécution des Activités
■ Une pile d’Activités par Tâche
Les Activités d’une application s’exécutent dans la même Tâche
Des fois des Activités de plusieurs applications
■ Si une application a besoin de lancer des Activités d’une autre
■ Exemple : navigateur qui ouvre un lien mailto dans gmail

Avec le soutien de :
Cycle de vie d'une Activité
États principaux d'une Activité :
●
●
●

Active (active ou resumed)
○ Activité visible qui détient le focus et attend les entrées utilisateur.
Suspendue (paused)
○ Activité au moins en partie visible à l’écran mais sans le focus
Arrêtée (stopped)
○ Activité non visible, mais encore en vie

Avec le soutien de :
Cycle de vie d'une Activité
● Démarrage → Active
○

Méthode onStart()

● Active → Suspendue
○

Méthode onPause()

● Suspendue → Arrêtée
○

Méthode onStop()

● Suspendue → Active
○

Méthode onResume()

● Arrêtée → Détruite
○

Méthode onDestroy()

public class Main extends Activity {
public void onCreate(Bundle
savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acceuil);
}
protected void onDestroy() {
super.onDestroy();
}
protected void onPause() {
super.onPause();
}
protected void onResume() {
super.onResume();
}
protected void onStart() {
super.onStart();
}
protected void onStop() {
super.onStop();
}
}
Avec le soutien de :
Sauvegarde du contexte : Bundle
● La gestion de mémoire est fait par le système
○ Une application qui n’a plus le focus, peut être déchargée de la
mémoire

● Lorsqu’une Activité est suspendue, on appelle à
onSaveInstanceState(Bundle outState)
○

Par défaut il sauvegarde tous les champs avec idéntifiant
■ Formulaires de saisie…

● Si l’application est déchargée, le système doit la
rédémarrer lorsqu’elle récupère le focus
○

Pour récupérer l’état, il lui donnera le bundle dans
onCreate(Bundle savedInstanceState)

Avec le soutien de :
Avec le soutien de :
Avec le soutien de :
Vues et Gabarits
● Vues (Views) : composants graphiques de l’interface
○ Héritant de la classe View
● Les Vues sont groupées dans des Gabarits (Layouts)
○

Le Gabarit décrit l’interface associée à chaque Activité

● Le type de Gabarit définit la disposition des Vues dans
l’écran
○
○
○
○

LinearLayout : éléments de gauche à droite et du haut vers le bas
RelativeLayout : élément placé par rapport au précédent
TableLayout : éléments placés selon une disposition matricielle
FrameLayout : éléments qui s’empilent les uns sur les autres

Avec le soutien de :
Gabarits
Descriptions en XML de l’interface de l’Activité
●

Placé dans les ressources de
l’application
○ Dans /src/res/layout/

<?xml version="1.0" encoding="utf-16"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/hello" />
<Button
android:id="@+id/bouton1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
<EditText
android:id="@+id/edit1"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
Avec le soutien de :
Composants graphiques
● On ajoute des composants
○
○

Soit directement en XML
Soit en utilisant l’éditeur graphique

<?xml version="1.0" encoding="utf-16"?>
<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:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
</RelativeLayout>

Avec le soutien de :
Imbrication de gabarits
● Les Gabarits peuvent inclure d’autres Gabarits
○

Pour faire du positionnement avancé
■ Un layout horizontal à l’intérieur d’un vertical, par exemple

○

Pour permettre la réutilisation du code
■ En utilisant le mot clé include

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<include android:id="@+id/included_accueil"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
layout="@layout/acceuil" />
</LinearLayout>
Avec le soutien de :
Attributes du Gabarit
Permettent de fournir des propriétés globales du Gabarit
● Les plus importants sont :
○

○

○

android:layout_width et android:layout_height
■ définit la place occupé par le gabarit par rapport au père
■ valeur fill_parent - l'élément remplit l'élément parent
■ valeur wrap_content - prend la place nécessaire à l'affichage
android:orientation
■ définit l'orientation d'empilement
■ valeurs vertical et horizontal
android:gravity
■ définit l'alignement
<LinearLayout
xmlns:android=
des éléments
"http://schemas.android.com/apk/res/android"
■ valeurs top, bottom,
android:layout_width="fill_parent"
android:layout_height="fill_parent"
left, right...
android:orientation="vertical"
android:id="@+id/accueilid" >
[...]
</LinearLayout>

Avec le soutien de :
Accès depuis le code au gabarit
Et si dans mon code je veux modifier un composant ?
● On utilise la classe R
○

Le nom du fichier XML permet de retrouver le Gabarit dans le code
■ pour accueil.xml on passe par R.layout.accueil

● Associer un Gabarit à une Activité : setContentView()
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.accueil);
}

● On peut accéder à tout élément par son id
Dans le code :

Dans le gabarit :

LinearLayout l =
(LinearLayout)findViewById(R.id.mongabarit);
l.setBackgroundColor(Color.BLACK);

<LinearLayout
[...]
android:id="@+id/mongabarit" >
[...]
</LinearLayout>
Avec le soutien de :
Avec le soutien de :
Manifeste (Manifest)
● Toute application doit en avoir → AndroidManifest.xml
○

Dans le répertoire racine de l'application

○

Nom du paquet Java de l'application
■ Identifiant unique pour l'application
Déscription des composants de l'application
■ Activités, services, récepteurs et fournisseurs de contenus
Nom des classes implémentant chaque composant
Capacités de chaque composant, Intent Filters auxquels il répond

● Expose l'information essentielle sur l'application
○
○
○

● Déclare les permissions que l'application doit avoir
○
○
○

Pour accéder aux parties protégée de l'API
Pour interagir avec d'autres applications
Les permissions que les autres applications necessitent pour appeler les
composants de l'appli

● Déclare le niveau minimal requis de l'API Android

Avec le soutien de :
Fichier AndroidManifest.xml
Déclare l'ensemble des éléments de l'application
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.gdgrennes.android.bootcamp"
android:versionCode="1" android:versionName="1.0">
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".Main" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<service>...</service>
<receiver>...</receiver>
<provider>...</provider>
</application>
</manifest>

Avec le soutien de :
Avec le soutien de :
Les ressources
Ressources : composants graphiques,
chaînes, menus, images, tailles, couleurs...
● Utilisées au travers de la classe statique R
○
○

●

Régénérée à chaque changement du projet
Incluant les ressources
■ déclarées dans le Manifeste
■ pour lesquelles les fichiers associés
sont dans le bon repértoire

Image : Constant Contact Labs

Utilisation : android.R.type_ressource.nom_ressource
En récupérant une instance de la classe Resources :
Resources res = getResources();
String hw = res.getString(R.string.hello);
XXX o = res.getXXX(id);
Avec le soutien de :
Ressources : chaînes de caractères
● Déclarées dans /src/res/values/strings.xml
○

Cela permet l’internationalisation

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Hello World!</string>
<string name="app_name">My Android Hello World</string>
</resources>
Image : Constant Contact Labs

● Utilisation dans le code → R.string.name
Resources res = getResources();
String hw = res.getString(R.string.hello);

Avec le soutien de :
Ressources : chaînes et i18n
● Pour chaque langage un repértoire
/src/res/values-XX/
○ xx : code de la langue (en, fr, es…)

● Avec un fichier strings.xml à l’intérieur
○

Le name de chaque chaîne doit être le même

● Exemple : /src/res/values-fr/

Image : Constant Contact Labs

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="hello">Bonjour le monde!</string>
<string name="app_name">Mon Hello World Android</string>
</resources>

● Android chargera bon fichier de ressources
○

En fonction de la langue du système

Avec le soutien de :
Ressources : composants graphiques
● D'autres ressources sont spécifiables dans res:
●
●
●
●

les menus (R.menu)
les images (R.drawable)
des dimensions (R.dimen)
des couleurs (R.color)

Image : Constant Contact Labs

Avec le soutien de :
Avec le soutien de :
LiveCoding : Hello world!
● Objectif : Une application minimaliste
○ Elle affiche un Hello World sur l'écran

● Concepts à voir
○
○
○
○
○
○

Création d'une application
Création d'une Activité
Ressources
Gabarit
Chaîne de caractères
Déploiement et test

Avec le soutien de :
LiveCoding : Hello world!

Avec le soutien de :
Avec le soutien de :
Intents
L'intent est une description abstraite d'une opération à effectuer
Documentation Android

● Objectif : déléguer une action à un autre composant
○ une autre application ou une autre Activité de la même application
● Il s’agit d’un objet que l’on passe à la cible, avec :
○
○
○
○
○
○

le nom du composant ciblé (facultatif)
l'action à réaliser (chaine de caractères)
les données: contenu MIME et URI
des données supplémentaires (paires clé/valeur)
une catégorie pour cibler un type d'application
des drapeaux (informations supplémentaires)

Avec le soutien de :
Lancer une Activité avec un Intent
● Démarrer une Activité dans l’application actuelle
○
○

Prémière paramètre : le contexte de l’application
Deuxième paramètre : la classe de l’activité à démarrer

Intent nouvelleActivite = new Intent(this, MaNouvelleActivite.class);
intent.putExtra("title","Hello Bootcamp"); //Des données extra, clé/valeur
startActivity(nouvelleActivite);

● Démarrer autre application
○

○

Prémière paramètre : le type d’action démandée
■ On demande une appli capable de faire l’action
■ Le système choisit laquelle
Deuxième paramètre : les données à envoyer à la cible

Uri number = Uri.parse("tel:5551234");
Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
startActivity(callIntent);
Avec le soutien de :
Composants d’un Intent
● Action : on déclare le type d’action qu’on veut réaliser
○
○

Le système choisit l’application qui va faire l’action
Exemple : Intent.ACTION_VIEW pour aller voir une URL
■

Par défaut le système ouvrira le navigateur sur l’URL

● Catégorie : information additionnelle sur le composant
qui devrait répondre à l’Intent
○
○

Plusieurs catégories possibles
Catégories définies par défaut :
■

■
■
■
■

CATEGORY_BROWSABLE
● L’Activité cible peut être invoqué depuis le navigateur pour gérer des données
référencés par une URI
CATEGORY_GADGET
● L’Activité cible peut être inserée dans une Activité hôte
CATEGORY_HOME
● L’activité Cible montre l’écran d’accueil du terminal
CATEGORY_LAUNCHER
● L’Activité cible est Activité principale d’une application
CATEGORY_PREFERENCE
● L’Activité cible est un paneau de préférences
Avec le soutien de :
Composants d’un Intent
● Données : une URL et un type MIME
○
○

l’URL et le type MIME des données qu’on passe à la cible
Les URI de type content: indiquent des données sur le terminal
■ Contrôllées par un Content Provider

● Extras
○

Des données additionnelles en, forme clé/valeur

● Drappeaux
○

Ajoutent des information sur comment l’Intent doit être géré
■ Par exemple si l’Activité doit démarrer dans une Tâche nouvelle

Avec le soutien de :
Comment répondre aux Intents
● Chaque application déclare ses Intent Filters
○ Déclarés dans le Manifeste
○ Indiquant à quels Intents elle peut répondre
○ Plusieurs niveaux de filtrage
■
■

Action, Catégorie et Données
Pour répondre à un Intent, les trois niveaux doivent être ok

<intent-filter . . . >
<action android:name="com.example.project.SHOW_CURRENT" />
<action android:name="com.example.project.SHOW_RECENT" />
<action android:name="com.example.project.SHOW_PENDING" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:mimeType="video/mpeg" android:scheme="http" . . . />
<data android:mimeType="audio/mpeg" android:scheme="http" . . . />
</intent-filter>
Avec le soutien de :
Broadcast Intent
● Intent diffusé à l'ensemble des applications du système
○

Pour transmettre des informations à destination d’autres applications
■ demander la réalisation d’actions spécifiques
■ pour fournir des informations sur l’environnement
●

appel entrant, réseau Wi-Fi connecté…

Intent broadcast = new Intent(MyBroadcastReceiver.VIEW);
broadcast.putExtra("extra", "Hello GDG!");
sendBroadcast(broadcast);

● Un Broadcast Received permet de recevoir ces Intents
public final class MyBroadcastReceiver extends BroadcastReceiver {
public static final String VIEW ="org.gdgrennes.intent.action.VIEW";
@Override
public void onReceive(Context context, Intent intent) {
// Code de traitement de l’Intent ici.
}
}
Avec le soutien de :
Avec le soutien de :
Gestion d’Événements
● Event Listeners
○

Mettent un composant à l’écoute d’un événement

○

Le composant reçoit un Event Listener
■

Qui implémente la méthode de réponse à l’événement

Bouton déclaré dans un Gabarit

Code utilisant un Event Listener sur le click

<Button
android:text="Hello!"
android:id="@+id/btnHello"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content" />

Button b = (Button)findViewById(R.id.btnHello);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(),
"Hello World!",
Toast.LENGTH_LONG).show();
}
});

Avec le soutien de :
Avec le soutien de :
LiveCoding : Hello World avec Intents et Events
● Objectif : Première application interactive
○ Un premier écran avec un champ pour saisir son nom et un
bouton qui amène au deuxième écran
○ Un deuxième écran avec un Hello $NOM personnalisé

● Concepts à voir
○ Création d'une application avec plusieurs Activités
○ Création d'un Gabarit à plusieurs composants
○ Utilisation des Event Listeners pour écouter des Évenements
○ Utilisation des Intent pour changer d'Activité

Avec le soutien de :
LiveCoding : Hello World avec Intents et Events

Avec le soutien de :
Avec le soutien de :
Services
● Composants tournant en tâche de fond
○
○
○
○
○

Sans interface utilisateur
Pouvant réagir aux événements, mettre à jour des contenus,
effectuer des traitements…
Pouvant notifier de leur état à l'utilisateur
Avec un cycle de vie similaire aux activités
Contrôlables depuis d'autres applications
■

(activité, service et Broadcast Receiver)

● Beaucoup d’applications ont activités et services
○
○

L’activité permet à l’utilisateur de contrôler le service
Le service tourne en permanence
■

Par exemple pour aller chercher des informations

Avec le soutien de :
Code d'un service
Les services peuvent redéfinir quatre
méthodes : onCreate(), onStart(),
onBind() et onDestroy()
●
●

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
public class MonService extends Service {
@Override
public void onCreate() {
// Placez ici le code qui sera exécuté lors
// de la création de ce service
}

Les services démarrés doivent
implémenter onStart()
Les services liées doivent
implémenter onBind()
○

@Override
public void onStart(Intent intent, int startId) {
// Placez ici le code qui sera exécuté à chaque
// démarrage du service
}

Cette méthode retourne un objet
IBinder qui permet au mécanisme
IPC de fonctionner

IPC : communication inter-processus,
permettant d’appeler des méthodes
distantes

@Override
public void onDestroy() {
// Placez ici le code qui sera exécuté lors
// de la destruction de ce service
}
@Override
public IBinder onBind(Intent arg0) {
return null;
Avec le soutien de :
}
}
Avec le soutien de :
Programmation concurrente
● Par défaut chaque application s’exécute dans un seul processus
○

Cela peut-être modifié dans le Manifeste
<application>
<activity>.../activity>
<service>...</service>

<service android:name=".MyService" android:process=":p2">
</application>

● Le processus peut créer des threads différents

Avec le soutien de :
Le Thread UI
Thread unique sur lequel l’application tourne au démarrage
● Si ce thread reste bloqué
○
○

L'interface d'utilisateur de l'appli reste bloqué
Le système peut arrêter l'application

Toute opération potentiellement bloquante ou simplement lente
doit se faire dans d'autre thread
●
●

Le Thread UI doit servir qu'à la gestion
des composants graphiques
Appels réseau, consultation données,
logique métier... sur d'autres threads

Avec le soutien de :
Multi-threading : les Async Tasks
Depuis le Thread UI
●
●

On peut créer des threads traditionnels Java (implements Runnable)
On peut utiliser des tâches asynchrones (AsyncTask)

Async Task
●
●

L'activité appelle la méthode execute() de l'AsyncTask
Le code à exécuter dans le nouveau thread est à mettre dans la méthode
doInBackground(Object... params)

Avec le soutien de :
Async Tasks
Ca cache la compléxité des threads
●

Pour chaque action asynchrone on crée une classe heritant d’AsyncTask
○ Surchargeant au moins doInBackground(Object... params)
○ Souvent surchageant aussi onPostExecute(Result)

●

La classe a trois paramètres <U,V,W>
○ U : le type du paramètre envoyé à l'exécution
○ V : le type de l'objet permettant de notifier de la progression
○ W : le type du résultat de l'exécution

Avec le soutien de :
Async Tasks
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) {
int count = urls.length;
long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
// Escape early if cancel() is called
if (isCancelled()) break;
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) {
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) {
showDialog("Downloaded " + result + " bytes");
}
}

Avec le soutien de :
Avec le soutien de :
Permissions et état du réseau
●

Pour pouvoir accéder au réseau l’appli doit demander ces permissions
○ Dans le Manifeste
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

●

Elle doit ensuite vérifier que le réseau est disponible
○

Dans l’Activité qui veut se connecter

ConnectivityManager connMgr =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isConnected()) {
// fetch data
} else {
// display error
}
Avec le soutien de :
Avec le soutien de :
LiveCoding : Hello RESTFful World
● Objectif : Première application réseau
○
○

●

Un premier écran avec un champ de texte pour saisir le prénom et un
bouton pour l'envoyer vers le serveur
Suite à la réponse du serveur, un deuxième écran qui affiche cette
réponse

Concepts à voir
○

Utilisation des capacités réseau du terminal

○

Permissions dans l'AndroidManifest.xml

○

Envoi et réception de requêtes/réponses REST

Avec le soutien de :
Avec le soutien de :
LiveCoding : Twitter-like
● Objectif : une application permettant de se connecter
à un service d'échange de messages courts
● Concepts à voir :
○
○
○

Aller plus loin dans les concepts vus
TimerTaks, Services
ListView, ListAdapters

Avec le soutien de :
Le serveur
● Serveur codé en Java offrant une API REST
○ Services :
■

Inscription

■

Identification

■

Envoi de message

■

Récupération des 20 derniers messages

■

Récupération des nouveaux messages depuis un instant
donné
Avec le soutien de :
Première étape : l'inscription au service
● URI :

http://lostinbrittany.
org/java/AndroidBootcampServer/rest/user

○ Paramètres : username, password
○ Mèthode : PUT
○ Réponse JSON : {"result":"O.K."}
● Suggestion
○
○
○
○

Réalisation de l'UI
Création d'un thread utilitaire ou d'une AsyncTask
Envoi de la requête HTTP
Récupération de la réponse via le handler

Avec le soutien de :
Deuxième étape : l'identification
● URI :

http://lostinbrittany.
org/java/AndroidBootcampServer/rest/user

○ Paramètres : username, password
○ Mèthode : POST
○ Réponse JSON : {'token': 'TOKEN_IDENTIFICATION'
■ Il faudra renvoyer ce token à chaque envoi de message

●

}

Même URI que pour l'inscription, méthode différente

Avec le soutien de :
Troisième étape : Envoyons des messages
● Une UI simple mais fonctionnel
○ Un EditText et un Button en bas
○ Un ListView en haut

Avec le soutien de :
Troisième étape : Envoyons des messages
● URI :

http://lostinbrittany.
org/java/AndroidBootcampServer/rest/message

○ Paramètres : username,
○ Mèthode : POST
○ Réponse JSON :

token, content

{"result":"ok", 'timestamp': 'TIMESTAMP' }

■

Pour permettre la récupération des messages à partir d'un
instant donné

Avec le soutien de :
Quatrième étape : recevons des messages
● Réception via pulling
○ Pushing pour Bootcamp Avancé
● Deux alternatives
○

Service

○

TimerTask

● On va commencer par la TimerTask, plus simple

Avec le soutien de :
Quatrième étape : recevons des messages
● TimerTaks : Une tâche programmé pour
○
○

passer tous les x secondes et
lancer un thread d'éxécution

Avec le soutien de :
Quatrième étape : recevons des messages
● URI :
http://lostinbrittany.org/java/AndroidBootcampServer/rest/message/timestamp

○ Paramètres : timestamp
○ Mèthode : GET
○ Réponse JSON :
[{"id":22,"timestamp":1341026043615,"user":"toto",
"content":"titititi"}]

○

Il faut garder le timestamp du dernier message récupéré et la fois
suivante ne demander que les messages produits après ce
timestamp

Avec le soutien de :
Quatrième étape : recevons des messages
● Pour l'UI nous suggérons d'utiliser une ListView
○ La ListView par défaut ne présente
que des labels
○ Nous on voudrait une ListView plus
élaboré
■

Avec deux informations distinctes par ligne

■

Et éventuellement un avatar

○ Solution : utiliser un ListAdapter
Avec le soutien de :
Avec le soutien de :
Bilan
● Vous avez vu aujourd'hui :
○ Un aperçu de la plate-forme Android
○ Les concepts basiques d'une application Android
■

Activités, Services, Intents, AndroidManifest.xml

■

Layouts, widgets, strings.xml

■

Communications réseau, appels REST

■

AsyncTasks, TimerTask
Avec le soutien de :
Votre avis
● C'est notre quatrième Bootcamp Android
○
○

On a essayé de réduire le côté théorique
Et de mettre rapidement les mains à la pâte

● Qu'est-ce que vous en pensez ?
○
○
○

Trop simple ? Trop compliqué ?
Trop long ? Trop court ?
Trop théorique ? Trop pratique ?

● Votre avis est important pour nous !

Avec le soutien de :
La suite
● Un Atelier Android Avancé le 14 décembre
● Vous y voudriez voir quoi ?
On accepte des suggestions !

Avec le soutien de :
Avec le soutien de :

Más contenido relacionado

La actualidad más candente

Le service workers
Le service workersLe service workers
Le service workersneuros
 
Google : Prise en charge de l'Ajax et de l'Angular JS
Google : Prise en charge de l'Ajax et de l'Angular JSGoogle : Prise en charge de l'Ajax et de l'Angular JS
Google : Prise en charge de l'Ajax et de l'Angular JSPeak Ace
 
Livre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeursLivre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeursneuros
 
Atelier #3 intégration html
Atelier #3 intégration htmlAtelier #3 intégration html
Atelier #3 intégration htmlLes-Tilleuls.coop
 
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDKGreenIvory
 
GDG Rennes - Bootcamp Initiation Android - Hello World
GDG Rennes - Bootcamp Initiation Android - Hello WorldGDG Rennes - Bootcamp Initiation Android - Hello World
GDG Rennes - Bootcamp Initiation Android - Hello WorldHoracio Gonzalez
 
Enib cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !
Enib   cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !Enib   cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !
Enib cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !Horacio Gonzalez
 
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3 ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3 Horacio Gonzalez
 
Javascript in a continuous integration environment
Javascript in a continuous integration environmentJavascript in a continuous integration environment
Javascript in a continuous integration environmentFrederic Dewinne
 
Angular 6, CLI 6, Material 6 (french)
Angular 6, CLI 6, Material 6 (french)Angular 6, CLI 6, Material 6 (french)
Angular 6, CLI 6, Material 6 (french)Laurent Duveau
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSHoracio Gonzalez
 
JHipster Conf 2019 French keynote
JHipster Conf 2019 French keynoteJHipster Conf 2019 French keynote
JHipster Conf 2019 French keynoteJulien Dubois
 
Gwt présentation-jug-14avr2011
Gwt présentation-jug-14avr2011Gwt présentation-jug-14avr2011
Gwt présentation-jug-14avr2011Montreal JUG
 
De 0 à Angular en 1h30! (french)
De 0 à Angular en 1h30! (french)De 0 à Angular en 1h30! (french)
De 0 à Angular en 1h30! (french)Laurent Duveau
 
Prérequis au développement google android
Prérequis au développement google androidPrérequis au développement google android
Prérequis au développement google androidThierry Gayet
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.jsBruno Bonnin
 

La actualidad más candente (19)

Le service workers
Le service workersLe service workers
Le service workers
 
Google : Prise en charge de l'Ajax et de l'Angular JS
Google : Prise en charge de l'Ajax et de l'Angular JSGoogle : Prise en charge de l'Ajax et de l'Angular JS
Google : Prise en charge de l'Ajax et de l'Angular JS
 
Livre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeursLivre Drupal avance, un CMS pour développeurs
Livre Drupal avance, un CMS pour développeurs
 
Atelier #3 intégration html
Atelier #3 intégration htmlAtelier #3 intégration html
Atelier #3 intégration html
 
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
20091006 Dev Forum Fr 001Introduction à GWT en utilisant AppCase SDK
 
GDG Rennes - Bootcamp Initiation Android - Hello World
GDG Rennes - Bootcamp Initiation Android - Hello WorldGDG Rennes - Bootcamp Initiation Android - Hello World
GDG Rennes - Bootcamp Initiation Android - Hello World
 
Enib cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !
Enib   cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !Enib   cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !
Enib cours c.a.i. web - séance #5 - j’ai besoin d’une appli web rapidement !
 
Ionic
IonicIonic
Ionic
 
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3 ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3
ENIB 2013-2014 - CAI Web #1: Côté navigateur 3/3
 
Javascript in a continuous integration environment
Javascript in a continuous integration environmentJavascript in a continuous integration environment
Javascript in a continuous integration environment
 
Atelier initiation au html5
Atelier initiation au html5Atelier initiation au html5
Atelier initiation au html5
 
Angular 6, CLI 6, Material 6 (french)
Angular 6, CLI 6, Material 6 (french)Angular 6, CLI 6, Material 6 (french)
Angular 6, CLI 6, Material 6 (french)
 
Introduction à Angular 2
Introduction à Angular 2Introduction à Angular 2
Introduction à Angular 2
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
 
JHipster Conf 2019 French keynote
JHipster Conf 2019 French keynoteJHipster Conf 2019 French keynote
JHipster Conf 2019 French keynote
 
Gwt présentation-jug-14avr2011
Gwt présentation-jug-14avr2011Gwt présentation-jug-14avr2011
Gwt présentation-jug-14avr2011
 
De 0 à Angular en 1h30! (french)
De 0 à Angular en 1h30! (french)De 0 à Angular en 1h30! (french)
De 0 à Angular en 1h30! (french)
 
Prérequis au développement google android
Prérequis au développement google androidPrérequis au développement google android
Prérequis au développement google android
 
A la découverte de vue.js
A la découverte de vue.jsA la découverte de vue.js
A la découverte de vue.js
 

Destacado

Conception et refonte d'un site web : les bonnes pratiques
Conception et refonte d'un site web : les bonnes pratiquesConception et refonte d'un site web : les bonnes pratiques
Conception et refonte d'un site web : les bonnes pratiquesTarn Tourisme
 
Gestion d’une agence de voyage routière (Blondel Seumo)
Gestion d’une  agence  de  voyage  routière (Blondel Seumo)Gestion d’une  agence  de  voyage  routière (Blondel Seumo)
Gestion d’une agence de voyage routière (Blondel Seumo)Gantner Technologies
 
Authentification Forte Openid Avec Certificat Software
Authentification Forte Openid Avec Certificat SoftwareAuthentification Forte Openid Avec Certificat Software
Authentification Forte Openid Avec Certificat SoftwareSylvain Maret
 
Mobile Marketing Stats Automotive Dealers Should Know
Mobile Marketing Stats Automotive Dealers Should KnowMobile Marketing Stats Automotive Dealers Should Know
Mobile Marketing Stats Automotive Dealers Should Knowcreativeeyeball
 
Spéciale Paiement La French Mobile Juin 2012
Spéciale Paiement La French Mobile Juin 2012Spéciale Paiement La French Mobile Juin 2012
Spéciale Paiement La French Mobile Juin 2012servicesmobiles.fr
 
Les usages associés aux tablettes tactiles - GESTE - Mediametrie - Mars 2012
Les usages associés aux tablettes tactiles  - GESTE - Mediametrie - Mars 2012Les usages associés aux tablettes tactiles  - GESTE - Mediametrie - Mars 2012
Les usages associés aux tablettes tactiles - GESTE - Mediametrie - Mars 2012Romain Fonnier
 
What is-Mobile-Marketing-mehmettanlak.com
What is-Mobile-Marketing-mehmettanlak.comWhat is-Mobile-Marketing-mehmettanlak.com
What is-Mobile-Marketing-mehmettanlak.comUniversity
 
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...Form Factor is the Message: How the Devices We Use Shape the Messages and Con...
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...Future Insights
 
Etat des lieux du mobile en France et en Europe
Etat des lieux du mobile en France et en EuropeEtat des lieux du mobile en France et en Europe
Etat des lieux du mobile en France et en EuropeMediamaispasque
 
Getting Web Multi-Touch Working
Getting Web Multi-Touch Working Getting Web Multi-Touch Working
Getting Web Multi-Touch Working Aidan Wu
 
Référencement Mobile - Anji Ismail - SEO Campus 2010
Référencement Mobile - Anji Ismail - SEO Campus 2010Référencement Mobile - Anji Ismail - SEO Campus 2010
Référencement Mobile - Anji Ismail - SEO Campus 2010SEO CAMP
 
Marketing des applications mobiles
Marketing des applications mobilesMarketing des applications mobiles
Marketing des applications mobilesSamir Bellik
 
Internationaliser son app pour réussir: l'exemple de 94 Secondes
Internationaliser son app pour réussir: l'exemple de 94 SecondesInternationaliser son app pour réussir: l'exemple de 94 Secondes
Internationaliser son app pour réussir: l'exemple de 94 SecondesBenjamin Faure
 
Content marketing world_mobile and tablet content distribution_8_17_2012
Content marketing world_mobile and tablet content distribution_8_17_2012Content marketing world_mobile and tablet content distribution_8_17_2012
Content marketing world_mobile and tablet content distribution_8_17_2012interlinkONE
 
Awesome android apps
Awesome android appsAwesome android apps
Awesome android appsRichard Byrne
 

Destacado (20)

E commerce 2012
E commerce 2012E commerce 2012
E commerce 2012
 
MEMOIRE DE STAGE
MEMOIRE DE STAGEMEMOIRE DE STAGE
MEMOIRE DE STAGE
 
Conception et refonte d'un site web : les bonnes pratiques
Conception et refonte d'un site web : les bonnes pratiquesConception et refonte d'un site web : les bonnes pratiques
Conception et refonte d'un site web : les bonnes pratiques
 
Rapport pfev7
Rapport pfev7Rapport pfev7
Rapport pfev7
 
Gestion d’une agence de voyage routière (Blondel Seumo)
Gestion d’une  agence  de  voyage  routière (Blondel Seumo)Gestion d’une  agence  de  voyage  routière (Blondel Seumo)
Gestion d’une agence de voyage routière (Blondel Seumo)
 
Authentification Forte Openid Avec Certificat Software
Authentification Forte Openid Avec Certificat SoftwareAuthentification Forte Openid Avec Certificat Software
Authentification Forte Openid Avec Certificat Software
 
Keynotes Le Mobile 2013
Keynotes Le Mobile 2013Keynotes Le Mobile 2013
Keynotes Le Mobile 2013
 
Mobile Marketing Stats Automotive Dealers Should Know
Mobile Marketing Stats Automotive Dealers Should KnowMobile Marketing Stats Automotive Dealers Should Know
Mobile Marketing Stats Automotive Dealers Should Know
 
Spéciale Paiement La French Mobile Juin 2012
Spéciale Paiement La French Mobile Juin 2012Spéciale Paiement La French Mobile Juin 2012
Spéciale Paiement La French Mobile Juin 2012
 
Les usages associés aux tablettes tactiles - GESTE - Mediametrie - Mars 2012
Les usages associés aux tablettes tactiles  - GESTE - Mediametrie - Mars 2012Les usages associés aux tablettes tactiles  - GESTE - Mediametrie - Mars 2012
Les usages associés aux tablettes tactiles - GESTE - Mediametrie - Mars 2012
 
What is-Mobile-Marketing-mehmettanlak.com
What is-Mobile-Marketing-mehmettanlak.comWhat is-Mobile-Marketing-mehmettanlak.com
What is-Mobile-Marketing-mehmettanlak.com
 
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...Form Factor is the Message: How the Devices We Use Shape the Messages and Con...
Form Factor is the Message: How the Devices We Use Shape the Messages and Con...
 
Metro + Metro Like
Metro + Metro LikeMetro + Metro Like
Metro + Metro Like
 
Etat des lieux du mobile en France et en Europe
Etat des lieux du mobile en France et en EuropeEtat des lieux du mobile en France et en Europe
Etat des lieux du mobile en France et en Europe
 
Getting Web Multi-Touch Working
Getting Web Multi-Touch Working Getting Web Multi-Touch Working
Getting Web Multi-Touch Working
 
Référencement Mobile - Anji Ismail - SEO Campus 2010
Référencement Mobile - Anji Ismail - SEO Campus 2010Référencement Mobile - Anji Ismail - SEO Campus 2010
Référencement Mobile - Anji Ismail - SEO Campus 2010
 
Marketing des applications mobiles
Marketing des applications mobilesMarketing des applications mobiles
Marketing des applications mobiles
 
Internationaliser son app pour réussir: l'exemple de 94 Secondes
Internationaliser son app pour réussir: l'exemple de 94 SecondesInternationaliser son app pour réussir: l'exemple de 94 Secondes
Internationaliser son app pour réussir: l'exemple de 94 Secondes
 
Content marketing world_mobile and tablet content distribution_8_17_2012
Content marketing world_mobile and tablet content distribution_8_17_2012Content marketing world_mobile and tablet content distribution_8_17_2012
Content marketing world_mobile and tablet content distribution_8_17_2012
 
Awesome android apps
Awesome android appsAwesome android apps
Awesome android apps
 

Similar a Bootcamp d'Initiation à Android - 2013/11/30

Paris Android User Group
Paris Android User GroupParis Android User Group
Paris Android User Groupnaholyr
 
presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)Romand
 
Développement Android
Développement AndroidDéveloppement Android
Développement AndroidFranck SIMON
 
Des poneys à Liberation.fr
Des poneys à Liberation.frDes poneys à Liberation.fr
Des poneys à Liberation.frliberation_dev
 
DAM et Drive : 2 nouveautés phares pour la Plateforme Nuxeo
DAM et Drive : 2 nouveautés phares pour la Plateforme NuxeoDAM et Drive : 2 nouveautés phares pour la Plateforme Nuxeo
DAM et Drive : 2 nouveautés phares pour la Plateforme NuxeoNuxeo
 
Développement et gestion de Logiciel Libre et Ouvert (LLO)
Développement et gestion  de Logiciel Libre et Ouvert (LLO)Développement et gestion  de Logiciel Libre et Ouvert (LLO)
Développement et gestion de Logiciel Libre et Ouvert (LLO)geomsp
 
[Geocom2017] geOrchestra and ngeo
[Geocom2017] geOrchestra and ngeo[Geocom2017] geOrchestra and ngeo
[Geocom2017] geOrchestra and ngeoCamptocamp
 
Méthodes agiles, frameworks javascript: optimisez votre time to market
Méthodes agiles, frameworks javascript: optimisez votre time to marketMéthodes agiles, frameworks javascript: optimisez votre time to market
Méthodes agiles, frameworks javascript: optimisez votre time to marketmichael_bailly
 
Agile tour bordeaux 1500 développeurs dans mon équipe
Agile tour bordeaux   1500 développeurs dans mon équipeAgile tour bordeaux   1500 développeurs dans mon équipe
Agile tour bordeaux 1500 développeurs dans mon équipeAlexis Monville
 
Angular développer des applications .pdf
Angular développer des applications .pdfAngular développer des applications .pdf
Angular développer des applications .pdfimenhamada17
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for DebuggingmeeticTech
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...Horacio Gonzalez
 
02_Chapitre_1_.pdf
02_Chapitre_1_.pdf02_Chapitre_1_.pdf
02_Chapitre_1_.pdfallagahamza
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfmed_univ78
 
Un backlog public - Agile France 2012
Un backlog public - Agile France 2012 Un backlog public - Agile France 2012
Un backlog public - Agile France 2012 François Wauquier
 

Similar a Bootcamp d'Initiation à Android - 2013/11/30 (20)

Paris Android User Group
Paris Android User GroupParis Android User Group
Paris Android User Group
 
Christophe Tricot et Raphaël Velt (infoviz)
Christophe Tricot et Raphaël Velt (infoviz)Christophe Tricot et Raphaël Velt (infoviz)
Christophe Tricot et Raphaël Velt (infoviz)
 
presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)presentation Ganttproject (TIC et orga)
presentation Ganttproject (TIC et orga)
 
Développement Android
Développement AndroidDéveloppement Android
Développement Android
 
Des poneys à Liberation.fr
Des poneys à Liberation.frDes poneys à Liberation.fr
Des poneys à Liberation.fr
 
DAM et Drive : 2 nouveautés phares pour la Plateforme Nuxeo
DAM et Drive : 2 nouveautés phares pour la Plateforme NuxeoDAM et Drive : 2 nouveautés phares pour la Plateforme Nuxeo
DAM et Drive : 2 nouveautés phares pour la Plateforme Nuxeo
 
Développement et gestion de Logiciel Libre et Ouvert (LLO)
Développement et gestion  de Logiciel Libre et Ouvert (LLO)Développement et gestion  de Logiciel Libre et Ouvert (LLO)
Développement et gestion de Logiciel Libre et Ouvert (LLO)
 
[Geocom2017] geOrchestra and ngeo
[Geocom2017] geOrchestra and ngeo[Geocom2017] geOrchestra and ngeo
[Geocom2017] geOrchestra and ngeo
 
Android201710 avrilcours3
Android201710 avrilcours3Android201710 avrilcours3
Android201710 avrilcours3
 
Méthodes agiles, frameworks javascript: optimisez votre time to market
Méthodes agiles, frameworks javascript: optimisez votre time to marketMéthodes agiles, frameworks javascript: optimisez votre time to market
Méthodes agiles, frameworks javascript: optimisez votre time to market
 
Agile tour bordeaux 1500 développeurs dans mon équipe
Agile tour bordeaux   1500 développeurs dans mon équipeAgile tour bordeaux   1500 développeurs dans mon équipe
Agile tour bordeaux 1500 développeurs dans mon équipe
 
Angular développer des applications .pdf
Angular développer des applications .pdfAngular développer des applications .pdf
Angular développer des applications .pdf
 
2èmes Rencontres ASIT VD : Mes applications métiers sur QGIS
2èmes Rencontres ASIT VD : Mes applications métiers sur QGIS2èmes Rencontres ASIT VD : Mes applications métiers sur QGIS
2èmes Rencontres ASIT VD : Mes applications métiers sur QGIS
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 2/3 - HTML5 / CSS3 / Twitter...
 
02_Chapitre_1_.pdf
02_Chapitre_1_.pdf02_Chapitre_1_.pdf
02_Chapitre_1_.pdf
 
Introduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdfIntroduction_Android_-_Complet.pdf
Introduction_Android_-_Complet.pdf
 
Acra
Acra Acra
Acra
 
DART.pptx
DART.pptxDART.pptx
DART.pptx
 
Un backlog public - Agile France 2012
Un backlog public - Agile France 2012 Un backlog public - Agile France 2012
Un backlog public - Agile France 2012
 

Más de Horacio Gonzalez

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Horacio Gonzalez
 
But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...Horacio Gonzalez
 
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27Horacio Gonzalez
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...Horacio Gonzalez
 
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Horacio Gonzalez
 
Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Horacio Gonzalez
 
Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Horacio Gonzalez
 
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Horacio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptHoracio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...Horacio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLHoracio Gonzalez
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSHoracio Gonzalez
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...Horacio Gonzalez
 
Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Horacio Gonzalez
 
Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Horacio Gonzalez
 
Devoxx France - Web Components, Polymer et Material Design
Devoxx France -  Web Components, Polymer et Material DesignDevoxx France -  Web Components, Polymer et Material Design
Devoxx France - Web Components, Polymer et Material DesignHoracio Gonzalez
 
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...Horacio Gonzalez
 

Más de Horacio Gonzalez (20)

Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
Il n'y a pas que Polymer dans la vie… - RennesJS - 2017-06-27
 
But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...But there is no web component for that - Web Components Remote Conference - 2...
But there is no web component for that - Web Components Remote Conference - 2...
 
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27 Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
Mixité dans le monde des WebComponents - DevFest Toulouse - 2017-09-27
 
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
ENIB 2016 2017 - CAI Web S02E01- Côté navigateur 2/3 - HTML5, CSS3, Twitter B...
 
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
Battle of Frameworks: Polymer - Meetup Paris Web Components - 2016-09
 
Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09Mixing Web Components - Best of Web Paris - 2016 06-09
Mixing Web Components - Best of Web Paris - 2016 06-09
 
Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20Polymer in the real life - Devoxx France - 2016 04-20
Polymer in the real life - Devoxx France - 2016 04-20
 
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24 Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
Warp10: collect, store and manipulate sensor data - BreizhCamp - 2016 03-24
 
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScriptENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
ENIB 2015 2016 - CAI Web S02E03- Forge JS 1/4 - La forge JavaScript
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 3/3 - Web Components avec Po...
 
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQLENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
ENIB 2015 2016 - CAI Web S02E03 - Forge JS 2/4 - MongoDB and NoSQL
 
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JSENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
ENIB 2015 2016 - CAI Web S02E01- Côté Navigateur 1/3 - HTTP, HTML, CSS JS
 
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQLENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
ENIB 2015-2016 - CAI Web - S01E01- MongoDB and NoSQL
 
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScriptENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
ENIB 2015-2016 - CAI Web - S01E01- La forge JavaScript
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JSENIB 2015-2016 - CAI Web -  S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 1/3 - HTTP, HTML, CSS, JS
 
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
ENIB 2015-2016 - CAI Web - S01E01- Côté navigateur 3/3 - Web components avec ...
 
Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18Beyond Polymer - JUG Summer Camp - 2015-09-18
Beyond Polymer - JUG Summer Camp - 2015-09-18
 
Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16 Mixing Web Components - Paris Web Components - 2015 09-16
Mixing Web Components - Paris Web Components - 2015 09-16
 
Devoxx France - Web Components, Polymer et Material Design
Devoxx France -  Web Components, Polymer et Material DesignDevoxx France -  Web Components, Polymer et Material Design
Devoxx France - Web Components, Polymer et Material Design
 
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...
Steven Le Roux - Kafka et Storm au service de la lutte antiDDoS à OVH - Soiré...
 

Bootcamp d'Initiation à Android - 2013/11/30

  • 3. Horacio Gonzalez Spaniard lost in Brittany, Java developer, dreamer and all-around geek ● Senior Software Engineer at Cityzen Data ○ Cityzen Data provides a scalable, secure, ethical and open platform for sensor data ● Leader du FinistJUG, du GDG Finistère et de la communauté BreizhBeans http://lostinbrittany.org/ +Horacio.Gonzalez @LostInBrittany Avec le soutien de :
  • 4. Stéphane Castrec Ingénieur logiciel. Passionné par l'innovation et le développement mobile. ● Crédit Mutuel Arkea http://stephanecastrec.info @_Stephane_ Avec le soutien de :
  • 5. Qui-sommes nous ? ● FinistJUG : Java User Group du Finistère http://finistjug.fr @FinistJUG ● GDG Finistère : Google Developers Group du Finistère http://finistgdg.fr @FinistGDG Avec le soutien de :
  • 7. C’est quoi Android ? ● Système d'exploitation sur noyau Linux Image : newcircle Avec le soutien de :
  • 8. Dalvik ? Machine virtuelle open-source utilisée sur Android ● Exécutant des fichiers .dex ○ ○ ○ Format différent du bytecode Java Instructions basées sur des registres ■ pas sur une pile comme en Java Avec des optimisations ■ pas de duplication de Strings constantes… ● Espace d’addressage 32 bits ● Pas compatible avec une JVM Le compilateur Dex compile le bytecode Java en bytecode Dex Avec le soutien de :
  • 10. Quelques chiffres ● 900 millions de terminaux activés ● 1,5 millions d’activations par jour ● 50 milliards d’applications installés Terminaux activés ● ● ● 2011 : 100 millions 2012 : 400 millions 2013 : 900 millions Avec le soutien de :
  • 12. Du point de vue d’un développeur Des points forts : ● Développement en Java ● Un SDK complet, open-source et multi-plateforme ○ Des IDEs basés sur des outils confirmés ■ IntelliJ IDEA et Eclipse ○ Des exemples, de la documentation ○ Des APIs riches ○ Un émulateur Avec le soutien de :
  • 13. Android Studio ● Nouveu IDE pour Android ○ ○ ○ ○ Basé sur IntelliJ IDEA Actuellement en v.0.3.x IDE Android complet ■ Syntaxe, refactoring, corrections, templates ■ Editeur graphique d’écrans (layouts) ■ Émulateur des diifférents terminaux Outillage additionnel : ■ Construction : Gradle ■ Performance : Lint ■ Signature d’applications : ProGuard ● Ancien IDE encore disponible ○ ○ Eclipse IDE avec ADT (Android Developer Tools) Presque aussi complet que Android Studio ■ Mais il n’évoluera plus Avec le soutien de :
  • 14. Fondements d’une application ● Applications écrites en Java ● Compilation avec SDK Android ○ Génération d’un fichier .apk ● Les applications tournent dans un sandbox ○ User, VM et processus Linux isolés par application ○ Principe du moindre de privilèges ● Communication entre applications Avec le soutien de :
  • 16. Arborescence ● /src ○ /src/java ○ ○ ● /src/res ■ /src/res/layout ■ /src/res/menu ■ /src/res/values-xxx ■ /src/res/drawable-xxx /src/AndroidManifest.xml /build.gradle Avec le soutien de :
  • 17. Anatomie d’une application Android ● ● ● ● ● ● ● Activities Services Content Providers Intents & Intent Filters Processes & Threads Permissions Manifest Image : Android4Fans Avec le soutien de :
  • 19. Activités (Activities) ● Une Activité peut être assimilée à un écran qu’une application propose à son utilisateur ○ La transition entre deux écrans correspond au lancement d’une Activité ou au retour sur une Activité placée en arrière-plan ● Une Activité est composée de deux volets : ○ La logique et la gestion du cycle de vie ■ Implémentées en Java dans une classe héritant de Activity ○ L'interface utilisateur, qui peut être définie ■ Soit dans le code de l’Activité ■ Soit dans un gabarit (layout) ● Fichier XML placé dans les ressources de l’application ● Approche plus générale à favoriser Avec le soutien de :
  • 20. Plusieurs Activités par application ● Une application peut avoir plusieurs Activités ○ ○ ○ Une Activité par écran de l’application Une seule Activité est active à un instant donné ■ L’Activité précédente est mis en pause Les Activités d’une application sont gérées dans le Back Stack (une pile) Avec le soutien de :
  • 21. Activités et Tâches (Tasks) ● Tâche : série d’activités avec lesquelles l’utilisateur intéragit pour faire quelque chose ○ ○ ○ Unité d’exécution des Activités ■ Une pile d’Activités par Tâche Les Activités d’une application s’exécutent dans la même Tâche Des fois des Activités de plusieurs applications ■ Si une application a besoin de lancer des Activités d’une autre ■ Exemple : navigateur qui ouvre un lien mailto dans gmail Avec le soutien de :
  • 22. Cycle de vie d'une Activité États principaux d'une Activité : ● ● ● Active (active ou resumed) ○ Activité visible qui détient le focus et attend les entrées utilisateur. Suspendue (paused) ○ Activité au moins en partie visible à l’écran mais sans le focus Arrêtée (stopped) ○ Activité non visible, mais encore en vie Avec le soutien de :
  • 23. Cycle de vie d'une Activité ● Démarrage → Active ○ Méthode onStart() ● Active → Suspendue ○ Méthode onPause() ● Suspendue → Arrêtée ○ Méthode onStop() ● Suspendue → Active ○ Méthode onResume() ● Arrêtée → Détruite ○ Méthode onDestroy() public class Main extends Activity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.acceuil); } protected void onDestroy() { super.onDestroy(); } protected void onPause() { super.onPause(); } protected void onResume() { super.onResume(); } protected void onStart() { super.onStart(); } protected void onStop() { super.onStop(); } } Avec le soutien de :
  • 24. Sauvegarde du contexte : Bundle ● La gestion de mémoire est fait par le système ○ Une application qui n’a plus le focus, peut être déchargée de la mémoire ● Lorsqu’une Activité est suspendue, on appelle à onSaveInstanceState(Bundle outState) ○ Par défaut il sauvegarde tous les champs avec idéntifiant ■ Formulaires de saisie… ● Si l’application est déchargée, le système doit la rédémarrer lorsqu’elle récupère le focus ○ Pour récupérer l’état, il lui donnera le bundle dans onCreate(Bundle savedInstanceState) Avec le soutien de :
  • 27. Vues et Gabarits ● Vues (Views) : composants graphiques de l’interface ○ Héritant de la classe View ● Les Vues sont groupées dans des Gabarits (Layouts) ○ Le Gabarit décrit l’interface associée à chaque Activité ● Le type de Gabarit définit la disposition des Vues dans l’écran ○ ○ ○ ○ LinearLayout : éléments de gauche à droite et du haut vers le bas RelativeLayout : élément placé par rapport au précédent TableLayout : éléments placés selon une disposition matricielle FrameLayout : éléments qui s’empilent les uns sur les autres Avec le soutien de :
  • 28. Gabarits Descriptions en XML de l’interface de l’Activité ● Placé dans les ressources de l’application ○ Dans /src/res/layout/ <?xml version="1.0" encoding="utf-16"?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/bouton1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <EditText android:id="@+id/edit1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout> Avec le soutien de :
  • 29. Composants graphiques ● On ajoute des composants ○ ○ Soit directement en XML Soit en utilisant l’éditeur graphique <?xml version="1.0" encoding="utf-16"?> <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:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout> Avec le soutien de :
  • 30. Imbrication de gabarits ● Les Gabarits peuvent inclure d’autres Gabarits ○ Pour faire du positionnement avancé ■ Un layout horizontal à l’intérieur d’un vertical, par exemple ○ Pour permettre la réutilisation du code ■ En utilisant le mot clé include <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android= "http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <include android:id="@+id/included_accueil" android:layout_width="wrap_content" android:layout_height="wrap_content" layout="@layout/acceuil" /> </LinearLayout> Avec le soutien de :
  • 31. Attributes du Gabarit Permettent de fournir des propriétés globales du Gabarit ● Les plus importants sont : ○ ○ ○ android:layout_width et android:layout_height ■ définit la place occupé par le gabarit par rapport au père ■ valeur fill_parent - l'élément remplit l'élément parent ■ valeur wrap_content - prend la place nécessaire à l'affichage android:orientation ■ définit l'orientation d'empilement ■ valeurs vertical et horizontal android:gravity ■ définit l'alignement <LinearLayout xmlns:android= des éléments "http://schemas.android.com/apk/res/android" ■ valeurs top, bottom, android:layout_width="fill_parent" android:layout_height="fill_parent" left, right... android:orientation="vertical" android:id="@+id/accueilid" > [...] </LinearLayout> Avec le soutien de :
  • 32. Accès depuis le code au gabarit Et si dans mon code je veux modifier un composant ? ● On utilise la classe R ○ Le nom du fichier XML permet de retrouver le Gabarit dans le code ■ pour accueil.xml on passe par R.layout.accueil ● Associer un Gabarit à une Activité : setContentView() public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.accueil); } ● On peut accéder à tout élément par son id Dans le code : Dans le gabarit : LinearLayout l = (LinearLayout)findViewById(R.id.mongabarit); l.setBackgroundColor(Color.BLACK); <LinearLayout [...] android:id="@+id/mongabarit" > [...] </LinearLayout> Avec le soutien de :
  • 34. Manifeste (Manifest) ● Toute application doit en avoir → AndroidManifest.xml ○ Dans le répertoire racine de l'application ○ Nom du paquet Java de l'application ■ Identifiant unique pour l'application Déscription des composants de l'application ■ Activités, services, récepteurs et fournisseurs de contenus Nom des classes implémentant chaque composant Capacités de chaque composant, Intent Filters auxquels il répond ● Expose l'information essentielle sur l'application ○ ○ ○ ● Déclare les permissions que l'application doit avoir ○ ○ ○ Pour accéder aux parties protégée de l'API Pour interagir avec d'autres applications Les permissions que les autres applications necessitent pour appeler les composants de l'appli ● Déclare le niveau minimal requis de l'API Android Avec le soutien de :
  • 35. Fichier AndroidManifest.xml Déclare l'ensemble des éléments de l'application <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.gdgrennes.android.bootcamp" android:versionCode="1" android:versionName="1.0"> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".Main" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <service>...</service> <receiver>...</receiver> <provider>...</provider> </application> </manifest> Avec le soutien de :
  • 37. Les ressources Ressources : composants graphiques, chaînes, menus, images, tailles, couleurs... ● Utilisées au travers de la classe statique R ○ ○ ● Régénérée à chaque changement du projet Incluant les ressources ■ déclarées dans le Manifeste ■ pour lesquelles les fichiers associés sont dans le bon repértoire Image : Constant Contact Labs Utilisation : android.R.type_ressource.nom_ressource En récupérant une instance de la classe Resources : Resources res = getResources(); String hw = res.getString(R.string.hello); XXX o = res.getXXX(id); Avec le soutien de :
  • 38. Ressources : chaînes de caractères ● Déclarées dans /src/res/values/strings.xml ○ Cela permet l’internationalisation <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World!</string> <string name="app_name">My Android Hello World</string> </resources> Image : Constant Contact Labs ● Utilisation dans le code → R.string.name Resources res = getResources(); String hw = res.getString(R.string.hello); Avec le soutien de :
  • 39. Ressources : chaînes et i18n ● Pour chaque langage un repértoire /src/res/values-XX/ ○ xx : code de la langue (en, fr, es…) ● Avec un fichier strings.xml à l’intérieur ○ Le name de chaque chaîne doit être le même ● Exemple : /src/res/values-fr/ Image : Constant Contact Labs <?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Bonjour le monde!</string> <string name="app_name">Mon Hello World Android</string> </resources> ● Android chargera bon fichier de ressources ○ En fonction de la langue du système Avec le soutien de :
  • 40. Ressources : composants graphiques ● D'autres ressources sont spécifiables dans res: ● ● ● ● les menus (R.menu) les images (R.drawable) des dimensions (R.dimen) des couleurs (R.color) Image : Constant Contact Labs Avec le soutien de :
  • 42. LiveCoding : Hello world! ● Objectif : Une application minimaliste ○ Elle affiche un Hello World sur l'écran ● Concepts à voir ○ ○ ○ ○ ○ ○ Création d'une application Création d'une Activité Ressources Gabarit Chaîne de caractères Déploiement et test Avec le soutien de :
  • 43. LiveCoding : Hello world! Avec le soutien de :
  • 45. Intents L'intent est une description abstraite d'une opération à effectuer Documentation Android ● Objectif : déléguer une action à un autre composant ○ une autre application ou une autre Activité de la même application ● Il s’agit d’un objet que l’on passe à la cible, avec : ○ ○ ○ ○ ○ ○ le nom du composant ciblé (facultatif) l'action à réaliser (chaine de caractères) les données: contenu MIME et URI des données supplémentaires (paires clé/valeur) une catégorie pour cibler un type d'application des drapeaux (informations supplémentaires) Avec le soutien de :
  • 46. Lancer une Activité avec un Intent ● Démarrer une Activité dans l’application actuelle ○ ○ Prémière paramètre : le contexte de l’application Deuxième paramètre : la classe de l’activité à démarrer Intent nouvelleActivite = new Intent(this, MaNouvelleActivite.class); intent.putExtra("title","Hello Bootcamp"); //Des données extra, clé/valeur startActivity(nouvelleActivite); ● Démarrer autre application ○ ○ Prémière paramètre : le type d’action démandée ■ On demande une appli capable de faire l’action ■ Le système choisit laquelle Deuxième paramètre : les données à envoyer à la cible Uri number = Uri.parse("tel:5551234"); Intent callIntent = new Intent(Intent.ACTION_DIAL, number); startActivity(callIntent); Avec le soutien de :
  • 47. Composants d’un Intent ● Action : on déclare le type d’action qu’on veut réaliser ○ ○ Le système choisit l’application qui va faire l’action Exemple : Intent.ACTION_VIEW pour aller voir une URL ■ Par défaut le système ouvrira le navigateur sur l’URL ● Catégorie : information additionnelle sur le composant qui devrait répondre à l’Intent ○ ○ Plusieurs catégories possibles Catégories définies par défaut : ■ ■ ■ ■ ■ CATEGORY_BROWSABLE ● L’Activité cible peut être invoqué depuis le navigateur pour gérer des données référencés par une URI CATEGORY_GADGET ● L’Activité cible peut être inserée dans une Activité hôte CATEGORY_HOME ● L’activité Cible montre l’écran d’accueil du terminal CATEGORY_LAUNCHER ● L’Activité cible est Activité principale d’une application CATEGORY_PREFERENCE ● L’Activité cible est un paneau de préférences Avec le soutien de :
  • 48. Composants d’un Intent ● Données : une URL et un type MIME ○ ○ l’URL et le type MIME des données qu’on passe à la cible Les URI de type content: indiquent des données sur le terminal ■ Contrôllées par un Content Provider ● Extras ○ Des données additionnelles en, forme clé/valeur ● Drappeaux ○ Ajoutent des information sur comment l’Intent doit être géré ■ Par exemple si l’Activité doit démarrer dans une Tâche nouvelle Avec le soutien de :
  • 49. Comment répondre aux Intents ● Chaque application déclare ses Intent Filters ○ Déclarés dans le Manifeste ○ Indiquant à quels Intents elle peut répondre ○ Plusieurs niveaux de filtrage ■ ■ Action, Catégorie et Données Pour répondre à un Intent, les trois niveaux doivent être ok <intent-filter . . . > <action android:name="com.example.project.SHOW_CURRENT" /> <action android:name="com.example.project.SHOW_RECENT" /> <action android:name="com.example.project.SHOW_PENDING" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="video/mpeg" android:scheme="http" . . . /> <data android:mimeType="audio/mpeg" android:scheme="http" . . . /> </intent-filter> Avec le soutien de :
  • 50. Broadcast Intent ● Intent diffusé à l'ensemble des applications du système ○ Pour transmettre des informations à destination d’autres applications ■ demander la réalisation d’actions spécifiques ■ pour fournir des informations sur l’environnement ● appel entrant, réseau Wi-Fi connecté… Intent broadcast = new Intent(MyBroadcastReceiver.VIEW); broadcast.putExtra("extra", "Hello GDG!"); sendBroadcast(broadcast); ● Un Broadcast Received permet de recevoir ces Intents public final class MyBroadcastReceiver extends BroadcastReceiver { public static final String VIEW ="org.gdgrennes.intent.action.VIEW"; @Override public void onReceive(Context context, Intent intent) { // Code de traitement de l’Intent ici. } } Avec le soutien de :
  • 52. Gestion d’Événements ● Event Listeners ○ Mettent un composant à l’écoute d’un événement ○ Le composant reçoit un Event Listener ■ Qui implémente la méthode de réponse à l’événement Bouton déclaré dans un Gabarit Code utilisant un Event Listener sur le click <Button android:text="Hello!" android:id="@+id/btnHello" android:layout_width= "wrap_content" android:layout_height= "wrap_content" /> Button b = (Button)findViewById(R.id.btnHello); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { Toast.makeText(v.getContext(), "Hello World!", Toast.LENGTH_LONG).show(); } }); Avec le soutien de :
  • 54. LiveCoding : Hello World avec Intents et Events ● Objectif : Première application interactive ○ Un premier écran avec un champ pour saisir son nom et un bouton qui amène au deuxième écran ○ Un deuxième écran avec un Hello $NOM personnalisé ● Concepts à voir ○ Création d'une application avec plusieurs Activités ○ Création d'un Gabarit à plusieurs composants ○ Utilisation des Event Listeners pour écouter des Évenements ○ Utilisation des Intent pour changer d'Activité Avec le soutien de :
  • 55. LiveCoding : Hello World avec Intents et Events Avec le soutien de :
  • 57. Services ● Composants tournant en tâche de fond ○ ○ ○ ○ ○ Sans interface utilisateur Pouvant réagir aux événements, mettre à jour des contenus, effectuer des traitements… Pouvant notifier de leur état à l'utilisateur Avec un cycle de vie similaire aux activités Contrôlables depuis d'autres applications ■ (activité, service et Broadcast Receiver) ● Beaucoup d’applications ont activités et services ○ ○ L’activité permet à l’utilisateur de contrôler le service Le service tourne en permanence ■ Par exemple pour aller chercher des informations Avec le soutien de :
  • 58. Code d'un service Les services peuvent redéfinir quatre méthodes : onCreate(), onStart(), onBind() et onDestroy() ● ● import android.app.Service; import android.content.Intent; import android.os.IBinder; public class MonService extends Service { @Override public void onCreate() { // Placez ici le code qui sera exécuté lors // de la création de ce service } Les services démarrés doivent implémenter onStart() Les services liées doivent implémenter onBind() ○ @Override public void onStart(Intent intent, int startId) { // Placez ici le code qui sera exécuté à chaque // démarrage du service } Cette méthode retourne un objet IBinder qui permet au mécanisme IPC de fonctionner IPC : communication inter-processus, permettant d’appeler des méthodes distantes @Override public void onDestroy() { // Placez ici le code qui sera exécuté lors // de la destruction de ce service } @Override public IBinder onBind(Intent arg0) { return null; Avec le soutien de : } }
  • 60. Programmation concurrente ● Par défaut chaque application s’exécute dans un seul processus ○ Cela peut-être modifié dans le Manifeste <application> <activity>.../activity> <service>...</service> <service android:name=".MyService" android:process=":p2"> </application> ● Le processus peut créer des threads différents Avec le soutien de :
  • 61. Le Thread UI Thread unique sur lequel l’application tourne au démarrage ● Si ce thread reste bloqué ○ ○ L'interface d'utilisateur de l'appli reste bloqué Le système peut arrêter l'application Toute opération potentiellement bloquante ou simplement lente doit se faire dans d'autre thread ● ● Le Thread UI doit servir qu'à la gestion des composants graphiques Appels réseau, consultation données, logique métier... sur d'autres threads Avec le soutien de :
  • 62. Multi-threading : les Async Tasks Depuis le Thread UI ● ● On peut créer des threads traditionnels Java (implements Runnable) On peut utiliser des tâches asynchrones (AsyncTask) Async Task ● ● L'activité appelle la méthode execute() de l'AsyncTask Le code à exécuter dans le nouveau thread est à mettre dans la méthode doInBackground(Object... params) Avec le soutien de :
  • 63. Async Tasks Ca cache la compléxité des threads ● Pour chaque action asynchrone on crée une classe heritant d’AsyncTask ○ Surchargeant au moins doInBackground(Object... params) ○ Souvent surchageant aussi onPostExecute(Result) ● La classe a trois paramètres <U,V,W> ○ U : le type du paramètre envoyé à l'exécution ○ V : le type de l'objet permettant de notifier de la progression ○ W : le type du résultat de l'exécution Avec le soutien de :
  • 64. Async Tasks private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); // Escape early if cancel() is called if (isCancelled()) break; } return totalSize; } protected void onProgressUpdate(Integer... progress) { setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { showDialog("Downloaded " + result + " bytes"); } } Avec le soutien de :
  • 66. Permissions et état du réseau ● Pour pouvoir accéder au réseau l’appli doit demander ces permissions ○ Dans le Manifeste <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ● Elle doit ensuite vérifier que le réseau est disponible ○ Dans l’Activité qui veut se connecter ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { // fetch data } else { // display error } Avec le soutien de :
  • 68. LiveCoding : Hello RESTFful World ● Objectif : Première application réseau ○ ○ ● Un premier écran avec un champ de texte pour saisir le prénom et un bouton pour l'envoyer vers le serveur Suite à la réponse du serveur, un deuxième écran qui affiche cette réponse Concepts à voir ○ Utilisation des capacités réseau du terminal ○ Permissions dans l'AndroidManifest.xml ○ Envoi et réception de requêtes/réponses REST Avec le soutien de :
  • 70. LiveCoding : Twitter-like ● Objectif : une application permettant de se connecter à un service d'échange de messages courts ● Concepts à voir : ○ ○ ○ Aller plus loin dans les concepts vus TimerTaks, Services ListView, ListAdapters Avec le soutien de :
  • 71. Le serveur ● Serveur codé en Java offrant une API REST ○ Services : ■ Inscription ■ Identification ■ Envoi de message ■ Récupération des 20 derniers messages ■ Récupération des nouveaux messages depuis un instant donné Avec le soutien de :
  • 72. Première étape : l'inscription au service ● URI : http://lostinbrittany. org/java/AndroidBootcampServer/rest/user ○ Paramètres : username, password ○ Mèthode : PUT ○ Réponse JSON : {"result":"O.K."} ● Suggestion ○ ○ ○ ○ Réalisation de l'UI Création d'un thread utilitaire ou d'une AsyncTask Envoi de la requête HTTP Récupération de la réponse via le handler Avec le soutien de :
  • 73. Deuxième étape : l'identification ● URI : http://lostinbrittany. org/java/AndroidBootcampServer/rest/user ○ Paramètres : username, password ○ Mèthode : POST ○ Réponse JSON : {'token': 'TOKEN_IDENTIFICATION' ■ Il faudra renvoyer ce token à chaque envoi de message ● } Même URI que pour l'inscription, méthode différente Avec le soutien de :
  • 74. Troisième étape : Envoyons des messages ● Une UI simple mais fonctionnel ○ Un EditText et un Button en bas ○ Un ListView en haut Avec le soutien de :
  • 75. Troisième étape : Envoyons des messages ● URI : http://lostinbrittany. org/java/AndroidBootcampServer/rest/message ○ Paramètres : username, ○ Mèthode : POST ○ Réponse JSON : token, content {"result":"ok", 'timestamp': 'TIMESTAMP' } ■ Pour permettre la récupération des messages à partir d'un instant donné Avec le soutien de :
  • 76. Quatrième étape : recevons des messages ● Réception via pulling ○ Pushing pour Bootcamp Avancé ● Deux alternatives ○ Service ○ TimerTask ● On va commencer par la TimerTask, plus simple Avec le soutien de :
  • 77. Quatrième étape : recevons des messages ● TimerTaks : Une tâche programmé pour ○ ○ passer tous les x secondes et lancer un thread d'éxécution Avec le soutien de :
  • 78. Quatrième étape : recevons des messages ● URI : http://lostinbrittany.org/java/AndroidBootcampServer/rest/message/timestamp ○ Paramètres : timestamp ○ Mèthode : GET ○ Réponse JSON : [{"id":22,"timestamp":1341026043615,"user":"toto", "content":"titititi"}] ○ Il faut garder le timestamp du dernier message récupéré et la fois suivante ne demander que les messages produits après ce timestamp Avec le soutien de :
  • 79. Quatrième étape : recevons des messages ● Pour l'UI nous suggérons d'utiliser une ListView ○ La ListView par défaut ne présente que des labels ○ Nous on voudrait une ListView plus élaboré ■ Avec deux informations distinctes par ligne ■ Et éventuellement un avatar ○ Solution : utiliser un ListAdapter Avec le soutien de :
  • 81. Bilan ● Vous avez vu aujourd'hui : ○ Un aperçu de la plate-forme Android ○ Les concepts basiques d'une application Android ■ Activités, Services, Intents, AndroidManifest.xml ■ Layouts, widgets, strings.xml ■ Communications réseau, appels REST ■ AsyncTasks, TimerTask Avec le soutien de :
  • 82. Votre avis ● C'est notre quatrième Bootcamp Android ○ ○ On a essayé de réduire le côté théorique Et de mettre rapidement les mains à la pâte ● Qu'est-ce que vous en pensez ? ○ ○ ○ Trop simple ? Trop compliqué ? Trop long ? Trop court ? Trop théorique ? Trop pratique ? ● Votre avis est important pour nous ! Avec le soutien de :
  • 83. La suite ● Un Atelier Android Avancé le 14 décembre ● Vous y voudriez voir quoi ? On accepte des suggestions ! Avec le soutien de :