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

Android

 Android

Android Introduction in JUG Lausanne

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