SlideShare une entreprise Scribd logo
1  sur  101
GUIDE DE DEVELOPPEMENT
LE
POUR
ANDROID
Conception
Android 4.x
Guidelines
Outils
Développement
Cas particuliers
Bootstrapping
Annotations
Autres librairies
Outils
Ressources
Disparition du bouton Menu remplacé par un
équivalent dans l’ActionBar
smartphones
UNIFICATION DES INTERFACES
Android 2
tablettes
Android 3
Accès direct aux apps depuis l’écran de
verrouillage
Face Unlock
Roboto
Android Beam & WiFi Direct
Notifications extensibles
Projet Butter
Raccourcis et widgets arrangés/dimensionnés
Transfert de données via Bluetooth pour
Android Beam
Google Wallet
Google Now
Google Chrome sur appareils avec Android 4.1
pré-installé
Gestion du multi-comptes (uniquement sur
tablette)
Protection parentale
Photo Sphere
Nouveau clavier Swype
Editeur d’interface multi-config
Nouvelle version de l’ UI Automator Test
Framework
Key Lime Pie
Preview Channel
Templates
<android-sdk-folder>/extras/templates/
http://goo.gl/rwH6c
http://goo.gl/VTYZy
Recopier les interfaces depuis d’autres OS
Fenêtres modales et boites de dialogues
Absolute Layout
Mesures en px
Plus de 4 onglets
EVITER
Ressources adaptées aux écrans
Larges et évidentes cibles cliquables
Gérer le cycle de vie & le changement
d’orientation
Réduire la redondance de code
CORRECT
Centrer utilisateur
Rendre les choses visibles
Montrer les effets appropriés
1 <selector>
2 <item android:drawable="@drawable/foo_disabled"
3 android:state_enabled="false">
4 <item android:drawable="@drawable/foo_pressed"
5 android:state_pressed="true">
6 <item android:drawable="@drawable/foo_focused"
7 android:state_focused="true">
8 <item android:drawable="@drawable/foo_default">
9 </selector>
RETOUR VISUEL
Centrer utilisateur
Rendre les choses visibles
Montrer les effets appropriés
Être prévisible
Être tolérant aux erreurs
If an error is possible,
someone will make it.
Donald Norman (author of
"The Design of Everyday Things”)
ACTION BAR
DASHBOARD
Fly-in App Menu
MENU LATÉRAL
RESPONSIVE
SIDE MENU : 3 PRINCIPAUX AVANTAGES
DYNAMIQUE ACCES RAPIDE
RESPONSIVE
FONCTIONNE BIEN SUR
SMARTPHONES
RESPONSIVE
FONCTIONNE BIEN SUR
TABLETTES
DYNAMIQUE
s’agrandir
s’agrandir
s’agrandir
Le contenu peut s’agrandir
s’agrandir
s’agrandir
s’agrandir
ACCES RAPIDE
S’ouvre plus rapidement
qu’un dashboard
car pas besoin de transition entre
activités
VISUELLEMENT
INDICATION
INDICATION
BEZEL SWIPE
DÉCOUVERTE
ONGLETS
3 systèmes de navigation
DASHBOARD MENU LATÉRAL
2 OPTIONS
Librairie
https://github.com/jfeinstein10/SlidingMenu
Implémentation personnalisée
http://android.cyrilmottier.com/?p=658
http://android.cyrilmottier.com/?p=701
http://android.cyrilmottier.com/?p=717
QUICK RETURN
UNDO BAR
Plus d’infos sur les guidelines à respecter :
http://developer.android.com/design/index.html
http://www.androiduipatterns.com/
Android UI Patterns App
http://www.androidviews.net/
9-patch
Prototyping stencils for Pencil
Android Asset Studio
Prototyping
CRAYON + FEUILLE
Développement
Cas particuliers
Fragment
AsyncTask
ListView
Bootstrapping
Annotations
Autres librairies
Outils
http://goo.gl/XI5wJ
Portions d’écran avec un cycle de vie
L’UIThread ne peut être bloqué
1 private class MyTask
extends AsyncTask<Param, Progress, Result> { ... }
onPreExecute()
doInBackground(Param… params)
onProgessUpdate(Progress… progress)
onPostExecute(Result result)
1 private class MyTask
extends AsyncTask<Param, Progress, Result> { ... }
1 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
2 protected Long doInBackground(URL... urls) {
3 int count = urls.length;
4 long totalSize = 0;
5 for (int i = 0; i < count; i++) {
6 totalSize += Downloader.downloadFile(urls[i]);
7 publishProgress((int) ((i / (float) count) * 100));
8 if (isCancelled()) break;
9 }
10
11 return totalSize;
12 }
13
14 protected void onProgressUpdate(Integer... progress) {
15 setProgressPercent(progress[0]);
16 }
17
18 protected void onPostExecute(Long result) {
19 showDialog("Downloaded " + result + " bytes");
20 }
21 }
Android 1.5 Android 1.6 Android 3
Tâches
sérialisées
Pool de
threads
Par défaut :
Tâches
sérialisées
1 public View getView(int position, View convertView, ViewGroup parent) {
2
3 if (convertView == null) {
4 convertView = inflater.inflate(R.layout.your_layout, false);
5 }
6
7 TextView text = (TextView) convertView.findViewById(R.id.text);
8 text.setText("Position " + position);
9
10 return convertView;
11 }
VIEW RECYCLING
1 public View getView(int position, View convertView, ViewGroup parent) {
2 ViewHolder holder;
3 if (convertView == null) {
4 convertView = inflater.inflate(R.layout.your_layout, false);
5
6 holder = new ViewHolder();
7 holder.text = (TextView) convertView.findViewById(R.id.text);
8 convertView.setTag(holder);
9 } else {
10 holder = (ViewHolder) convertView.getTag();
11 }
12 }
13 holder.text.setText("Position " + position);
14 return convertView;
15 }
16
17 private static class ViewHolder {
18 public TextView text;
19 }
VIEW HOLDER PATTERN
ASYNC LOADING
http://goo.gl/PNfyW
Pour aller plus loin :
http://goo.gl/LN7Cg
GreenDroid :
Handling emptiness
Sectioning your ListView
Create fancy ListViews
Add several clickable areas
Enlarged touchable areas
Android Bootstrap
Android KickstartR
Toujours
ces mêmes
étapes de
config !
http://androidbootstrap.com
Démarrer rapidement le développement
Se concentrer sur la logique métier
Application de base préconfigurée
Maven
Fragments, Account Manager, RoboGuice,
ActionBarSherlock, ViewPagerIndicator,
http-request, GSON, Robotium,
WebServices simplifiés…
Accès authentifié
par WebService
Chargement
asynchrone
Structure propre
Listes riches et
personnalisées
http://androidkickstartr.com
Personnalisation poussée
Android Annotations
Spring RestTemplate
ActionBar Sherlock
NineOldAndroids
Library Support
ACRA
Android Annotations
ActionBar Sherlock
Library Support
Android Annotations
Spring RestTemplate
ActionBar Sherlock
Library Support Android Annotations
Spring RestTemplate
ActionBar Sherlock
NineOldAndroids
Support Library
ACRA
Basic
REST
Full
Maven Eclipse
@ndroid @nnotations
RoboGuice
http://androidannotations.org
Précompilateur + Librairie
Composants
améliorés
Injection
Binding
Evenements
REST API
Threading
1 public class MyActi extends Activity {
2 @Override
3 protected void onCreate(Bundle savedInstanceState) {
4 ...
5 requestWindowFeature(Window.FEATURE_NO_TITLE);
6 getWindow().setFlags(FLAG_FULLSCREEN, FLAG_FULLSCREEN);
7 }
8 }
1 @NoTitle
2 @Fullscreen
3 public class MyActi extends Activity {
4 @Override
5 protected void onCreate(Bundle savedInstanceState) {
6 ...
7 }
8 }
ACTIVITÉ PLEIN ÉCRAN
1 View updateBookmarksButton1 = findViewById(R.id.updateBookmarksButton1);
2 updateBookmarksButton1.setOnClickListener(new OnClickListener() {
3 @Override
4 public void onClick(View v) {
5 updateBookmarksClicked();
6 }
7 });
8
9 View updateBookmarksButton2 = findViewById(R.id.updateBookmarksButton2);
10
11 updateBookmarksButton2.setOnClickListener(new OnClickListener() {
12 @Override
13 public void onClick(View v) {
14 updateBookmarksClicked();
15 }
16 });
CLIC SUR UN BOUTON
1 @Click({R.id.updateBookmarksButton1, R.id.updateBookmarksButton2})
2 void updateBookmarksClicked() {
3 ...
4 }
CLIC SUR UN BOUTON
1 class UpdateBookmarksTask extends AsyncTask<String, Void, Bookmarks> {
2
3 @Override
4 protected Bookmarks doInBackground(String... params) {
5 ...
6 }
7
8 @Override
9 protected void onPostExecute(Bookmarks result) {
10 ...
11 }
12 }
1 @Background
2 void searchAsync(String searchString, String userId) {
3 Bookmarks bookmarks = restClient.getBookmarks(searchString, userId);
4 updateBookmarks(bookmarks);
5 }
TÂCHE ASYNCHRONE
class MaClasse extends Activity
class MaClasse_ extends MaClasse
<activity android:name=".MaClasse_" /> startActivity(this, MaClasse_.class);
FONCTIONNEMENT
http://code.google.com/p/roboguice
Basé sur Google Guice
Précompilateur Exécution
Aucun impact sur le code
Impact sur la performance
1 class AndroidWay extends Activity {
2 TextView name;
3 ImageView thumbnail;
4 LocationManager loc;
5 Drawable icon;
6 String myName;
7
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.main);
11 name = (TextView) findViewById(R.id.name);
12 thumbnail = (ImageView) findViewById(R.id.thumbnail);
13 loc = (LocationManager)
14 getSystemService(Activity.LOCATION_SERVICE);
15 icon = getResources().getDrawable(R.drawable.icon);
16 myName = getString(R.string.app_name);
17 name.setText( "Hello, " + myName );
18 }
19 }
1 class RoboWay extends RoboActivity {
2 @InjectView(R.id.name) TextView name;
3 @InjectView(R.id.thumbnail) ImageView thumbnail;
4 @InjectResource(R.drawable.icon) Drawable icon;
5 @InjectResource(R.string.app_name) String myName;
6 @Inject LocationManager loc;
7
8 public void onCreate(Bundle savedInstanceState) {
9 super.onCreate(savedInstanceState);
10 setContentView(R.layout.main);
11 name.setText( "Hello, " + myName );
12 }
13 }
Support Library
ActionBarSherlock
GreenDroid(Light)
Google Cloud Messaging
Spring for Android
Polaris
http://developer.android.com
Développé par Google
Réponse à la
fragmentation
des versions
Données recueillies au cours d'une période de 14 jours se terminant
le 1er Novembre 2012
V4 V13
Fragment
AsyncTaskLoaderCursorLoader
FragmentManager FragmentTransaction
ListFragmentDialogFragment
Loader
LoaderManager
Inclusion en 1 clic (droit)
FONCTIONNEMENT
http://www.springsource.org/spring-android
Client REST OAuth
Basé sur
HTTP - RestTemplate
+ Jackson
+ Google Gson
+ Simple XML Serialization
+ Android Rome Feed Reader
JSON
XML
RSS
Atom
CLIENT REST
HTTP - RestTemplate
1 String url = "https://ajax.googleapis.com/ajax/services/search/web?v=1.0&q={query}";
2
3 RestTemplate restTemplate = new RestTemplate();
4 restTemplate.getMessageConverters().add(new StringHttpMessageConverter());
5
6 String result = restTemplate.getForObject(url, String.class, "Ma recherche");
CLIENT REST
OAUTH
+ Spring Security
+ Spring Social
Encryption
OAUTH
Maven for Android
Testing
Robotium
Android UI Automator Test
Framework
Statut : "C’est compliqué"
http://code.google.com/p/robotium
“ Every non-trivial program has at least one bug. “
Murphy
… pour tous les autres, il y a Robotium.
Scénarios de test pour UI
> Android 1.6 Fonctionne sur l’émulateur
Sources Tests sources ou APK
1 public class EditorTest extends ActivityInstrumentationTestCase2<EditorActivity> {
2
3 solo.sendKey(Solo.MENU);
4
5 solo.clickOnText("Preferences");
6
7 Assert.assertTrue(solo.searchText("rtf"));
8
9 solo.goBack();
10
11 solo.enterText(2, "robotium");
12
13 solo.clickOnButton("Save");
14
15 }
http://developer.android.com
1. UIAutomatorViewer
2. UIAutomator
3. Moteur d’exécution
> Android 4.1 Fonctionne sur l’émulateur
Sources Tests sources ou APK
Fichier .jar à exécuter.
1 public class EditorTest extends ActivityInstrumentationTestCase2<EditorActivity> {
2
3 public class LaunchSettings extends UiAutomatorTestCase {
4 getUiDevice().pressHome();
5 UiObject allAppsButton = new UiObject(new
6 UiSelector().description("Apps"));
7 allAppsButton.clickAndWaitForNewWindow();
8 UiObject settingsValidation = new UiObject(new UiSelector()
9 .packageName("com.android.settings"));
10 assertTrue("Unable to detect Settings", settingsValidation.exists());
11 }
12 }
FrAndroid DevTips
Cyril Mottier’s blog
Videos Google I/O
Roman Nurik
Blog officiel : http://android-developers.blogspot.fr/
Particulièrement
http://developer.android.com/training/index.html
Tutoriels sur http://www.androidhive.info/
Design inspiré des présentations de Cyril
Mottier
https://speakerdeck.com/cyrilmottier
Le Guide de Développement pour Android

