in01 - programmation android - 07 - techniques avancées

Download In01 - Programmation Android - 07 - techniques avancées

Post on 30-Nov-2014

498 views

Category:

Mobile

4 download

Embed Size (px)

DESCRIPTION

Dernier cours de la série. Ce chapitre présente un ensemble de techniques avancées (comme les capteurs, les testes unitaires, la concurrence, les vues personnalisées, les fragments...) ainsi qu'une vue d'ensemble des frameworks de jeux vidéos et alternatives multi plate-formes Bonne lecture

TRANSCRIPT

  • 1. IN01 Programmation Android 07 Techniques avances Yann Caron session sept 2014 Yann Caron (c) 2014 1
  • 2. Sommaire - Sance 07 Programmation avance Capteurs Optimisations Testes unitaires Concurrence IHM avances Vues personnalises Fragments Autres Stratgies et alternatives Jeux vidos mobiles session sept 2014 Yann Caron (c) 2014 2
  • 3. IN01 Sance 07 Programmation avance Capteurs session sept 2014 Yann Caron (c) 2014 3
  • 4. Gnralits La miniaturisation et l'industrialisation rendent aujourd'hui accessible des capteurs prcis au grand public La majorit des appareils Android embarquent au moins un acclromtre, un gyroscope et un magntomtre Les trois tiennent sur ce circuit :: session sept 2014 Yann Caron (c) 2014 4
  • 5. Diffrents capteurs Android TYPE_ACCELE ROMETER 3 m/s2 Mesure de l'acclration (gravit incluse) [0] axe x [1] axe y [2] axe z TYPE_GYROS COPE 3 Rad / s Mesure la rotation en termes de vitesse autour de chaque axe [0] vitesse x [1] vitesse y [2] vitesse z TYPE_LIGHT 1 Lux Mesure de la luminosit [0]valeur TYPE_MAGNE TIC_FIELD 3 Tesla Mesure du champ magntique [0] axe x [1] axe y [2] axe z TYPE_ORIENT ATION 3 degrs Mesure l'angle entre le nord magntique [0] Azimut y / nord [1] Rotation x (- 180,180) [2] Rotation y (-90,90) TYPE_PRESSU RE 1 KPas Mesure la pression [0]valeur TYPE_PROXIM ITY 1 mtre Mesure la distance entre l'appareil et un objet cible [0]valeur TYPE_TEMPER ATURE 1 Celsius Mesure la temprature [0]valeur session sept 2014 Yann Caron (c) 2014 5
  • 6. Prsence du capteur On peut interdire (ou pas) l'utilisation de l'application aux appareils qui ne possdent pas un certain capteur Utile si votre application ne peut pas fonctionner sans de faon correct Dans le manifest (toujours !!) :: session sept 2014 Yann Caron (c) 2014 6
  • 7. Sensor Manager Pour accder aux senseurs, on appelle une mthode de l'Activity qui renvoie un objet de type SensorManager SensorManager sensorManager = (SensorManager)getSystemService(Context.SENSOR_SERVICE); On peut rcuprer la liste des capteurs disponibles sur l'appareil ArrayList liste = (ArrayList) sensorManager.getSensorList(Sensor.TYPE_MAGNETIC_FIELD); session sept 2014 Yann Caron (c) 2014 7
  • 8. Obtenir une instance de capteur On peut maintenant obtenir une instance du capteur souhait Sensor accelerometre = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); Attention !! Si le capteur n'est pas disponible, l'objet renvoi la valeure null. Si le capteur n'est pas requis, il faut tester et grer s'il est absent. session sept 2014 Yann Caron (c) 2014 8
  • 9. vnement Les capteurs fonctionnent aussi sur un modle vnementiel final SensorEventListener mSensorEventListener = new SensorEventListener() { public void onAccuracyChanged(Sensor sensor, int accuracy) { // Que faire en cas de changement de prcision ? } public void onSensorChanged(SensorEvent sensorEvent) { // Que faire en cas d'vnements sur le capteur ? } }; Si la prcision change Si les valeurs ont changes session sept 2014 Yann Caron (c) 2014 9
  • 10. vnement Attention, il est prfrable d'enregistrer l'vnement lorsque l'application est active et de le ds-enregistrer lorsque celle-ci est inactive Sinon il continue de s'excuter @Override protected void onResume() { super.onResume(); mSensorManager.registerListener(mSensorEventListener, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() { super.onPause(); mSensorManager.unregisterListener(mSensorEventListener, mAccelerometer); } session sept 2014 Yann Caron (c) 2014 10
  • 11. vnement Valeurs L'vnement du capteur renvoi un tableau de valeurs float Leur nombre et leur signification varient selon les capteurs (voir tableau prcdent) public void onSensorChanged(SensorEvent sensorEvent) { float[] values = sensorEvent.values; Log.d("Sensors", "Acceleration sur l'axe x : " + values[0]); Log.d("Sensors", "Acceleration sur l'axe y : " + values[1]); Log.d("Sensors", "Acceleration sur l'axe z : " + values[2]); } session sept 2014 Yann Caron (c) 2014 11
  • 12. Rotation Doit tre calcule avec les valeurs de l'acclromtre et du magntomtre combines l'aide de formules complexes Deux mthodes existent pour faciliter ce calcul :: getRotationMatrix() et getOrientation() float[] values = new float[3]; float[] R = new float[9]; SensorManager.getRotationMatrix(R, null, accelerometreValues, magnetometreValues); SensorManager.getOrientation(R, values); Log.d("Sensors", "Rotation sur l'axe z : " + values[0]); Log.d("Sensors", "Rotation sur l'axe x : " + values[1]); Log.d("Sensors", "Rotation sur l'axe y : " + values[2]); session sept 2014 Yann Caron (c) 2014 12
  • 13. Quelques applications session sept 2014 Yann Caron (c) 2014 13
  • 14. IN01 Sance 07 Programmation avance Optimisations session sept 2014 Yann Caron (c) 2014 14
  • 15. Optimisation sous Android Pourquoi ?? Pour de meilleures performances !! Oui mais pour qui ?? Les applications de bas niveau (un compilateur de langage comme Algoid par exemple ;-)) Des applications gourmandes en ressources (les jeux vidos, les applications graphiques) session sept 2014 Yann Caron (c) 2014 15
  • 16. Rgles Les objets Eviter de crer des objets non ncessaires En rgle gnrale, viter de crer trop d'objets ! Parce que la cration d'objet c'est gourmand Et la destruction encore pire :: la dalvikVM bloque tout processus lors du GC (GC dit Stop the World) Prfrer les StringBuffer aux concatnations de Strings outrance Un tableau d'int est meilleur qu'un tableau d'Integer (utilisation des types primitifs) session sept 2014 Yann Caron (c) 2014 16
  • 17. Rgles Les listes Un tableau est meilleur qu'une ArrayList, mme rgle que prcdemment sur les types primitifs Une ArrayList est moins coteuse lire qu'une LinkedList (cration d'objet entry qui seront grer par le GC) session sept 2014 Yann Caron (c) 2014 17
  • 18. Rgles Les boucles Idal :: int size = myArray.length); for (int i = 0; i < size; i ++) { } La taille est value chaque itration Catastrophique :: Map myMap = new HashMap(); for (Entry item : myMap.entrySet()) { } Un objet Entry cr chaque itration session sept 2014 Yann Caron (c) 2014 18
  • 19. Rgles Mthodes et variables Prfrer les mthodes statiques aux mthodes de classe, si aucun attribut de la classe n'est ncssaire Utiliser static final pour les constantes Eviter les inner class, surtout si elles ne sont pas statiques Eviter les getter et setter (antipattern) Les float 2x plus lents que les int Les double sont 2x plus gourmands en mmoire que les float session sept 2014 Yann Caron (c) 2014 19
  • 20. Rgles - conclusion Attention toutefois ne pas abuser des rgles d'optimisation Evaluer si l'application ncessite une optimisation Toujours mettre en relation le gain de performance (CPU / Mem) et la lisibilit du code Car attention ! Ces rgles dgradent la qualit du code et donc la lisibilit et la rutilisabilit session sept 2014 Yann Caron (c) 2

Recommended

View more >