Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Android

 Android

Android Introduction in JUG Lausanne

Avatar for Jérôme Van Der Linden

Jérôme Van Der Linden

January 10, 2013
Tweet

More Decks by Jérôme Van Der Linden

Other Decks in Programming

Transcript

  1. 1 © OCTO 2012 © OCTO 2012 Android JUG Lausanne

    Janvier 2013 Jérôme Van Der Linden
  2. 2 © OCTO 2012 Moi Android Holo Colors Metroide !

      Architecte Java/JEE @ Octo !   Archi, dev, audit, conseil !   [email protected] !   Développeur Android depuis 2009 !   Metroide !   Formateur Octo depuis 2010 !   Auteur de android-holo-colors.com !   Co-Inventeur de Appaloosa !   Co-Auteur de Robospice @jeromevdl +Jérôme Van Der Linden
  3. 3 © OCTO 2012 Plan !  La plateforme Android !

     Les bases du développement !  Outillage et écosystème !  Bonnes pratiques
  4. 4 © OCTO 2012 Plan !  La plateforme Android !

     Les bases du développement !  Outillage et écosystème !  Bonnes pratiques
  5. 5 © OCTO 2012 OHA 1er SDK public v0.9 SDK

    1.0 Market HTC G1 SDK 1.5 (utilisable) HTC G2 SDK 1.6 Rachat Startup Android 08/2005 11/2007 08/2008 10/2008 05/2009 SDK 2.1 09/2009 01/2010 SDK 2.3 SDK 3.0 Tablettes only SDK 4.0 SDK 4.1 SDK 2.2 Push 05/2010 12/2010 02/2011 10/2011 07/2012 ... Market devient PlayStore 02/2012
  6. 8 © OCTO 2012 !   Sous ensemble de l’implémentation

    Apache Harmony !   JavaSE 5 !   Et aussi ... !   Junit (3.8) !   Apache commons logging et HttpComponents !   Parsers json et xml !   Mais ... !   Toutes les méthodes des classe Android sont stubés !   throw new RuntimeException("Stub"); !   Impossible d’exécuter / tester sans émulateur / device Java
  7. 9 © OCTO 2012 DVM : Dalvik Virtual Machine .java

    .class .dex .apk javac dx apkbuilber code bytecode application !   Compilation JIT depuis Android 2.2 !   Pas de génération de bytcode au runtime !   runtime weaving KO !   mais compiletime OK !   Des tentatives de groovy, scala !   GC mark&sweep https://sites.google.com/site/io/dalvik-vm-internals
  8. 10 © OCTO 2012 !   Système basé sur Linux

    !   users, groups, droits... : par défaut l’utilisateur n’est pas root !   Sandboxing !   Une VM par application !   Un user unique par application !   Un process unique par application !   Un espace dédié du filesystem par application !   Permissions !   Un ensemble de permissions pour accéder aux différents services !   Les permissions sont affichées avant l’installation de l’application !   Signature !   Les applications sont signées pour être publiées sur le store !   Communications !   Les applications ne peuvent communiquer entre elles sauf !   Par des Intents !   Si elles utilisent un filesystem commun (ex: SDCard) !   Si elles autorisent explicitement dans le manifest (ContentProviders, Services !   Si elles ont la même signature (partage du même user id) Sécurité
  9. 11 © OCTO 2012 Plan !  La plateforme Android !

     Les bases du développement !  Outillage et écosystème !  Bonnes pratiques
  10. 12 © OCTO 2012 Structure d’un projet Classes java Classes

    de mapping des ressources Android JAR d’Android Ressources « brutes » Ressources mappées par Android : - images (png, xml) -  animation (xml) -  écrans (xml) -  menus (xml) -  media (wav, aac, mp3, H.264, mpeg4, ogg) -  data : textes, styles couleurs, tableaux… (xml) Manifest de l’application
  11. 13 © OCTO 2012 AndroidManifest.xml Identification formelle de l’application Contenu

    de l’application : Icône, Nom, Activités, Services Contraintes tech de l’application Permissions de l’application <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.octo.android.askbob" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <uses-feature android:name="android.hardware.bluetooth" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".activity.SplashScreenActivity" android:theme="@android:style/Theme.NoTitleBar" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".activity.OctoDetailActivity" /> <service android:name="com.octo.android.askbob.network.AskBobJsonSpiceService" android:exported="false" /> </application> </manifest>
  12. 14 © OCTO 2012 Permissions !   130 permissions !

      internet, gps, bluetooth, contacts, telephone, sms, camera, vibreur, état du réseau/wifi, accès a la SD...
  13. 15 © OCTO 2012 public final class R { public

    static final class drawable { public static final int ic_dictionary=0x7f020000; public static final int ic_menu_search=0x7f020001; } public static final class layout { public static final int main=0x7f030000; public static final int result=0x7f030001; public static final int word=0x7f030002; } public static final class menu { public static final int options_menu=0x7f080000; } public static final class string { /** The name of the application. */ public static final int app_name=0x7f060000; /** The menu entry that invokes search. */ public static final int menu_search=0x7f060003; } public static final class id { public static final int list=0x7f090001; public static final int text=0x7f090000; } //... } Ressources R.java <resources> <!-- The name of the application. --> <string name="app_name">Dictionary</string> <!-- The menu entry that invokes search. --> <string name="menu_search">Search</string> </resources> strings.xml <TextView android:id="@+id/text" android:layout_width="fill_parent" android:layout_height="wrap_content" /> <ListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="0dp"> main.xml
  14. 16 © OCTO 2012 !   Utilisable dans le code

    java !   getResources.getDrawable (R.drawable.ic_menu_search) !   getResources.getString (R.string.menu_search) !   Et dans les xml !   @drawable/ic_dictionnary !   @string/menu_search !   @id/text Utilisation des ressources public final class R { public static final class drawable { public static final int ic_dictionary=0x7f020000; public static final int ic_menu_search=0x7f020001; } public static final class layout { public static final int main=0x7f030000; public static final int result=0x7f030001; public static final int word=0x7f030002; } public static final class menu { public static final int options_menu=0x7f080000; } public static final class string { /** The name of the application. */ public static final int app_name=0x7f060000; /** The menu entry that invokes search. */ public static final int menu_search=0x7f060003; } public static final class id { public static final int list=0x7f090001; public static final int text=0x7f090000; } //... } R.java
  15. 17 © OCTO 2012 !   Définit la structure visuelle

    de l’IHM, conteneur d’éléments graphiques !   Généralement défini en XML à la XUL !   Et récupérable depuis Java : !   Ou instancié dynamiquement en java à la Swing !   Plus rare sauf pour vos propres composants Layout <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:text="@string/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> SuperExtendedButton button = new SuperExtendedButton(context); button.setText(R.string.button1); layout.addView(button); Button button = (Button) findViewById(R.id.button);
  16. 19 © OCTO 2012 MVC Vue Contrôleur Modèle Activity, Fragment

    POJO, DB Layout (XML) <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/detail_background" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:padding="5dp" > <TextView android:id="@+id/detail_fullname" style="@style/DetailTitle" android:layout_width="wrap_content" android:layout_height="wrap_content"/> <Button style="@style/DetailButton" android:id="@+id/detail_mobile_button" android:layout_below="@id/detail_fullname" android:drawableLeft="@drawable/ic_menu_call" /> </RelativeLayout> </ScrollView> activity_detail.xml DetailActivity.java public class DetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); TextView fullNameTextView = (TextView) findViewById(R.id.detail_fullname); } }
  17. 20 © OCTO 2012 Cycle de vie des activités !

      onSaveInstanceState : !   backup des donnés de l’écran lors d’un changement de configuration (rotation de l’écran, reception d’un appel, ...)
  18. 21 © OCTO 2012 !   Résolution explicite !  

    Spécification d’un composant (class) !   Passage de paramètres !   Types primitifs (boolean, int, double, ...) + String !   Serializable !   Parcelable !   Réception des paramètres Intents – Navigation entre Activités ActivityA ActivityB Intent intent = new Intent(ActivityA.this, ActivityB.class); startActivity(intent); // OU startActivityForResult(intent, REQUEST_CODE); intent.putExtra(String key, value); protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); getIntent().getStringExtra(key); getIntent().getParcelableExtra(key2); // ... } ActivityB
  19. 22 © OCTO 2012 Parcelable public class User implements Parcelable

    { private String name; private int age; public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } public User(Parcel userParcel) { name = userParcel.readString(); age = userParcel.readInt(); } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } public User[] newArray(int size) { return new User[size]; } }; }
  20. 23 © OCTO 2012 !   Résolution implicite !  

    Via une action !   Exemple: partager du contenu !   Rendre son application réceptive à un Intent !   Via les intent-filter : action + category + data Intents – Navigation dans le système Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share"); startActivity(Intent.createChooser(sharingIntent, "Share via")); <activity android:name="ShareActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> <data android:mimeType="image/*" /> </intent-filter> </activity>
  21. 24 © OCTO 2012 !   onClick !   Disponible

    depuis le SDK 1.6, auparavant, il fallait définir un OnClickListener... !   Listeners !   OnClickListener !   OnFocusChangeListener !   OnKeyListener !   OnDragListener !   OnCheckedChangeListener !   OnMenuItemClickListener !   OnItemSelectedListener !   ... Événements <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="onButtonClick" /> layout public void onButtonClick(View v) { // do something } activity textview.setOnKeyListener(new OnKeyListener() { @Override public boolean onKey(View v, int keyCode, KeyEvent event) { // do something return false; } });
  22. 25 © OCTO 2012 LinearLayout <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/

    apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> </LinearLayout> !   Alignement Horizontal ou Vertical
  23. 26 © OCTO 2012 RelativeLayout <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://

    schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/button1" android:layout_alignLeft="@id/button1" android:text="@string/button2" /> <Button android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/button2" android:layout_below="@id/button1" android:text="@string/button3" /> </RelativeLayout> !   Positionnement relatif
  24. 27 © OCTO 2012 TableLayout <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http://

    schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button2" /> </TableRow> <TableRow> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button3" /> <Button android:id="@+id/button4" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button3" /> </TableRow> </TableLayout>
  25. 29 © OCTO 2012 !   Listview !   Utilisation

    d’Adapters pour populer la liste !   Idem pour les Gridview !   listview.setAdapter(myAdapter); !   BaseAdapter, ArrayAdapter, CursorAdapter Listes <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> public class MyAdapter extends BaseAdapter { public int getCount() {} // return cell number public Object getItem(int position) {} // return model object for the cell public long getItemId(int position) {} // return cell object id (position) public View getView(int position, View convertView, ViewGroup parent) { View cell = null; if (convertView == null) { // create view by inflating layout for the cell here } else { cell = convertView; // recycle an older cell } // set cell attributes here return cell; } }
  26. 31 © OCTO 2012 !   Soit le champ texte

    suivant : !   On peut extraire le style suivant : !   Et réduire ainsi le champ texte à : !   Mais surtout le rendre disponible à d’autres champs textes sans dupliquer des lignes et des lignes de propriétés Adoptez votre propre style <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="#00FF00" android:typeface="monospace" /> <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources> <TextView style="@style/CodeFont" android:text="@string/hello" />
  27. 32 © OCTO 2012 !   Héritage d’un style système

    !   Héritage d’un style défini !   Surcharge Héritage des styles <style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style> <style name="CodeFont.Red"> <item name="android:textColor">#FF0000</item> </style> <style name="CodeFont.Red.Big"> <item name="android:textSize">30dp</item> </style> <style name="CodeFont.Red.Dark"> <item name="android:textColor">#FF6611</item> </style>
  28. 33 © OCTO 2012 !   Un thème est un

    ensemble de styles appliqués à toute l’application ou à une activité entière !   Définition dans le fichier AndroidManifest.xml !   Depuis Honeycomb, Thème Holo (inspiré du film Tron) !   basé sur la couleur bleu #33b5e5 !   Pensez à étendre le style Holo ou Holo.Light pour vos thèmes Theme = ∑ styles <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light" > <activity android:name=".activity.SplashScreenActivity" android:theme="@android:style/Theme.NoTitleBar" /> <style name="CustomTheme" parent="android:Theme.Holo.Light"> <item name="android:windowBackground">@color/custom_theme_color</item> <item name="android:colorBackground">@color/custom_theme_color</item> </style>
  29. 34 © OCTO 2012 Plan !  La plateforme Android !

     Les bases du développement !  Outillage et écosystème !  Bonnes pratiques
  30. 35 © OCTO 2012 !   SDK Android !  

    Windows / Mac / Linux !   SDK Manager (« android ») !   Tools !   Platform-tools !   Sources Développement
  31. 36 © OCTO 2012 !   Android Developer Tools (ADT)

    !   Création, compilation, debug, packaging !   Auto complétion dans le XML !   Editeur WYSIWYG !   DDMS, analyse des devices : !   thread, !   mémoire, !   filesystem, !   simulation d’appels, de SMS, de GPS, ... !   Logcat !   accès aux logs des devices Eclipse + ADT
  32. 37 © OCTO 2012 !   Support natif d’Android !

      Même fonctionnalités que ADT !   Éditeur WYSIWYG depuis la v12 : IntelliJ
  33. 38 © OCTO 2012 !   android !   Permet

    de télécharger les différentes versions du SDK (SDK Manager) !   Permet de créer des projets Android !   Permet de créer des images AVD (Android Virtual Device) SDK Tools !   emulator !   Emule les images AVD !   Permet de tester/debugger l’application !   adb (Android Debug Bridge) !   Permet d’installer des apk (Android PacKage) sur le device !   Permet de copier des fichiers sur le device !   Permet d’exécuter des commandes shell sur le device
  34. 39 © OCTO 2012 !   Lint !   Analyse

    du code Android (~ PMD/Findbugs Android) !   Intégré à Eclipse et IntelliJ SDK Tools !   draw9patch !   Permet de créer des png « extensibles » !   Fichier « .9.png » !   traceview !   Profiling d’une application en cours d’exécution !   hierarchyviewer !   Permet de visualiser l’arbre des vues pour optimiser les perfs de l’UI
  35. 40 © OCTO 2012 !   Roboguice: Google guice pour

    Android !   Injection de dépendances !   Injection de view... Librairies !   Spring Android !   RestTemplate pour faciliter les appels de services HTTP/REST !   Robospice !   Traitements réseaux asynchrones !   Mise en cache !   Ormlite !   ORM léger pour Sqlite
  36. 41 © OCTO 2012 Librairies !   ActionBarSherlock !  

    Mise à disposition des ActionBar sur les Android < 3.0 !   HoloEverywhere !   Mise à disposition du thème Holo pour les Android < 3.0 !   Android Asset Studio & Android Holo Colors !   Création d’icônes, d’images (holo), de fichiers de styles, ... !   Et des dizaines d’autres disponibles sur !   http://www.theultimateandroidlibrary.com/ !   http://www.openintents.org/en/libraries !   http://www.androidviews.net/
  37. 42 © OCTO 2012 !   Spring ? !  

    Privilégier quelque chose de plus léger : Roboguice !   Hibernate ? !   Idem : Ormlite !   Guava ? !   Pourquoi pas, même si la lib est un peu lourde !   Utiliser proguard pour réduire la taille du binaire final !   Apache Commons ? !   Absolument, ne réinventez pas la roue ! !   Jackson !   OK, évitez de parser les json à la main  !   D’une manière générale !   Attention à la compatibilité avec le java d’Android !   Attention à la quantité et la taille des jars importés (dépendances transitives...) !   Vérifier qu’il n’y a pas un équivalent plus léger dédié à Android Et mes librairies Java ?
  38. 43 © OCTO 2012 !   Instrumentation Android !  

    Basé sur JUnit !   Test d’Activités, de Services Android, ... !   Manipulation du Context !   Exécution sur un AVD ou un device !   Très lent ! !   UIAutomator !   Disponible à partir du SDK 16 !   Manipulation de l’interface avec des selector (à la CSS) !   monkey & monkeyrunner !   Test du singe : événements aléatoires sur l’interface Tests – Android
  39. 44 © OCTO 2012 !   Basé sur les tests

    d’instrumentation Android !   Aussi lent... !   Manipulation plus simple de l’interface !   Solo Tests – Robotium public class MaintTest extends ActivityInstrumentationTestCase2<MainActivity> { private Solo solo; @Override protected void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); } public void testSendBob() { EditText FirsteditText = (EditText) solo.getView(R.id.edittext_name); solo.enterText(FirsteditText, "Bob"); solo.clickOnButton("Send"); assertTrue(solo.searchText("Hello Bob")); }
  40. 45 © OCTO 2012 !   Fonctionne sur une JVM

    standard !   Pas besoin de device ou d’émulateur pour exécuter les tests !   Remplace les RuntimeException(stub) par des « Shadow Objects »  Beaucoup plus rapide Tests – Robolectric @RunWith(RobolectricTestRunner.class) public class MyActivityTest { private Activity activity; private Button pressMeButton; private TextView results; @Before public void setUp() throws Exception { activity = new MyActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.press_me_button); results = (TextView) activity.findViewById(R.id.results_text_view); } @Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception { pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); } }
  41. 46 © OCTO 2012 !   Possibilité de faire du

    mock comme en Java !   Attention à Dalvik : Tous les frameworks ne sont pas compatibles !   Mockito !   Android Mock !   Easymock pas (encore) disponible !   En cours d’adaptation !   Android fournit également des classes de mock pour le contexte, les ressources, les contentprovider, ... Mocks
  42. 47 © OCTO 2012 !   Ant est l’outil de

    build initialement proposé par Google pour les projets Android !   build.xml automatiquement généré à la création d’un projet en ligne de commande (android create project ...) !   build.xml importe le build.xml fourni dans ${sdk.dir}/tools/ant/ !   Sauf besoins supplémentaires, il n’est pas nécessaire de définir des tâches de build !   Par défaut, couvre les besoins de compilation, packaging (release), déploiements sur un device/émulateur, test, coverage (emma) !   Est amené à disparaître... Build – Ant http://developer.android.com/tools/building/building-cmdline.html
  43. 48 © OCTO 2012 !   android-maven-plugin !   compile,

    package, test, deploie, execute, start/stop l’émulateur, obfusque, release, ... !   android.jar sur central depuis juin 2010 !   Ca n’a pas toujours été si simple...  : mosabua !   De nombreux jar de librairies également sur central !   Ca n’a pas toujours été si simple...  : mvn install:installl-file !   Intégration dans Eclipse avec m2eclipse (+ android connector) !   Ca n’a pas toujours été si simple...  : m2eclipse-android-plugin !   Intégration native dans IntelliJ  Build – Maven http://code.google.com/p/maven-android-plugin/ <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.5</version> </plugin>
  44. 49 © OCTO 2012 !   Gradle est le futur

    outil de build préconisé par Google, en remplacement de Ant !   Actuellement en version 0.1, pas stable et surtout pas accessible au commun des mortels (SDK previews) !   Un projet plus mature existe en attendant... !   https://github.com/jvoegele/gradle-android-plugin Build – Gradle http://tools.android.com/tech-docs/new-build-system/using-the-new-build-system
  45. 50 © OCTO 2012 Intégration continue Privilégier le plugin maven

    au plugin jenkins pour démarrer un émulateur
  46. 51 © OCTO 2012 Plan !  La plateforme Android !

     Les bases du développement !  Outillage et écosystème !  Bonnes pratiques
  47. 52 © OCTO 2012 Supporter la fragmentation Versions du SDK

    Résolutions & densités d’écrans http://developer.android.com/about/dashboards 29/12/2012
  48. 53 © OCTO 2012 Gestions des différentes versions du SDK

    97% !  Oublier les versions < 2.2 !   3 % du parc... tanpis pour eux  !  Attention quand vous développez avec une version récente du SDK ! !   Code non dispo dans les SDK antérieurs  Lint saura vous le rappeler !   Si besoin utiliser @TargetApi(API)! !   Et vérifier la valeur de android.os.Build.VERSION.SDK_INT! !  Utiliser la librairie de support !   android-support.jar !   Backport des fonctionnalités 3+ pour les versions >= 1.6 !   Fragments !   ViewPager !   Notifications !   ...
  49. 54 © OCTO 2012 Gestion des résolutions et densités !

      Des dizaines de résolutions différentes !   320x240, 400x240, 640x240, 640x360, 480x320, 800x480, 854x480, 800x600, 960x540, 960x640, 1280x800, 1366x768… !  Densité (dp) !   Unité de mesure indépendante des pixels !   1 dp = 1 pixel en mdpi !   px = dp * (dpi / 160) !   Utiliser les dp et sp, pas les px ! !   Oublier les small et ldpi !   3% du parc !   La tendance est aux grands écrans 97% 3 4 6 8
  50. 55 © OCTO 2012 Gestion des résolutions et densités !

      Limiter l’utilisation de dimension fixes !   Privilégier wrap_content, fill_parent/match_parent !   Utiliser layout_weight, !   Pourcentage sur l’écran !   Utiliser les RelativeLayout !   Utiliser les images xml et les 9 patch (.9.png) !   images extensibles <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="270" android:centerY="0.4" android:endColor="@color/dark_blue" android:startColor="@color/blue" android:centerColor="@color/light_blue" /> <stroke android:width="1dp" android:color="@color/border_grey" /> <corners android:radius="6dp" /> <padding android:bottom="10dp" android:left="12dp" android:right="12dp" android:top="10dp" /> </shape>
  51. 56 © OCTO 2012 Gestion de la diversité !  

    Beaucoup de ressources... !   Il existe 18 types de qualifier : ne pas tout combiner ! !   Ex : application Contacts Android traductions ressources utiles
  52. 57 © OCTO 2012 Pensez aux tablettes !   Une

    tablette n’est pas nécessairement xlarge !   Il existe des tablettes 7’ large  utiliser sw580dp à la place !   Adoptez les fragments !   Découpage de l’UI en « Fragments » !   Mutualisation des layouts entre smartphone et tablette
  53. 58 © OCTO 2012 Fragments Fragment.java! layout/ fragment.xml ! Fragment

    ! Activity.java ! layout/ activity.xml ! !  activity.xml : !  Fragment.java : <fragment android:name="path.to.source.Fragment" android:id="@+id/fragment_main_list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> public View onCreateView(Inflater inflater, View container, Bundle bundle) { return inflater.inflate(R.layout.fragment, container, false); } !   Les fragments deviennent les contrôleurs !   L’activité gère la communication entre fragments !   transactions : ajout, suppression, remplacement de fragment
  54. 59 © OCTO 2012 User Experience – ActionBar !  

    Disponible à partir du SDK 3 !   Utiliser ActionBarSherlock pour les versions antérieures !   Mixe automatique actionbar + menu contextuel sur les smartphones
  55. 60 © OCTO 2012 User Experience – Ne bloquez pas

    l’UI !   Éviter d’instancier des objets dans les méthodes appelées des dizaines de fois par seconde (ex : onTouch, onScroll, onDraw...) !   Ne jamais faire de traitement long dans le thread UI !   Appels de webservices, requête complexe en bdd, decodage de bitmap, ... !   Utiliser des mécanismes pour faire des traitements asynchrones !   AsyncTask & AsyncTaskLoader !   Services !   Librairie Robospice (basée sur les services)
  56. 61 © OCTO 2012 User Experience – Think Android !

    Android iOS WP7 !   Pas de bouton back !   Bouton physique ou dans l’ActionBar !   Pas d’indicateurs sur les lignes de liste !   Simplement rien  !   Les onglets (Tab) sont en haut de l’écran !   Les icones des applications sont différentes (pas de halo, de carré arrondi) !   ...
  57. 62 © OCTO 2012 Ressources !   http://developer.android.com/index.html !  

    Site de référence : très complet !   http://android-developers.blogspot.fr/ !   Blog officiel Google Android : annonces et bons articles !   http://www.androiduipatterns.com/ !   Blog sur les patterns UI et UX !   http://androiddevweekly.com/ !   Toutes les semaines, des articles, des libs, des exemples, des tutos... !  http://android.cyrilmottier.com/ !   Blog de Cyril Mottier, un expert Android reconnu !   Twitter : #android #androiddev !   Google+ : +AndroidDevelopers