Contenu connexe

Similaire à Le Guide de Développement pour Android

Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielleECAM Brussels Engineering School
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationECAM Brussels Engineering School
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement AndroidSteve Tremblay
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsantony_guilloteau
 
Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Fred Brunel
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidHoussem Lahiani
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetCocoaHeads France
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflineDNG Consulting
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanMicrosoft
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des appsNoé Breiss
 
Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613SOAT
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web servicesYann Caron
 
Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Bruno Delb
 

Similaire à Le Guide de Développement pour Android (20)

Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 
Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mise en place de l'ActionBarCompat dans vos projets Android.
Mise en place de l'ActionBarCompat dans vos projets Android.
 
Programmation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulationProgrammation orientée objet : Object, classe et encapsulation
Programmation orientée objet : Object, classe et encapsulation
 
5.ateliers avancés
5.ateliers avancés5.ateliers avancés
5.ateliers avancés
 
Composition, agrégation et immuabilité
Composition, agrégation et immuabilitéComposition, agrégation et immuabilité
Composition, agrégation et immuabilité
 
Johnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScriptJohnny-Five : Robotique et IoT en JavaScript
Johnny-Five : Robotique et IoT en JavaScript
 
Introduction au développement Android
Introduction au développement AndroidIntroduction au développement Android
Introduction au développement Android
 
