Depuis maintenant 7 ans que je développe sous Android, ma principale préoccupation a toujours été l'architecture.
Et si nous prenions quelques heures pour en discuter ?
Je vous propose une vision globale et synthétique s'appuyant sur des exemples concrets, sur les principes et conseils de référence des équipes Google et sur des modèles d'architecture (MVP/n-tiers) et leur mises en place.
Au programme:
Le contexte Android,
L'objectif utilisateur,
La responsabilité du développeur,
Les bonnes pratiques (celles de Chet Haase, Romain Guy et les miennes),
Les principes d'architecture (n-tiers, MVP et MVVM),
Leur application sur Android (services, threads, Application ...),
Le déploiement continue,
Les librairies incontournables du moment,
Un exemple concret d'utilisation d'un service REST (up et download)
et bien sûr un projet github est associé à cette conférence pour que le code soit avec vous !
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2Mathias Seguy
Depuis maintenant 7 ans que je développe sous Android, ma principale préoccupation a toujours été l'architecture.
Et si nous prenions quelques heures pour en discuter ?
Je vous propose une vision globale et synthétique s'appuyant sur des exemples concrets, sur les principes et conseils de référence des équipes Google et sur des modèles d'architecture (MVP/n-tiers) et leur mises en place.
Au programme:
Le contexte Android,
L'objectif utilisateur,
La responsabilité du développeur,
Les bonnes pratiques (celles de Chet Haase, Romain Guy et les miennes),
Les principes d'architecture (n-tiers, MVP et MVVM),
Leur application sur Android (services, threads, Application ...),
Le déploiement continue,
Les librairies incontournables du moment,
Un exemple concret d'utilisation d'un service REST (up et download)
et bien sûr un projet github est associé à cette conférence pour que le code soit avec vous !
DroidConUk 2016 [Barcamp]
In this conference, I want to talk about treatments.
By treatments, I mean where and how do you implement your business logic, the way your application handles data, your global algorithms,
And to do that, I need first to talk you about Architecture. But in Android, when you say "Architecture" every boby answers MVP / MVVM / ... so we will first have a look to those patterns, from an history point of view then we will discover that we have missed some layer to split concerns accross the application.
So we will talk about layer architecture (yep, also known as N-Tier architecture).
So, we have a better idea of what a generic architecture should be, now let's apply it on Android: Let's talk about the application object, and the service services layer, in particular we'll dive into the problem "do our business services have to be implemented extending Service ?".
Then I talk to you about a ServiceManager, that we have to implement, to centralize the management of all your services and all your threads pools.
And some much more :)
Enjoy the talk,
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiqueDenis Voituron
Le Model View ViewModel (MVVM) est une architecture et une méthode de conception utilisée dans le génie logiciel. Apparu en 2004, MVVM est adapté pour le développement des applications basées sur les technologies Windows (desktop, tablette ou mobile), mais également Web/HTML5. Cette méthode permet de séparer la vue de la logique et de l'accès aux données en accentuant les principes de binding et d’événement. Une bonne vue générale a été donnée par Laurent Bugnion, le père du MVVMLight, dans le podcast #11 de DevApps (http://devapps.be/podcast/11).
http://www.meetup.com/fr-FR/micbelgique/events/228368909/?eventId=228368909
The document provides an overview of the nervous system, including its basic functions, organization, and components. Key points:
1) The nervous system is a network of nerve cells that functions as the control center of the body, integrating homeostasis, movement, and other functions.
2) It has two main divisions - the central nervous system (CNS) comprising the brain and spinal cord, and the peripheral nervous system outside of the CNS.
3) Neurons are the basic functional units that conduct electrical signals to transmit information via chemical neurotransmitters at synapses.
Architecture et Bonnes pratiques Android #DevoxxFr2016 Part2Mathias Seguy
Depuis maintenant 7 ans que je développe sous Android, ma principale préoccupation a toujours été l'architecture.
Et si nous prenions quelques heures pour en discuter ?
Je vous propose une vision globale et synthétique s'appuyant sur des exemples concrets, sur les principes et conseils de référence des équipes Google et sur des modèles d'architecture (MVP/n-tiers) et leur mises en place.
Au programme:
Le contexte Android,
L'objectif utilisateur,
La responsabilité du développeur,
Les bonnes pratiques (celles de Chet Haase, Romain Guy et les miennes),
Les principes d'architecture (n-tiers, MVP et MVVM),
Leur application sur Android (services, threads, Application ...),
Le déploiement continue,
Les librairies incontournables du moment,
Un exemple concret d'utilisation d'un service REST (up et download)
et bien sûr un projet github est associé à cette conférence pour que le code soit avec vous !
DroidConUk 2016 [Barcamp]
In this conference, I want to talk about treatments.
By treatments, I mean where and how do you implement your business logic, the way your application handles data, your global algorithms,
And to do that, I need first to talk you about Architecture. But in Android, when you say "Architecture" every boby answers MVP / MVVM / ... so we will first have a look to those patterns, from an history point of view then we will discover that we have missed some layer to split concerns accross the application.
So we will talk about layer architecture (yep, also known as N-Tier architecture).
So, we have a better idea of what a generic architecture should be, now let's apply it on Android: Let's talk about the application object, and the service services layer, in particular we'll dive into the problem "do our business services have to be implemented extending Service ?".
Then I talk to you about a ServiceManager, that we have to implement, to centralize the management of all your services and all your threads pools.
And some much more :)
Enjoy the talk,
Présentation et bonnes pratiques du pattern MVVM - MIC BelgiqueDenis Voituron
Le Model View ViewModel (MVVM) est une architecture et une méthode de conception utilisée dans le génie logiciel. Apparu en 2004, MVVM est adapté pour le développement des applications basées sur les technologies Windows (desktop, tablette ou mobile), mais également Web/HTML5. Cette méthode permet de séparer la vue de la logique et de l'accès aux données en accentuant les principes de binding et d’événement. Une bonne vue générale a été donnée par Laurent Bugnion, le père du MVVMLight, dans le podcast #11 de DevApps (http://devapps.be/podcast/11).
http://www.meetup.com/fr-FR/micbelgique/events/228368909/?eventId=228368909
The document provides an overview of the nervous system, including its basic functions, organization, and components. Key points:
1) The nervous system is a network of nerve cells that functions as the control center of the body, integrating homeostasis, movement, and other functions.
2) It has two main divisions - the central nervous system (CNS) comprising the brain and spinal cord, and the peripheral nervous system outside of the CNS.
3) Neurons are the basic functional units that conduct electrical signals to transmit information via chemical neurotransmitters at synapses.
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015Mathias Seguy
This is the slide of the conference gave at the DroidCon London 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
The 2016 Android Developer Toolbox [NANTES]Nilhcem
This document discusses various tools for Android development including build variants, debug menus, measuring performance, static code analysis, testing, and debugging. It provides details on tools like Android Studio, LeakCanary, Hugo, and Stetho for monitoring apps. It also covers setting up a mock server, using Charles Proxy and hosts editor for testing network requests, and exploring apps with APKTool, JADx, and SonarQube.
Voyage en monde Android. Trucs et astuces tout au long de la route.Mathias Seguy
Conférence donnée au Paris Android User Group du 18/06/2014
Toi, oui, toi, le développeur Android, expert ou débutant, prends ton billet, je t’emmène.
Je te propose un périple au sein du monde du développement Android. Je te parlerai de Design et d'UX, de techniques de dèv, d'asynchronicité et de sécurité, de bonnes pratiques, d'architecture, de librairies, de stratégies réseau... et de bien d'autres choses encore. De tous ces détails qui font qu'une application devient une application d'excellence.
Je te montrerai la rue des pro-tips, l'avenue des bonnes pratiques, les monts d'archis. Tu parcourras avec moi tous ces chemins qui amélioreront ton développement, ta pensée, ta conception, ton application Android.
Et quand, je te ramènerai dans ton port d'origine, les yeux qui brillent tu auras et mettre à jour ton application Android tu iras.
Simple matelot ou capitaine de navire, ne laisse pas passer ce voyage, il t'ouvrira de nouvelles voies du monde Android.
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)Mathias Seguy
This is the slide of the conference gave at the DroidCon Paris 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
Android2EE training: Tutorials list of Android projectsMathias Seguy
This is the list of the projects and tutorials associated with the Android training of Android2EE.
I mean each Android2EE's trainee received a USB key that contains all those Android projects (in an Eclipse workspace) and each project can be used freely (except for training) in personal and professional projects.
Google Plus SignIn : l'Authentification GoogleMathias Seguy
Cette conférence vous expliquera en détail pourquoi mettre en place cette authentification et surtout comment la mettre en place.
Vous découvrirez ainsi:
la console des GoogleService,
comment utiliser l’objet PlusClient et ConnectionResult pour gérer l’identification de votre utilisateur,
comment mettre en place la « magic connexion » et la « manual connexion »,
comment mettre en place cette authentification au sein du cycle de vie de votre application,
comment charger le graphe social de l’utilisateur, faire des posts interactifs et des « application activities »…
Un grand moment pour tous ceux qui se demandent encore quelle est la meilleure stratégie pour authentifier son utilisateur.
Cette conférence s’associe:
d’un tutorial que vous pouvez retrouver sur GitHub: SignInWithGoogleTutorial(https://github.com/MathiasSeguy-Android2EE/SignInWithGoogleTutorial) sur GitHub.
d’une application mettant en place cette authentification que vous pouvez retrouver sur GooglePlay: MyPublicGoogleProfile (https://play.google.com/store/apps/details?id=com.android2ee.project.gplus.signin.publicid&hl=fr).
Et bien sûr la conférence va être disponible sur Android2EE dès le Vendredi 20 au rayon OpenResource\Conférences.
Vous aussi, authentifiez vos utilisateurs, inter-agissez avec eux et simplifiez leur la vie:
En espérant que vous y découvrirez votre bonheur :) .
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...Mathias Seguy
Cette présentation a été donnée à l'Eclipse Day Toulouse 2012 par Android2EE - Mathias Seguy (1/2h).
L’objectif est de présenter l'utilisation du plugin Android pour eclipse, en particulier la Vue DDMS. Cette présentation se finit par la mise en place de la chasse d'une fuite mémoire dans un programme Android avec l'utilisation du Heap dump et du plugin MAT d'eclipse (Memory analysis Tool).
Cette présentation est une présentation d’Android2EE, entreprise spécialisée dans l’expertise, le consulting et la formation Android. Vous souhaitez apprendre la programmation Android, Android2EE vous accompagne au-travers ses EBooks ou ses formations.
Laissez moi vous raconter mon histoire concernant cette entreprise. En 2010, je me suis penché sur la technologie Android, j’ai écrit trois EBooks sur l’art de la programmation Android (disponible sur Android2EE). J’ai quitté ma précédente entreprise et j’ai créé l’entreprise Android2EE (Android To Enterprise Edition) dont l’objectif est la formation, l’expertise et le consulting Android. J’ai quelques contrats en tant que consultant et aussi en tant que formateur. J’ai monté un ensemble de formations Android pour les entreprises:
Formation Initiale : Devenir autonome (3j).
Formation Approfondissement (2j).
Formation Spécificité Tablette et Graphisme(2j).
Formation Applications complexes (2j).
Formation chef de projet - responsable technique (1j).
Formation Mutlimédia (2j).
Formation sur mesure (2 à 3j).
Je pratique ces formations en donnant des cours dans les universités et les écoles d’ingénieurs de Toulouse ainsi que dans de grandes conférences Java:
CESI-EXIA, EPITECH, Sup-Info, IUP ISI, InfoSup, IUP SI, IUP ISI, IngeSup, INSA
Et bien sûr: Devoxx France (LA conférence Java française de 2012), Mercredi 18 Avril 2012,
Et
JCertif Afrique 2012 (LA conférence Java du continent Africain) Septembre 2012 Conférence et Cours
Enfin, j’ai investi l’espace numérique, voici quelques uns des ces sites:
http://www.android2ee.com/
http://mathias-seguy.developpez.com/
http://blog.developpez.com/android2ee-mathias-seguy/
http://android2ee.blogspot.com/
La critique de mon livre « Android A Complete course » par developpez.com (dont je ne suis pas peu fier, quand même):
http://android.developpez.com/livres/#L9791090388000
J’ai des articles sur Developpez.com concernant Android.
Ah oui, j’oubliais, mon cv se trouve ici (si jamais) : http://mathias-seguy.developpez.com/MathiasSeguyCV201106/
Bonnes pratiques et méthodes pour le développement sur Android ; Collectées ici et là à travers différentes conférences, lectures et pratiques du développement android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
Petite conférence sur la mise en place de l'ActionBarCompat dans votre application Android avec:
Mise en place de l'ActionBarCompat
Ajout de MenuItem
Mise en place d'une ActionView de recherche
Mise en place de l'ActionMode.
ToulouseAndroidUserGroup du 5 Juin 2014
Animate me, If you don't do it for me do it for Chet :)Mathias Seguy
This is the slide of the conference gave at the DroidCon Greece 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
Applications Mobiles - Bonnes pratiques de conception et de développement de ...BEIJAFLORE
Les mobinautes ont de fortes attentes en terme de confort d’utilisation de services mobiles...
1. Choix du type de service mobile : application native, hybride, web app…
2. Conception et design d’un service mobile
3. Technologies de développements mobiles
4. Analyse d’audience : indicateurs et solutions d’Analytics
5. Leviers de monétisation et promotion des services mobiles
6. Focus sur les applications mobiles B2B
This document provides an overview of the Android operating system architecture and its key components:
1. Android is an open-source software stack that includes an operating system, middleware, and applications. It is led by Google and supported by many hardware and network companies.
2. The Android architecture consists of four layers - applications, application framework, libraries/runtime, and the Linux kernel. The Linux kernel provides core system services while the runtime handles code execution.
3. Key advantages of Android include customization ability, a wide range of applications, and innovative location and entertainment features. However, Android also has some limitations like requiring Java development and certain Bluetooth and browser restrictions.
Introduction To Mobile Application DevelopmentSyed Absar
This document provides an introduction to mobile application development. It discusses the speaker's background in mobile development. It then covers what mobile computing is, different areas it can be used like business and games. It describes how mobile applications are developed, listing different platforms, languages, and tools used. It discusses salaries for mobile jobs and how to develop for specific platforms like Android, iOS, Windows and more. It promotes cross-platform development and concludes by welcoming the reader to the field of mobile development.
Android Application Devlopment. A Guide for the Intermediate Developer. Degree Thesis in Computer Science presented at Malmo Univerity, School of Technology, Department of Computer Science June 4, 2010.
- Java is a platform independent programming language that is similar to C++ in syntax but similar to Smalltalk in its object-oriented approach. It provides features like automatic memory management, security, and multi-threading capabilities.
- Java code is compiled to bytecode that can run on any Java Virtual Machine (JVM). Only depending on the JVM allows Java code to run on any hardware or operating system with a JVM.
- Java supports object-oriented programming concepts like inheritance, polymorphism, and encapsulation. Classes can contain methods and instance variables to define objects.
The document provides an overview of Android development including:
- A history and description of Android including its architecture and core components like activities, services, and content providers.
- Steps for setting up an Android development environment in Eclipse and creating a basic "Hello World" Android app.
- Tools for running and debugging apps on emulators and devices.
- The process for testing, signing, and publishing apps on the Android Market.
- Additional Android resources for developers.
The document discusses mobile app development from a web developer's perspective. It covers topics such as web apps vs native apps, technologies for mobile development like HTML5 and frameworks, and specific techniques for mobile like viewport scaling, geolocation APIs, and offline storage. The document provides examples of code for implementing these mobile techniques.
Découvrez les pires pratiques du développement Magento autour de 13 règles à ne jamais suivre ! L'objectif est de bien les connaître pour ne pas tomber dans leurs pièges. Cette conférence a été faite lors de la MageConf 2013, le 27 novembre 2013, la première conférence en France dédiée aux développeurs Magento.
Animate Me! if you don't do it for me, do it for Chet - DroidconLondon2015Mathias Seguy
This is the slide of the conference gave at the DroidCon London 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
The 2016 Android Developer Toolbox [NANTES]Nilhcem
This document discusses various tools for Android development including build variants, debug menus, measuring performance, static code analysis, testing, and debugging. It provides details on tools like Android Studio, LeakCanary, Hugo, and Stetho for monitoring apps. It also covers setting up a mock server, using Charles Proxy and hosts editor for testing network requests, and exploring apps with APKTool, JADx, and SonarQube.
Voyage en monde Android. Trucs et astuces tout au long de la route.Mathias Seguy
Conférence donnée au Paris Android User Group du 18/06/2014
Toi, oui, toi, le développeur Android, expert ou débutant, prends ton billet, je t’emmène.
Je te propose un périple au sein du monde du développement Android. Je te parlerai de Design et d'UX, de techniques de dèv, d'asynchronicité et de sécurité, de bonnes pratiques, d'architecture, de librairies, de stratégies réseau... et de bien d'autres choses encore. De tous ces détails qui font qu'une application devient une application d'excellence.
Je te montrerai la rue des pro-tips, l'avenue des bonnes pratiques, les monts d'archis. Tu parcourras avec moi tous ces chemins qui amélioreront ton développement, ta pensée, ta conception, ton application Android.
Et quand, je te ramènerai dans ton port d'origine, les yeux qui brillent tu auras et mettre à jour ton application Android tu iras.
Simple matelot ou capitaine de navire, ne laisse pas passer ce voyage, il t'ouvrira de nouvelles voies du monde Android.
Animate Me, if you don't do it for me do it for chet (DroidCon Paris)Mathias Seguy
This is the slide of the conference gave at the DroidCon Paris 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
Android2EE training: Tutorials list of Android projectsMathias Seguy
This is the list of the projects and tutorials associated with the Android training of Android2EE.
I mean each Android2EE's trainee received a USB key that contains all those Android projects (in an Eclipse workspace) and each project can be used freely (except for training) in personal and professional projects.
Google Plus SignIn : l'Authentification GoogleMathias Seguy
Cette conférence vous expliquera en détail pourquoi mettre en place cette authentification et surtout comment la mettre en place.
Vous découvrirez ainsi:
la console des GoogleService,
comment utiliser l’objet PlusClient et ConnectionResult pour gérer l’identification de votre utilisateur,
comment mettre en place la « magic connexion » et la « manual connexion »,
comment mettre en place cette authentification au sein du cycle de vie de votre application,
comment charger le graphe social de l’utilisateur, faire des posts interactifs et des « application activities »…
Un grand moment pour tous ceux qui se demandent encore quelle est la meilleure stratégie pour authentifier son utilisateur.
Cette conférence s’associe:
d’un tutorial que vous pouvez retrouver sur GitHub: SignInWithGoogleTutorial(https://github.com/MathiasSeguy-Android2EE/SignInWithGoogleTutorial) sur GitHub.
d’une application mettant en place cette authentification que vous pouvez retrouver sur GooglePlay: MyPublicGoogleProfile (https://play.google.com/store/apps/details?id=com.android2ee.project.gplus.signin.publicid&hl=fr).
Et bien sûr la conférence va être disponible sur Android2EE dès le Vendredi 20 au rayon OpenResource\Conférences.
Vous aussi, authentifiez vos utilisateurs, inter-agissez avec eux et simplifiez leur la vie:
En espérant que vous y découvrirez votre bonheur :) .
Eclispe daytoulouse combining the power of eclipse with android_fr_1024_768_s...Mathias Seguy
Cette présentation a été donnée à l'Eclipse Day Toulouse 2012 par Android2EE - Mathias Seguy (1/2h).
L’objectif est de présenter l'utilisation du plugin Android pour eclipse, en particulier la Vue DDMS. Cette présentation se finit par la mise en place de la chasse d'une fuite mémoire dans un programme Android avec l'utilisation du Heap dump et du plugin MAT d'eclipse (Memory analysis Tool).
Cette présentation est une présentation d’Android2EE, entreprise spécialisée dans l’expertise, le consulting et la formation Android. Vous souhaitez apprendre la programmation Android, Android2EE vous accompagne au-travers ses EBooks ou ses formations.
Laissez moi vous raconter mon histoire concernant cette entreprise. En 2010, je me suis penché sur la technologie Android, j’ai écrit trois EBooks sur l’art de la programmation Android (disponible sur Android2EE). J’ai quitté ma précédente entreprise et j’ai créé l’entreprise Android2EE (Android To Enterprise Edition) dont l’objectif est la formation, l’expertise et le consulting Android. J’ai quelques contrats en tant que consultant et aussi en tant que formateur. J’ai monté un ensemble de formations Android pour les entreprises:
Formation Initiale : Devenir autonome (3j).
Formation Approfondissement (2j).
Formation Spécificité Tablette et Graphisme(2j).
Formation Applications complexes (2j).
Formation chef de projet - responsable technique (1j).
Formation Mutlimédia (2j).
Formation sur mesure (2 à 3j).
Je pratique ces formations en donnant des cours dans les universités et les écoles d’ingénieurs de Toulouse ainsi que dans de grandes conférences Java:
CESI-EXIA, EPITECH, Sup-Info, IUP ISI, InfoSup, IUP SI, IUP ISI, IngeSup, INSA
Et bien sûr: Devoxx France (LA conférence Java française de 2012), Mercredi 18 Avril 2012,
Et
JCertif Afrique 2012 (LA conférence Java du continent Africain) Septembre 2012 Conférence et Cours
Enfin, j’ai investi l’espace numérique, voici quelques uns des ces sites:
http://www.android2ee.com/
http://mathias-seguy.developpez.com/
http://blog.developpez.com/android2ee-mathias-seguy/
http://android2ee.blogspot.com/
La critique de mon livre « Android A Complete course » par developpez.com (dont je ne suis pas peu fier, quand même):
http://android.developpez.com/livres/#L9791090388000
J’ai des articles sur Developpez.com concernant Android.
Ah oui, j’oubliais, mon cv se trouve ici (si jamais) : http://mathias-seguy.developpez.com/MathiasSeguyCV201106/
Bonnes pratiques et méthodes pour le développement sur Android ; Collectées ici et là à travers différentes conférences, lectures et pratiques du développement android.
Mise en place de l'ActionBarCompat dans vos projets Android.Mathias Seguy
Petite conférence sur la mise en place de l'ActionBarCompat dans votre application Android avec:
Mise en place de l'ActionBarCompat
Ajout de MenuItem
Mise en place d'une ActionView de recherche
Mise en place de l'ActionMode.
ToulouseAndroidUserGroup du 5 Juin 2014
Animate me, If you don't do it for me do it for Chet :)Mathias Seguy
This is the slide of the conference gave at the DroidCon Greece 2015 by Mathias Seguy.
The pitch:
Animation is a key point when building your application….
But, “Animation is complicated with Android”, is your feeling.
Well, in fact, it’s not. I will show you how simples they are, how magic they could be and how fun your application can become.
I will explains which animation to use for which version of the system, what are your choices and what is your strategy. We will have a complete overview on the Android Animation framework.
So I hope to see you in the room for this conference, because at the end, your application will be enhanced :)
Applications Mobiles - Bonnes pratiques de conception et de développement de ...BEIJAFLORE
Les mobinautes ont de fortes attentes en terme de confort d’utilisation de services mobiles...
1. Choix du type de service mobile : application native, hybride, web app…
2. Conception et design d’un service mobile
3. Technologies de développements mobiles
4. Analyse d’audience : indicateurs et solutions d’Analytics
5. Leviers de monétisation et promotion des services mobiles
6. Focus sur les applications mobiles B2B
This document provides an overview of the Android operating system architecture and its key components:
1. Android is an open-source software stack that includes an operating system, middleware, and applications. It is led by Google and supported by many hardware and network companies.
2. The Android architecture consists of four layers - applications, application framework, libraries/runtime, and the Linux kernel. The Linux kernel provides core system services while the runtime handles code execution.
3. Key advantages of Android include customization ability, a wide range of applications, and innovative location and entertainment features. However, Android also has some limitations like requiring Java development and certain Bluetooth and browser restrictions.
Introduction To Mobile Application DevelopmentSyed Absar
This document provides an introduction to mobile application development. It discusses the speaker's background in mobile development. It then covers what mobile computing is, different areas it can be used like business and games. It describes how mobile applications are developed, listing different platforms, languages, and tools used. It discusses salaries for mobile jobs and how to develop for specific platforms like Android, iOS, Windows and more. It promotes cross-platform development and concludes by welcoming the reader to the field of mobile development.
Android Application Devlopment. A Guide for the Intermediate Developer. Degree Thesis in Computer Science presented at Malmo Univerity, School of Technology, Department of Computer Science June 4, 2010.
- Java is a platform independent programming language that is similar to C++ in syntax but similar to Smalltalk in its object-oriented approach. It provides features like automatic memory management, security, and multi-threading capabilities.
- Java code is compiled to bytecode that can run on any Java Virtual Machine (JVM). Only depending on the JVM allows Java code to run on any hardware or operating system with a JVM.
- Java supports object-oriented programming concepts like inheritance, polymorphism, and encapsulation. Classes can contain methods and instance variables to define objects.
The document provides an overview of Android development including:
- A history and description of Android including its architecture and core components like activities, services, and content providers.
- Steps for setting up an Android development environment in Eclipse and creating a basic "Hello World" Android app.
- Tools for running and debugging apps on emulators and devices.
- The process for testing, signing, and publishing apps on the Android Market.
- Additional Android resources for developers.
The document discusses mobile app development from a web developer's perspective. It covers topics such as web apps vs native apps, technologies for mobile development like HTML5 and frameworks, and specific techniques for mobile like viewport scaling, geolocation APIs, and offline storage. The document provides examples of code for implementing these mobile techniques.
Découvrez les pires pratiques du développement Magento autour de 13 règles à ne jamais suivre ! L'objectif est de bien les connaître pour ne pas tomber dans leurs pièges. Cette conférence a été faite lors de la MageConf 2013, le 27 novembre 2013, la première conférence en France dédiée aux développeurs Magento.
Cocoaheads Rennes #3 : Bien coder sur iOSCocoaHeadsRNS
Slides de la présentation "Bien coder sur iOS" de la session des CocoaHeads Rennais du 08 septembre 2011. Présentation assurée par Julien Quéré, co-organisateur.
Concevoir une expérience SoLoMo (sociale, locale, mobile): retours d'expérien...Microsoft
Qu'est-ce qui fait aujourd'hui le succès d'une application mobile? La réponse en 3 syllabes: So_Lo_Mo: comme "Sociale, Locale, Mobile". Ces concepts peuvent paraitre évidents (il s'agit des fondamentaux de l'usage d'un smartphone) mais force est de constater que peu de développeurs ont une vraie réflexion sur "pourquoi" ils ont conçu leur application sur smartphone plutôt qu'ailleurs.... Cette session sera constituée de plusieurs retours d'expériences sur des applications dont la qualité de l'approche SoLoMo peut servir de référence: FoodReporter (100000 utilisateurs du service) et les spécificités de sa version 7.5, présentée par ses concepteurs par exemple, ou encore l'application Let's Walk, (SoLoMo par essence, il s'agit d'une application de partage de randonnées). il sera question des spécificités techniques qui font de Windows Phone une plateforme sur laquelle il est facile de concevoir rapidement une expérience SoLoMo, notamment grâce à de nombreuses démonstrations de code directement réutilisable: - Gestion de la géolocalisation - Moyens d'intégration des réseaux sociaux (authentification, partage, social graph...) - Intégration de l'application dans les expériences camera, photos, et recherche du téléphone - Live Tiles, background agent, notifications, les différents moyens de faire vivre l'application quand elle n'est pas à l'écran et bien d'autres choses encore!
Si vous souhaitez au contraire en savoir plus sur la manière de gérer efficacement la performance de vos applications, rendez-vous sur :
- le site complet IBM Service Engage : https://ibm.biz/BdHEGb
- le site Gestion des performances des applications : https://ibm.biz/BdHEGK
Testez la solution IBM APM en SaaS : https://ibm.biz/BdHEGb
Pourquoi, quand vous demandez à mettre en production une application java containérisée avec docker, vos ops font soudain la grimace ? Pourquoi vos containers, qui marchaient si bien sur votre PC, crashent si souvent en production ; et aussi pourquoi la RAM des noeuds se met-elle à swaper autant ?
Ces problèmes nous les avons rencontrés et nous vous proposons de partager ensemble nos découvertes et nos réflexions sur l'utilisation combinée de java et de docker.
Ensemble creusons la RAM, le CPU et les différentes options de gestion de mémoire de la JVM pour obtenir le bon fonctionnement de notre application dans un containeur.
Chaque année, une partie de l'équipe SpikeeLabs se retrouve au Dev Fest de Nantes ! C'est LA rencontre des ingénieurs immanquable 😀
Et comme chaque année, l'ensemble des équipe a un petit debrief !
.NET Microframework: du code, de l’électronique, de la robotiqueMicrosoft
Envie de se faire plaisir le soir ? Envie de faire vibrer des canards ? Envie de développer quelque chose de WAF et super Geek ? Alors, cette session est pour toi :-) .NET Microframework est une technologie open source permettant de réaliser des robots, des modules intelligents, le tout sans aucun OS. Cette session montra par des exemples concerts comment réaliser des automates et les piloter à travers des interfaces web. Exemple concret avec un arrosage automatique entièrement pilotable depuis l'autre bout du monde.
Crash Test Your Idea Meetup Valtech 13/09/2016André De Sousa
Généralement, lorsque l'on lance un nouveau produit avec en tête de créer une startup, la plupart du temps, on reste la tête baissée dans sa "cave" sans regarder le marché, ni ses clients.
Etes-vous sûr que vous êtes en train de créer le bon produit ?
Durant cette journée de passage à l'acte, notre objectif est de démontrer comment expérimenter, voir même d'aller jusqu'à produire un MVP Lean Startup fonctionnel en quelques heures avec des ressources que je présente et que j'encourage à utiliser.
La journée va se partager en 2 parties distinctes: Une partie théorique ou je présente les outils pour expérimenter et valider très vite son idée. Une seconde partie mise en pratique durant laquelle vous passez à la réalisation de votre Prétotype ou MVP et pendant laquelle je serais à votre disposition pour vous aider.
A l'issue de cette journée vous serez en mesure d'aller confronter votre idée à la réalité du marché et ainsi valider qu'il existe ou non un problème qui vaut la peine d'être résolu.
Vous ne manquez pas de tutoriels pour écrire un "Hello, world" avec n'importe quel framework. Mais que se passe-t-il quand, sur cette base, vous faites travailler une équipe de 4 développeurs pendant 6 mois ? Petit retour d'expérience sur l'architecture logicielle d'une application Symfony2 de taille moyenne, avec des visualisations inédites et des indices pour répondre à cette éternelle question : mais où je le mets ce code ?
Présentation effectuée au PHP Tour Lyon 2014
Présentation sur l'open hardware à la conférence Toulibre de novembre 2012. Aperçu des différentes formes d'open hardware, de l'écosystème, des licences et des impacts de cette (r)évolution
Video sur http://vimeo.com/55273355
Tirer parti des périphériques mobiles dans une application web : qui a dit qu...Christophe Porteneuve
Le web mobile est en train d’exploser, d’autant que les principaux périphériques proposent désormais de « vrais » navigateurs, de l’iPhone à Androïd, de Mimo à PalmOS, et même les nouveaux Blackberry.
S’il est déjà bien d’exploiter des feuilles de style mobiles pour adapter l’expérience utilisateur, on souhaite souvent accéder aux capacités du périphérique (géolocalisation, vibreur, accéléromètre…) et offrir une expérience globale aussi « native » que possible.
Il n’est pas pour autant nécessaire de développer des versions natives distinctes ! Des frameworks existent pour un déploiement universel, et cerise sur le gâteau : ça se passe en JavaScript !
Cet atelier vous fera faire un tour d’horizon des principaux frameworks actifs, exemples et démonstrations à l’appui.
Similar to Architecture et Bonnes pratiques Android #DevoxxFr2016 Part1 (20)
2. Android2EE est référencé en tant qu’organisme de formation, vous pouvez faire prendre en charge tout ou partie
du montant de cette formation par votre OPCA. Cette formation Initiation avancée à Android est éligible au titre
du DIF et CIF.
Lieu : Paris, Toulouse, Lyon
Durée : 5 jours
Prix : 2980 €
2
3. Lieu : Paris
Date : 10 - 13 Mai 2016
Durée : 4 jours
3
Lieu : Lyon
Date : 23 - 27 Mai 2016
Durée : 5 jours
Lieu : Paris
Date : 06 - 10 Juin 2016
Durée : 5 jours
5. Le contexte est tout
Papa, on peut atteindre Mach1 ?
La réponse dépend
du contexte !
DataCenter Desktop Tablette Smartphone
You're here
Light1, facile. Mach1, facile. Euh,... Qui me parle ?
Allégorie de la
puissance
6. Le contexte est tout
Papa, tu me sers à boire de l'eau, s'il te plait ?
Water
water.drink()
giveWater()
water.drink()
null
Le contexteLe contexte
NPE
9. La mémoire c'est la vie !
La mémoire
L'eau c'est la vie !
Pas sur Android
10. La mémoire c'est la vie !
La mémoire
Mais
Vous développez avec les
meilleurs devices de la planète !!!
Performance
Base de
données locale
et fichiers
Persistance
multi-processus
11. La mémoire dans la vrai vie de
vos utilisateurs !
La mémoire
HelloWorld.apk
== 1 Mo
faibles perfs pas d'espace
Appareil Standard :
8Go (4GO courant)
19. L'énergie
Les causes du gaspillage énergétique
CPU/GPU
Connexion (Http,...)
Drawable/Animations...
Mauvaises pratiques
de code
Services sans fin
20. L'énergie
Les causes du gaspillage énergétique
Mauvaises pratiques
de code
Putain de javaïstes
(Android c'est pas du Java sur des serveurs clusterisés !!!)
22. Le contexte mutualiste sous Android
La vie en collectivité
gmail
twitter
hangout
evernote
messsager
facebook
gmap
linkedIn
runstatic
your app
chrome
23. C'est le vivre tous ensemble qui est compliqué
(pensez, aussi, aux sanitaires du camping municipal de cet été)
La tragédie des biens
communs
31. Ne mettez pas à jour trop souvent, vous n'êtes pas seul !
Don't oversync.
Réseau
32. Dans un monde complexe
Synthèse
Mémoire Puissance Energie
et de responsabilité collectiveUn contexte de pénuries
60fps
UI Thread
intouchable
GC sans espace énergivore
38. Et quand il le fait, c'est facile, simple et bluffant.
C'est facile et c'est
fluide
39. Et grâce à vous, il possède des capacités qu'il n'avait pas.
ça me donne des super
pouvoirs!
40. Ne frustrer pas votre utilisateur, laissez le libre.
Sans authentification,
ni paiement.
41. Je veux faire un truc,
je peux le faire,
et quand je le fais,
ça marche !
Je sais ce que je fais.
C'est facile et c'est fluide.
Ca me donne des super
pouvoirs,
sans authentification,
ni paiement.
Le plaisir!
Combler un besoin utilisateur
avec efficacité.
L'utilisateur doit toujours savoir
ce qu'il fait, où il est.
Et quand il le fait, c'est facile,
simple et bluffant.
Et grâce à vous, il possède des
capacités qu'il n'avait pas.
Ne frustrer pas votre utilisateur,
laissez le libre.
Utilisateur Développeur
63. A la batterie
(à ce qu'il en reste surtout).
Adaptation
<receiver android:name=".BatteryLevelReceiver">
<intent-filter>
<action android:name="android.intent.action.ACTION_BATTERY_LOW"/>
<action android:name="android.intent.action.ACTION_BATTERY_OKAY"/>
</intent-filter>
</receiver>
68. 74
Pour réaliser mon objectif utilisateur
Pour assumer mes responsabilités de développeur
Pour m'adapter aux contraintes du système
Pourquoi des bonnes pratiques ?
71. N'allouez pas d'objets.
Mémoire
N'allouez pas d'objets
dans les boucles et les
méthodes appelées
souvent (onDraw).
Mettez les objets en
cache (pour éviter de
les réallouer)
Utiliser des pools
d'objets au besoin
Utiliser des variables
de classes temporaires
(plutôt que des
variables de
méthodes)
Utiliser
ArrayMap/SimpleArray
Map/SparseArray au
lieux de HashMap
Définissez la taille de
vos ArrayList
72. N'allouez pas d'objets.
Mémoire
Pas d'itérateurs, il faut
for(int i=0;
i<malist.size();
i++)
Oubliez que les enums
existent
Que des librairies
spécifiquement écrites
pour Android
public static Objet obj;
peut générer des fuites
mémoires
Instanciez les objets à
la demande
LazyLoading
Préférez les
paramètres IO à vos
méthodes que la
création d'un objet
81. Les opérations UI Thread coûteuses.
UI Performance
Mesurer et Disposer.
Measure and Layout
Inflation. Initialisation de l'objet
Application.
82. Les opérations UI Thread coûteuses.
UI Performance
Mesurer et Disposer. Inflation. Initialisation de l'objet
Application.
Complexité de la
hiérarchie des vues.
RelativeLayout.
83. Pas d'animation durant les opérations coûteuses.
UI Performance
Les CustomViews permettent de simplifier le measure et layout.
Démarrage Rapide : Utilisez la Starting Window avec le bon thème.
Le ViewStub est ton ami.
Le LinearLayout est ton meilleur ami.
Choisissez bien vos Layouts en fonction de votre besoin.
Simplifiez vos IHM, aplatissez vos layouts.
87. Redirigez vos layouts
Gravez dans le marbre le nombre de fragments affichés
93
•reslayout
activity_a_two_panes_layout.xml (le vrai layout)
activity_a_one_panes_layout.xml (le vrai layout)
Dans ActivityA
setContentView(R.layout.main_activity)
• resvalues
layout_redirection.xml
<resources>
<item name="main_activity" type="layout">@layout/activity_one_panes</item>
<bool name="twoPane">false</bool>
</resources>
•resvalues-land || resvalues-large || reslayout-xlarge
layout_redirection.xml
<resources>
<item name="main_activity" type="layout">@layout/activity_two_panes</item>
<bool name="twoPane">true</bool>
</resources>
getRessource().getBoolean(R.bool.twoPane)
UI Pro Tips
88. Attention à l'overDraw.
UI Pro Tips
Utiliser la Starting Windows thèmée (vous pouvez mettre une image).
Utiliser le Context approprié.
Les vues ne doivent pas être connues des threads (autre que l'UI).
89. Ajoutez votre connectivité (Wifi,..,edge) à vos requêtes
Ajoutez la version des données à vos urls
/myservlet_v1.2
MyOnlyObject in Json+GZip
Ajoutez un TimeStamp à vos données dans vos bases de données (local & global)
Requêtez vos données en vous appuyant sur les timestamp
Utilisez json + gzip (ou mieux: des dataBuffer)
C'est le serveur qui effectue le Prefetch des données (basé sur votre connectivité)
TimeStamp
TimeStamp
/myservlet_v1.2?timespan=11215982/myservlet_v1.2?timespan=11215982&net=wifi
Utilisez la Big Cookies stratégie.
Réseau
91. Tu n'es pas un Javaïste
Parcelable c'est
super.... pour les
intents. Pas de
stockage disque !!!
Utilisez les structures
Android :
SparseArray,
ArrayMap,...
Oubliez que la
sérialisation existe.
Utilisez les
SharedPref
Préférez les types
primitifs et attention à
l'auto-boxing
92. Persistance
Jamais de chemin en
dur, jamais,
seulement du relatif.
N'utilisez pas SQLite
pour de la
persistance simple
Une base de
données peut
posséder plusieurs
Tables...
93. Objectif
Interne Fichiers privés, protégés, propres à l'application.
Détruits lors de la désinstallation.
Cache Fichiers temporaires propres à l'application.
Détruits lors de la désinstallation.
External Fichiers privés et publics, non-protégés, propres à l'application.
Détruits lors de la désinstallation.
Public
External
Fichiers publics, non-protégés.
Non détruits lors de la désinstallation.
Persistance
Pour les fichiers : Connaître
son objectif.
94. Méthode pour récupérer le dossier racine
Interne File getFilesDir()
Cache File getCacheDir()
External File getExternalStorage(String type);
Public
External
File getExternalStoragePublicDirectory(String type);
Persistance
Utilisez les classes File, FileInputStream et FileOutputStream.
ou BufferSink et BufferSource...
Quand on Connaît son objectif, tout devient facile.
95. Persistance
Vérifiez la présence
du fichier avant
d'écrire ou de lire...
//Then read your file
File filePicture = new File(subFolder, fileNameStr);
if(filePicture.exist()){
//Then open an InputStream on it your file
FileInputStream fis = new FileInputStream(filePicture);
96. Persistance
Vérifiez l'état de
l'ExternalDirectory
avant d'éssayer de
lire/écrire.
String externalStorageState = Environment.getExternalStorageState();
if (Environment.MEDIA_MOUNTED.equals(externalStorageState)) {
// We can read and write the media}
else if
(Environment.MEDIA_MOUNTED_READ_ONLY.equals(externalStorageState)) {
// We can only read the media}
98. Exception
Gérer vos exceptions !
Exception
ManagedException
isManaged
UserId
Error message
Technical data
Functional data
Others stuff
99. Exception
Gérer vos exceptions !
Exception Manager
ExceptionManager
.manage(...)
Team FeedBackUser FeedBack
SomeWhere in your code galaxy
100. Thread
Centralisez leur
gestion.
La gestion des
Threads est cruciale.
Faîtes attention aux
fuites mémoires.
Utilisez un
ServiceExecutor
Utilisez
PLUSIEURS
ServiceExecutor
MyApplication
ServiceExecutor
101. /** * The ThreadPool Executor for caching background */
ExecutorService executor = Executors.newFixedThreadPool(6, null);
/** * Launch a Runnable*/
public synchronized void cacheBackGround() {
executor.submit(mCacheBackgroundRunnnable);
}
Thread
ExecutorService
utilise un
ThreadPoolExecutor
102. if (executor != null) {
executor.shutdown(); // Disable new tasks from being submitted
try {//as long as your threads hasn't finished
while (!executor.isTerminated()) {
// Wait a while for existing tasks to terminate
if (!executor.awaitTermination(60, TimeUnit.SECONDS)) {
// Cancel currently executing tasks
executor.shutdownNow();
Log.e("MyApp","Probably a memory leak here");
}
}
} catch (InterruptedException ie) {
// (Re-)Cancel if current thread also interrupted
executor.shutdownNow();
// Preserve interrupt status
Thread.currentThread().interrupt();
Log.e("MyApp","Probably a memory leak here too");
}}}
Thread
N'oubliez pas de les
détruire
104. Memory Leak
Fuite mémoire
courante :
Un Thread
pointant vers
l'IHM
Thread I.H.M Thread de traitement
Activity Handler
sendMessage()
message
Thread I.H.M
Thread de traitement
Activity
sendMessage()
message
Handler
OnDestroy()
OnCreate()
Thread de traitement initiale
sendMessage()
Activity
fantôme
Handler
fantôme
Utilisez WeakReference
105. Fuite mémoire
courante :
Un Thread
pointant vers
l'IHM
Accorder le cycle de vie de la thread
avec celui de l'activité
Thread I.H.M Thread de traitement
Activity Handler
sendMessage()
Thread I.H.M Thread de traitement
Activity
sendMessage()
message
message
OnDestroy()
OnCreate()
Handler
Memory Leak
106. Fuite mémoire
courante :
Un Thread
pointant vers
l'IHM
Conserver la Thread
Thread I.H.M Thread de traitement
Activity Handler
sendMessage()
Thread I.H.M
Activity
message
message
Thread de traitement
Handler
sendMessage()
OnDestroy()
OnCreate()
!!!Attention ne pas utiliser en l’état !!!
!!! Fuite mémoire !!!
Memory Leak
107. Fuite mémoire
courante :
Non static inner
class
Utilisez les static inner class
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
exampleOne();
}
private void exampleOne() {
new Thread() {
public void run() {
while (true) {SystemClock.sleep(1000); }
}}.start();
}}
Non Static Inner Class
public class MainActivity extends Activity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MyThread().start();
}
private static class MyThread extends Thread {
public void run() {
while (true) {SystemClock.sleep(1000);}
}}
}
Memory Leak
108. Fuite mémoire
courante :
private static
avec une
référence
implicite vers la
classe
englobante
Ne pas le faire
public class MainActivity extends Activity {
private static Drawable sBackground;
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
if (sBackground == null) {
sBackground = getDrawable(R.drawable.largebitmap);
}
label.setBackgroundDrawable(sBackground);
setContentView(label);
}}
Mem Leak
Memory Leak
109. public class Cst {
public static int MaConstante=1;
}
public class DamnedService extends Service {
private void somewhere(int val){
if(val==Cst.MaConstante){...}
}
}
Fuite mémoire
courante :
public static
dans un objet
lourd
Extraire les constantes dans une
classe dédiée
Mem Leak
Memory Leak
public class MainActivity extends Activity {
public static int MaConstante=1;
}
public class DamnedService extends Service {
private void somewhere(int val){
if(val==MainActivity.MaConstante){...}
}
}
110. Architecture
Activity est l'entrée
principale de votre
application.
Don't fuck around
with the system !
Un Service permet
de dire au système
"Je fais une longue
opération, considère
moi comme une
Activité visible sans
IHM."
BroadcastReceiver
indique au système
qu'il est intéressé
pour recevoir telle ou
telle information.
114. Un peu d'histoire
public class HistoryBattleActivity extends AppCompatActivity {
private static final String TAG = "HistoryBattleActivity";
private static final int CONTEXT_CURRENT=110274;
private static final int CONTEXT_HISTORY=131274;
/***********************************************************
* Attributes
**********************************************************/
BattleFragment battleFragment;
/**
* Current context History/current
*/
int currentContext=CONTEXT_CURRENT;
/***********************************************************
* Managing RoundTrip animation (VectorDrawable1 to VectorDrawable 2 and back again
**********************************************************
/**
* The LevelList that contains only two AnimatedVectorDrawable,
* the ones used to go from on to the other
*/
LevelListDrawable backupRoundTrip;
/**
* The current AnimatedVector diaplsyed by the RoundTrip
*/
AnimatedVectorDrawable contextDrawable;
/**
* To know is the animation have been already launched
*/
boolean backupRoundTripFirstLaunched=true;
/**
* Historical battles
*/
ArrayList<Long> battlesId=null;
/***********************************************************
* Attributes for the ViewPager
**********************************************************/
/**
* The TabLayout itself :)
*/
TabLayout tabLayout;
/**
* The page Adapter : Manage the list of views (in fact here, it's fragments)
* And send them to the ViewPager
*/
private MyPagerAdapter pagerAdapter;
/**
* The ViewPager is a ViewGroup that manage the swipe from left to right to left
* Like a listView with a gesture listener...
*/
private ViewPager viewPager;
/***********************************************************
* Managing the Life cycle
**********************************************************/
**********************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate() called");
setContentView(R.layout.activity_history);
//find the Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//use it as your action bar
setSupportActionBar(toolbar);
getSupportActionBar().setSubtitle(getString(R.string.history_fragment_subtitle));
getSupportActionBar().setTitle(getString(R.string.history_fragment_title));
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
//Define its gravity and its mode
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//Define the color to use (depending on the state a different color should be disaplyed)
//Works only if done before adding tabs
tabLayout.setTabTextColors(getResources().getColorStateList(R.color.tab_selector_color));
//instanciate the PageAdapter
pagerAdapter=new MyPagerAdapter(this,true);
//Find the viewPager
viewPager = (ViewPager) super.findViewById(R.id.viewpager);
// Affectation de l'adapter au ViewPager
viewPager.setAdapter(pagerAdapter);
viewPager.setClipToPadding(true);
//Add animation when the page are swiped
//this instanciation only works with honeyComb and more
//if you want it all version use AnimatorProxy of the nineoldAndroid lib
//@see:http://stackoverflow.com/questions/15767729/backwards-compatible-pagetransformer
//TODO uncomment those lines and the opengl bug disappears
// if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
// viewPager.setPageTransformer(true, new MyPageTransformer());
// }
//AND CLUE TABLAYOUT AND VIEWPAGER
tabLayout.setupWithViewPager(viewPager);
}
@Override
protected void onStart() {
super.onStart();
//track entrance
Log.e(TAG, "onStart() has been called");
EventBus.getDefault().register(this);
}
@Override
protected void onResume() {
super.onResume();
//track entrance
Log.e(TAG, "onResume() has been called");
}
} @Override
protected void onStop() {
super.onStop();
//track entrance
Log.e(TAG, "onStop() has been called");
EventBus.getDefault().unregister(this);
}
@Override
public void onBackPressed() {
if(((MyApplication)getApplication()).isCigaretPanelOpen){
//do nothing the fragment will just change its state
battleFragment.onBack();
}else{
super.onBackPressed();
}
}
@Subscribe(threadMode = ThreadMode.MAIN)//EventBus
public void updateUI(FullUpdateEvent event) {
//TODO update properly
Log.e(TAG, "fullUpdate() called with: " + "notUsed = [" + event + "]");
//rebuild every thing:$
pagerAdapter.notifyRebuildAll();
if(event.isSwitchActivity()){
switchContext();
}else{
tabLayout.setupWithViewPager(viewPager);
}
}
/***********************************************************
* Managing menu
**********************************************************/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.history_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_switch_context:
switchContext();
break;
}
return super.onOptionsItemSelected(item);
}
/***********************************************************
* Managing backup button round trip
**********************************************************/
/**
* Switch context from history to current (and vis versa)
* Launch the animation on the currentAnimatedVectorDrawable
*/
private void switchContext(){
Intent startNewContext=new Intent(this, CurrentBattleActivity.class);
startNewContext.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startNewContext);
}
}
Au début, il y avait la classe dieu (God Class)
On a une petite évol ! On va tester l'évol...
Bref, on avait fait de la m***e
115. Un peu d'histoire
public class HistoryBattleActivity extends AppCompatActivity {
private static final String TAG = "HistoryBattleActivity";
private static final int CONTEXT_CURRENT=110274;
private static final int CONTEXT_HISTORY=131274;
/***********************************************************
* Attributes
**********************************************************/
BattleFragment battleFragment;
/**
* Current context History/current
*/
int currentContext=CONTEXT_CURRENT;
/***********************************************************
* Managing RoundTrip animation (VectorDrawable1 to VectorDrawable 2 and back again
**********************************************************
/**
* The LevelList that contains only two AnimatedVectorDrawable,
* the ones used to go from on to the other
*/
LevelListDrawable backupRoundTrip;
/**
* The current AnimatedVector diaplsyed by the RoundTrip
*/
AnimatedVectorDrawable contextDrawable;
/**
* To know is the animation have been already launched
*/
boolean backupRoundTripFirstLaunched=true;
/**
* Historical battles
*/
ArrayList<Long> battlesId=null;
/***********************************************************
* Attributes for the ViewPager
**********************************************************/
/**
* The TabLayout itself :)
*/
TabLayout tabLayout;
/**
* The page Adapter : Manage the list of views (in fact here, it's fragments)
* And send them to the ViewPager
*/
private MyPagerAdapter pagerAdapter;
/**
* The ViewPager is a ViewGroup that manage the swipe from left to right to left
* Like a listView with a gesture listener...
*/
private ViewPager viewPager;
/***********************************************************
* Managing the Life cycle
**********************************************************/
**********************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate() called");
setContentView(R.layout.activity_history);
//find the Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//use it as your action bar
setSupportActionBar(toolbar);
getSupportActionBar().setSubtitle(getString(R.string.history_fragment_subtitle));
getSupportActionBar().setTitle(getString(R.string.history_fragment_title));
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
//Define its gravity and its mode
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//Define the color to use (depending on the state a different color should be disaplyed)
//Works only if done before adding tabs
tabLayout.setTabTextColors(getResources().getColorStateList(R.color.tab_selector_color));
//instanciate the PageAdapter
pagerAdapter=new MyPagerAdapter(this,true);
//Find the viewPager
viewPager = (ViewPager) super.findViewById(R.id.viewpager);
// Affectation de l'adapter au ViewPager
viewPager.setAdapter(pagerAdapter);
viewPager.setClipToPadding(true);
//Add animation when the page are swiped
//this instanciation only works with honeyComb and more
//if you want it all version use AnimatorProxy of the nineoldAndroid lib
//@see:http://stackoverflow.com/questions/15767729/backwards-compatible-pagetransformer
//TODO uncomment those lines and the opengl bug disappears
// if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
// viewPager.setPageTransformer(true, new MyPageTransformer());
// }
//AND CLUE TABLAYOUT AND VIEWPAGER
tabLayout.setupWithViewPager(viewPager);
}
@Override
protected void onStart() {
super.onStart();
//track entrance
Log.e(TAG, "onStart() has been called");
EventBus.getDefault().register(this);
}
@Override
protected void onResume() {
super.onResume();
//track entrance
Log.e(TAG, "onResume() has been called");
}
} @Override
protected void onStop() {
super.onStop();
//track entrance
Log.e(TAG, "onStop() has been called");
EventBus.getDefault().unregister(this);
}
@Override
public void onBackPressed() {
if(((MyApplication)getApplication()).isCigaretPanelOpen){
//do nothing the fragment will just change its state
battleFragment.onBack();
}else{
super.onBackPressed();
}
}
@Subscribe(threadMode = ThreadMode.MAIN)//EventBus
public void updateUI(FullUpdateEvent event) {
//TODO update properly
Log.e(TAG, "fullUpdate() called with: " + "notUsed = [" + event + "]");
//rebuild every thing:$
pagerAdapter.notifyRebuildAll();
if(event.isSwitchActivity()){
switchContext();
}else{
tabLayout.setupWithViewPager(viewPager);
}
}
/***********************************************************
* Managing menu
**********************************************************/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.history_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_switch_context:
switchContext();
break;
}
return super.onOptionsItemSelected(item);
}
/***********************************************************
* Managing backup button round trip
**********************************************************/
/**
* Switch context from history to current (and vis versa)
* Launch the animation on the currentAnimatedVectorDrawable
*/
private void switchContext(){
Intent startNewContext=new Intent(this, CurrentBattleActivity.class);
startNewContext.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startNewContext);
}
}
On va découpler la vue du reste de l'application
116. Un peu d'histoire
public class HistoryBattleActivity extends AppCompatActivity {
private static final String TAG = "HistoryBattleActivity";
private static final int CONTEXT_CURRENT=110274;
private static final int CONTEXT_HISTORY=131274;
/***********************************************************
* Attributes
**********************************************************/
BattleFragment battleFragment;
/**
* Current context History/current
*/
int currentContext=CONTEXT_CURRENT;
/***********************************************************
* Managing RoundTrip animation (VectorDrawable1 to VectorDrawable 2 and back again
**********************************************************
/**
* The LevelList that contains only two AnimatedVectorDrawable,
* the ones used to go from on to the other
*/
LevelListDrawable backupRoundTrip;
/**
* The current AnimatedVector diaplsyed by the RoundTrip
*/
AnimatedVectorDrawable contextDrawable;
/**
* To know is the animation have been already launched
*/
boolean backupRoundTripFirstLaunched=true;
/**
* Historical battles
*/
ArrayList<Long> battlesId=null;
/***********************************************************
* Attributes for the ViewPager
**********************************************************/
/**
* The TabLayout itself :)
*/
TabLayout tabLayout;
/**
* The page Adapter : Manage the list of views (in fact here, it's fragments)
* And send them to the ViewPager
*/
private MyPagerAdapter pagerAdapter;
/**
* The ViewPager is a ViewGroup that manage the swipe from left to right to left
* Like a listView with a gesture listener...
*/
private ViewPager viewPager;
/***********************************************************
* Managing the Life cycle
**********************************************************/
**********************************************************/
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e(TAG, "onCreate() called");
setContentView(R.layout.activity_history);
//find the Toolbar
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
//use it as your action bar
setSupportActionBar(toolbar);
getSupportActionBar().setSubtitle(getString(R.string.history_fragment_subtitle));
getSupportActionBar().setTitle(getString(R.string.history_fragment_title));
tabLayout = (TabLayout) findViewById(R.id.tabLayout);
//Define its gravity and its mode
tabLayout.setTabGravity(TabLayout.GRAVITY_FILL);
tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
//Define the color to use (depending on the state a different color should be disaplyed)
//Works only if done before adding tabs
tabLayout.setTabTextColors(getResources().getColorStateList(R.color.tab_selector_color));
//instanciate the PageAdapter
pagerAdapter=new MyPagerAdapter(this,true);
//Find the viewPager
viewPager = (ViewPager) super.findViewById(R.id.viewpager);
// Affectation de l'adapter au ViewPager
viewPager.setAdapter(pagerAdapter);
viewPager.setClipToPadding(true);
//Add animation when the page are swiped
//this instanciation only works with honeyComb and more
//if you want it all version use AnimatorProxy of the nineoldAndroid lib
//@see:http://stackoverflow.com/questions/15767729/backwards-compatible-pagetransformer
//TODO uncomment those lines and the opengl bug disappears
// if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
// viewPager.setPageTransformer(true, new MyPageTransformer());
// }
//AND CLUE TABLAYOUT AND VIEWPAGER
tabLayout.setupWithViewPager(viewPager);
}
@Override
protected void onStart() {
super.onStart();
//track entrance
Log.e(TAG, "onStart() has been called");
EventBus.getDefault().register(this);
}
@Override
protected void onResume() {
super.onResume();
//track entrance
Log.e(TAG, "onResume() has been called");
}
} @Override
protected void onStop() {
super.onStop();
//track entrance
Log.e(TAG, "onStop() has been called");
EventBus.getDefault().unregister(this);
}
@Override
public void onBackPressed() {
if(((MyApplication)getApplication()).isCigaretPanelOpen){
//do nothing the fragment will just change its state
battleFragment.onBack();
}else{
super.onBackPressed();
}
}
@Subscribe(threadMode = ThreadMode.MAIN)//EventBus
public void updateUI(FullUpdateEvent event) {
//TODO update properly
Log.e(TAG, "fullUpdate() called with: " + "notUsed = [" + event + "]");
//rebuild every thing:$
pagerAdapter.notifyRebuildAll();
if(event.isSwitchActivity()){
switchContext();
}else{
tabLayout.setupWithViewPager(viewPager);
}
}
/***********************************************************
* Managing menu
**********************************************************/
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater=getMenuInflater();
inflater.inflate(R.menu.history_menu, menu);
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()){
case R.id.menu_switch_context:
switchContext();
break;
}
return super.onOptionsItemSelected(item);
}
/***********************************************************
* Managing backup button round trip
**********************************************************/
/**
* Switch context from history to current (and vis versa)
* Launch the animation on the currentAnimatedVectorDrawable
*/
private void switchContext(){
Intent startNewContext=new Intent(this, CurrentBattleActivity.class);
startNewContext.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(startNewContext);
}
}
On va découpler la vue du reste de l'application
Model
Vue Controlleur
Modifie
Préviens
Mets à jour
Pour fêter ça, on a dansé la danse de la victoire
Le modèle MVC était né!
117. Un peu d'histoire
puis vint le modèle M(VC) swing
Model
Vue&Controller
ModifieMets à jour
Vue Controlleur
119. Un peu d'histoire
le modèle M(VC) swing
Gère
les données
affichées
Model
Affiche les données
interagit avec l'utilisateur
Vue&Controller
1
1
120. Un peu d'histoire
Apparition du MVP
Gère
les données affichées
Model
Affiche les données
interagit avec l'utilisateur
Vue&Controller
Presenter
La logique Business
Et les données
Model
View
121. Un peu d'histoire
Apparition du MVP
Gère
les données affichées
Presenter
Affiche les données
interagit avec l'utilisateur
View
La logique Business
Et les données
Model
1
1
ModifieMets à jour
Dialogue
122. Un peu d'histoire
Apparition de la programmation par contrat
(Interfaces)
Gère
les données affichées
Presenter
Affiche les données
interagit avec l'utilisateur
View
La logique Business
Et les données
Model
1
0
PresenterIntf
ViewIntf
0
1
123. Un peu d'histoire
Pour les tests !!!
Model
Presenter
View
PresenterIntf
ViewIntf
MockPresenter
MockView
124. Saveur=TestPresenter
Un peu d'histoire
Avec Gradle, c'est le bonheur des tests.
Saveur=TestVueSaveur=PROD
Model
Presenter
View
0
1
MockPresenter
MockViewView
Presenter
0
1
0
1
MockModel
125. Un peu d'histoire
Apparition du MVVM
Gère
les données affichées
Presenter
Affiche les données
interagit avec l'utilisateur
View
La logique Business
Et les données
Model
1
1
ModifieMets à jour
Dialogue
ViewModel
1
n
127. Architecture
But wait ! Première remarque.
MVC MVP MVVM FLUX
On s'en fout !!! C'est pas ça l'important !!!
C'est pareil à trois poils de *** prêt !
149. Modèle n-tier
Architecture de la vraie vie
Service
Vues
COM
DAO
Transverse
Use case
1
Use case
2
Use case
3
On commence
par un use case
et après on
réutilise dès
qu'on peut
152. Vues
164
Rangez votre package view !
Un sous package par fragment
Un sous package par composant
graphique complexe de l'activité
Au root du package, l'activité et son
presenter
Un package par vue
153. Limiter les dépendances
165
Couche IHM
HumanViewParentIntf HumanPresParentIntf
FamilyView FamilyPresenter
1 1
HumanView HumanPresenter
1 1
use use
Vues
Vue contenue et réutilisable
Utilisez des interfaces
Couche IHM
HumanViewParentIntf HumanPresParentIntf
FamilyActivity FamilyPresenter
1 1
HumanFragment HumanPresenter
1 1
use use
155. MVP + N-Tier
mettre en place le principe de
séparation des
responsabilités
Etre testable unitairement
simplement
permettre de s'adapter aux
changements du framework
Synthèse
Sans impact, bref d'être indépendant de l'implémentation et de
pouvoir la modifier et la tester
permettre de faire évoluer les
UI, la BD,...
permettre de changer de
librairies
Le contexte = pénurie et vie en collectivité d'enfants
5 minutes
bref chet haase stuff
Une question simple
Une réponse complexe qui dépend du contexte
Une question simple
Une réponse complexe qui dépend du contexte
Il ne faut jamais ignoré le contexte et celui ci peut être multiple (a plusieurs niveaux)
Memory c'est les perfs: plus on alloue, plus on désalloue, plus on fait marcher le GC & plus on stress le CPU
Memory: c'est aussi plus tu en prends moins tu en laisse aux autres
Memory: les images
=> entraine des bonnes pratiques de rédaction de code spécifique à Android
Memory c'est les perfs: plus on alloue, plus on désalloue, plus on fait marcher le GC & plus on stress le CPU
Memory: c'est aussi plus tu en prends moins tu en laisse aux autres
Memory: les images
=> entraine des bonnes pratiques de rédaction de code spécifique à Android
Memory c'est les perfs: plus on alloue, plus on désalloue, plus on fait marcher le GC & plus on stress le CPU
Memory: c'est aussi plus tu en prends moins tu en laisse aux autres
Memory: les images
=> entraine des bonnes pratiques de rédaction de code spécifique à Android
Memory c'est les perfs: plus on alloue, plus on désalloue, plus on fait marcher le GC & plus on stress le CPU
Memory: c'est aussi plus tu en prends moins tu en laisse aux autres
Memory: les images
=> entraine des bonnes pratiques de rédaction de code spécifique à Android
Multi processus utilise la mémoire (si ils en utilise ou en garde) c'est le drame (LRU cach strategy tout ça)
Et pire la réalité pour nos utilisateur, ils ont des appareils pourris ! Il faut tester sur des appareils pourris aussi
et dans ces 4Go il faut y mettre le système, facebook, les photo de l'utilisateur et ses jeux, ses applis, ses chansons...
1)We have the slower CPU of the world and our users slowest
2)Stressing the CPU drains the battery. System anwser: down clocking the CPU (except if you check the device, runs animations permanently,
3)GPU is the same (Bitmaps loading).
1)We have the slower CPU of the world and our users slowest
2)Stressing the CPU drains the battery. System anwser: down clocking the CPU (except if you check the device, runs animations permanently,
3)GPU is the same (Bitmaps loading).
1)We have the slower CPU of the world and our users slowest
2)Stressing the CPU drains the battery. System anwser: down clocking the CPU (except if you check the device, runs animations permanently,... => you get the CPU at its max speed => drain the battery)
3)GPU is the same (Bitmaps loading).
Votre problème principal car c'est celui de votre utilisateur
Qui parmis vous possède un chargeur ? un chargeur portable ?
Votre problème principal car c'est celui de votre utilisateur
Les bonnes pratiques de code et d'architecture
C'est pour ça que vous êtes là non ? évitez tout ça :)
Votre problème principal car c'est celui de votre utilisateur
La vie en collectivité: Dès que l'un en fait trop cela impacte les autres,
Dès que l'un tue la batterie pour son propre confort, c'est l'appareil qui parait pourri
Dès que l'un prend trop de ressources, ce sont les autres qui en manquent
Si vous en avez trop pris, votre vie dans le LRUCach sera limité, vous ne resterez pas longtemps => votre app prendra du temps à se re-lancer
Ne te penses pas plus important que ne l'est.
Chacun agit celon son propre besoin, ses propres responsabilités, aux mieux pour lui mais pas au mieux pour tous.
Aucune app n'est responsable de l'apparente pietre qualité du device, si on les analyse, rien n'en sortira.
C'est la somme des agissements de chacun, c'est chaque détail, qui ferra qu'à la fin de la journée le device sera épuisé
(exemple l'over sync de toutes les applications si il y en a 100, à 14h plus de batterie...)
5 minutes
fluide => toutes les apps cohabitent
Les super pouvoirs== cadeau des dieux grecs (photo du monde, communication à des distances de dingues, voir, écouter, apprendre, être en lien avec des gens lointains...)
60 fois par seconde une fenetre s'ouvre pour redessiner l'écran, si vous n'êtes pas là, pas pret, vous ratez la fenetre, la prochaine est dans 16 ms...
C'est une de vous plus grosses contrainte
Freeze every body to work
10-20 ms facile avec des super fast device (Dalvik)
2-3mps avec ART
More object (=> avoid allocating) more complex more long
Et surtout tu rates ta fenetre des 16ms pour etre redessiner, imagine ce que ca donne durant une animation.
Pour les ListView c'était super important
Moi, ça m'est arrivé souvent d'avoir le not enough space
Est-ce que quelqu'un parmis vous à déjà implémenté et utilisé ce code?
Dessin de RetoMeier GoogleIo2012
Utilisation de la big cookies startegy (on y reviendra)
Dessin de RetoMeier GoogleIo2012
Utilisation de la big cookies startegy (on y reviendra)
10 minutes
Laissez les gens rencontrer votre application. Le schema de Damien Mabin était super DroidConGreece
10 minutes
Connaitre, comprendre, accepter le monde Android et ses contraintes, évoquées slides précédents
Tu es au service de l'utilisateur, on ne l'oblige pas, on lui parle avec cordialité, on ne le frustre pas tout ça tout ça
et on le respecte. On est tous d'accord?
Du coup qui a déjà codé ces balises ?
Vous avez déjà codé pour être compliant avec l'accessibilité ?
L'histoire du startup we, premier reflexe, on va vendre nos données utilisateurs
Protéger les données de vos utilisateurs
L'histoire du startup we, premier reflexe, on va vendre nos données utilisateurs
Protéger les données de vos utilisateurs
drawable-xhdpi
layout-small
Souvenez vous dans le désert
Il y aussi Google et facebook qui partent faire des tests dans des zones inaccessibles
Il y a aussi enoirmenet d'adaptation à ce facteur dans les différents
Ca va beaucoup mieux avec la SupportLibrary mais c'est pas encore ça
Les animations par exemple
Vous n'êtes pas à l'abris des bugs spécifiques
30 minutes
Il y a les miennes et celles de chet
Parce que sans de bonnes pratiques de code vous n'arriverez pas à atteindre ces objectifs
C'est dans les détails que le diable se cache et c'est pour ça que c'est bonne pratique sont importantes
Votre utilisation de la mémoire est le point le plus important pour voir a quel point l'application se comporte bien.
(taille de l'empreinte mémoire ainsi que sa gestion (et donc le passage de GC)
Il y a des endroits de code (getView, onDraw) où il ne faut ni déclarer ni allouer d'objets
Mettre les objets en cach permet de ne pas les réallouer n fois
Au besoin la mise en place d'un Pool d'objets peut-être la bonne solution
Mettre des variables temporaires en variable de classe (static) [ListView ArrayAdapter.getView]
Les HashMap ne sont pas a utiliser
Définissez la taille des ArrayList si vous pouvez, evite la réallocation en doublant l'espace mem+la recopie des données
Pas d'itérateurs ca créé un objet (et alors ?) du coup for(Object o:toto){for(AnotherObject ao:o.truc())} c'est allouer un autre objet dans un objet
Les énumérations requierent plus d'espace pour implémenter de simples constantes primitives, il vaut mieux des constantes directement. Ca prend trop de place, il ne faut surtout pas dire que c'est une bonne pratique, car tout avec des enums et c'est la mort mémoire
Les librairies, c'est clair.
public static c'est Romain Guy au Paug
C'est une philosophie sous Android de n'initialiser les objet qu'a la demande pour éviter des temps de demarrage digne d'eclipse.
Cela signifie qu'il est mieux parfois de passer en paramètre le retour de la méthode Rect getRect() =>getRect(Rect return)
Les services: l'exemple du scruteur de changement de connnectivité réseau au lieux de la mise en place d'un broadcastreceiver
onTrimMemory (api level 14) vous appele quand on vous demande liberez de la memoire le systeme n'en peut plus.=> exemple de Bitmap dans le LruCach
Les services: l'exemple du scruteur de changement de connnectivité réseau au lieux de la mise en place d'un broadcastreceiver
onTrimMemory (api level 14) vous appele quand on vous demande liberez de la memoire le systeme n'en peut plus.=> exemple de Bitmap dans le LruCach
Très utile pour produire différents apk avec un if else à la compilation:
Pour test/prod
Différente densité == économie de taille d'apk avec les images
Différentes version pour une gestion spécifique (post hc et pre hc
Différents processeurs (intel, amd...
Measure and Layout : happen in the ui threa d and it's time consuming (depends on view complexity)
Inflation: same
Init App: rallonge le temps de lancement (dans oncreate) c'est dans l'uithread
Drawing the layout is a two pass process:
measuring pass - implemented in the measure(int, int) method and is a top-down traversal of the view hierarchy. Every view stores its measurements.
layout pass - implemented in the layout(int, int, int, int) method is also a top-down traversal of the view hierarchy. During this phase each layout manager is responsible for positioning all of its children. It uses the sizes computed in the measure pass.
Note
The measure and layout step always happen together.
Note
Layout managers can run the measure pass several times. For example LinearLayout supports the weight attribute which distributes the remaining empty space among views and RelativeLayout measures child views several times to solve constraints given in the layout file.
A view or activity can retrigger the measure and layout pass with a call to the requestLayout() method.
Complexité augmente le nombre de passage (complexité dépend de la profondeur)
RelativeLayout jamais en début de fichier !! double le nombre de passe necessaire
Pas d'animations, soit on les fait avant et on inflate/change les view, soit on le fait après.
Préferrez les animations qui ne change pas le layout (Layout.param non,non, non, mais TranslationX, ... oui oui oui)
Remplacer
CutomView: Exemple de facebook dans ses listes, et de manière générale on fige les dimensions plus vite avec un passage unique.
La starting Window: Utilise le theme de l'application pour afficher une fenêtre de démarrage.
Ils te permettent de simplifier tes layouts (dont l'objectif est le placement des composants)
Ils te permettent de centraliser les caractéristiques graphiques, de les organiser et de les classer
Ils te permettent ^d'être cohérent globlement et de facilement évoluer
Ils te permettent de simplifier tes layouts (dont l'objectif est le placement des composants)
Ils te permettent de centraliser les caractéristiques graphiques, de les organiser et de les classer
Ils te permettent ^d'être cohérent globlement et de facilement évoluer
Ils te permettent de simplifier tes layouts (dont l'objectif est le placement des composants)
Ils te permettent de centraliser les caractéristiques graphiques, de les organiser et de les classer
Ils te permettent ^d'être cohérent globalement et de facilement évoluer
OverDraw: Redessiner plusieurs fois un même pixel (Debug GPU overDraw)
Pour la starting window c'est le blog de cyril sur le démarage des apps et sur l'overdraw
Pour la context, on ne peut pas utiliser le context app pour créer du GUI car il lui manque le thème/ idem pour la récupération de ressources
Les vues ne sont pas connues des Threads, sinon fuite mémoire potentielle
GCM manager pour les synchronisation cliente
GCM pour que le serveur previenne le client
Parcelable pas d'enregistrement sur disque: Le mieux c'est Json + zip
Sérialisation elle stocke trop d'informations pour assurer une persistance disque ad vitam eternae, trop lente, à proscrire.
Ici MaConstante ne sera jamais GC, vu qu'elle implicitement retient l'instance de la classe qui l'a créé la première fois, c'est mort, fuite mémoire de la taille d'une activité
Donnez les PoolExecutor que tu utilises (1 pour la BD, 4 pour le reste cancelable, 4 pour le non cancelable)
Les classes internes non statiques conservent une référence vers leur classe englobante.
Les classes internes non statiques conservent une référence vers leur classe englobante.
Les classes internes non statiques conservent une référence vers leur classe englobante.
Drawable pointe implicitement vers lActivité qui l'a instancié, donc le mettre en statique pour sauver le temps de chargmenet du bitmap lors de la rotation est une erreur horrible. car on retient toujours la première instance de l'activité
Ici MaConstante ne sera jamais GC, vu qu'elle implicitement retient l'instance de la classe qui l'a créé la première fois, c'est mort, fuite mémoire de la taille d'une activité
Don't fuck around== Chaque brique du système possède une semantique très precise, il faut l'utiliser en coherence avec cette semantique.
Service is how an application indicates to the operating system that it needs to perform a longer-running operation outside of the normal Activity UI flow. If you do not need either of these behaviors (Bound/Start), you should not use a Service.
For example, if you have background work to do that does not need to keep itself running (such as downloading content for your UI that you could resume later when the user returns to the UI) you should use local threading primitives such as AsyncTask, Loader, HandlerThread, etc. Using a Service is much more resource-intensive (as your service needs to be tracked as part of the global system state)
Le mot service prête a confusion !!
Utiliser un broadcast pour écvouter un event plutot qu'un service qui tourney sans arret.
systrace= voir combine de temps on passe dans une méthode
Analyse des écrans: Animations, View hierarchy, Pixel perfect, overdraw,
20 minutes
Explication de chaque modèle via un schéma pour chacun
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau... 100 000 lignes de code, aucun tests
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
Et on a inventé le MVC : decouple la vue, de l'interaction, de la representation.
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
On a relié View et Controller, c'est là qu'on a mis les listener dans les vues
La liaison est 1-1, on sait alors que c'est du pipo pour l'rdi que c'est fait pour les humains et pour les tests
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
La classe Dieu, elle fait tout dans une meme classe, presentation des données, interactions utilisateurs, animations, appel BD, appel réseau...
Grace a gradle et aux saveurs on peut automatiser les confs poru executer les tests
Et aussi il y a du DataBinding
J'ai vu des flux tweeter où les gars s'engueulaient pedant 500 tweets sur le sujet (mais tu fais du MVPM toi, ... blazbla)
Principe de separation des couches, des responsabilités
Isolation des composants = Interfaces
Chaque bloc est indépendant des autres
L'importance des flêches de dependence. Qui connait qui.?
n-tier== n niveau logique (tier=niveau logique)
Les services métiers ne sont pas des services Android
ce sont les traitements métiers, la couche business/métier
Les services Android c'est une toute autre notion
On sépare le code, on le ventile, on l'aère
A scindé en plein de partie, c'est globalement compliqué, mais localement simple
Chaque couche est responsable d'une partie precise de l'application: Algorithme, HTTP, DAO, Vues...
Car chaque couche/composant possède un contrat très précis décrit par son interface
Car modulaire
Car modulaire
Car ils ne dependent de personne
JUnit et bouchons
Les tests apportent la sécurité pour le projet
Les tests apportent la sécurité pour le projet
La couche IHM contient l’ensemble des écrans et se scinde en plusieurs sous-packages.
Une application hiérarchise ses vues, cette hiérarchie doit se retrouver dans vos packages.
La couche IHM contient l’ensemble des écrans et se scinde en plusieurs sous-packages.
Une application hiérarchise ses vues, cette hiérarchie doit se retrouver dans vos packages.