react-fr.pdf
react-fr.pdfreact-fr.pdf
react-fr.pdf
 
Au secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOpsAu secours, mon chef m'a demandé de passer au DevOps
Au secours, mon chef m'a demandé de passer au DevOps
 
Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)Web-In 2010: Programmation Native iOS (French)
Web-In 2010: Programmation Native iOS (French)
 
Cycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'AndroidCycle de vie d'activité Android et les composant d'Android
Cycle de vie d'activité Android et les composant d'Android
 
Apple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey BocquetApple Watch par Benoit Capallere et Joeffrey Bocquet
Apple Watch par Benoit Capallere et Joeffrey Bocquet
 
Présentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'OfflinePrésentation GWT et HTML 5 pour l'Offline
Présentation GWT et HTML 5 pour l'Offline
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Découverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet SpartanDécouverte du moteur de rendu du projet Spartan
Découverte du moteur de rendu du projet Spartan
 
Tutorial android - créer des apps
Tutorial android - créer des appsTutorial android - créer des apps
Tutorial android - créer des apps
 
Tutorial android
Tutorial androidTutorial android
Tutorial android
 
Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613Play : Premiers pas par l'exemple le 120613
Play : Premiers pas par l'exemple le 120613
 
Programmation Android - 09 - Web services
Programmation Android - 09 - Web servicesProgrammation Android - 09 - Web services
Programmation Android - 09 - Web services
 
Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)Android Lab Test : La reconnaissance vocale (français)
Android Lab Test : La reconnaissance vocale (français)
 

Le Guide de Développement pour Android