TV Pour le salon consoles, TV Android Auto Pour les voitures autonomes ou non Chrome OS Déployer sur ce nouvel OS Android JetPack Librairies et utilitaires pour simplifier le dev
Ressources & Librairies .oat APP Application A ne peut pas ... Lire les données Utiliser la mémoire Utiliser les ressources CPU Utiliser les devices … de l’application B
Ressources & Librairies .oat APP Application A interagit avec l’application B vous devez spécifier votre intention via une intent (ouvrir un composant, envoyer un message…)
Une règle = pas de taille en pixel on utilise dp: density-independent pixels pour les layouts et images sp: scalable pixels pour les fonts car s’adapte aux paramètres d’accesibilité (sp ne s’utilise pas pour les layouts)
vous cibler 100% des possibilités. Il faut faire des choix Version de l’API utilisée Taille des écrans ciblées Résolutions ciblées mais aussi... Langue de l’utilisateur Usage (mobile, tv, montre…) Orientation Mode jour/nuit ...
Un layout se définit en XML Créer une activité Classe Java qui va hériter de AppCompatActivity Lier l’activité à la vue Se fait dans le onCreate de l’activité Déclarer la vue comme point d’entrée Mise à jour du fichier AndroidManifest.xml
(taille, réseau, pays, langue, orientation…) doivent être isolées dans des fichiers Android chargera les bonnes ressources en fonction des contraintes du device Color Drawable Font Layout Menu Mipmap String Values
sur vos devices grâce à des annotations 2 Ecrire des DAO pour exécuter des requêtes 3 Déclarer la base de données et les DAO @Entity(tableName = "speaker") data class Speaker( @PrimaryKey val uiid: String, @ColumnInfo var firstName: String, @ColumnInfo var lastName: String, @ColumnInfo var country: String = "MAROC" ) 1 Mapper son modèle objet et la base de données @Dao interface SpeakerDao{ @Query("SELECT * from speaker") fun all(): List<Speaker> @Insert fun insert(speaker: Speaker) @Delete fun delete(speaker: Speaker) } private lateinit var INSTANCE: AppDatabase @Database(entities = arrayOf(Speaker::class), version = 1) abstract class AppDatabase : RoomDatabase() { abstract fun speakerDao(): SpeakerDao companion object { fun instance(context: Context): AppDatabase { synchronized(AppDatabase::class) { if (!::INSTANCE.isInitialized) { INSTANCE = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "AppDatabase").build() } } return INSTANCE } } }
principal dispacthe les événements utilisateurs, met jour la vue Il ne faut jamais bloquer ce thread principal Android vous empêche de bloquer ce thread. Si vous ne respectez pas cette recommandation, une exception est levée et votre application est stoppée Android asynchrone Solution = Coroutines GlobalScope.launch { // ... }
A contient le fragment A Activité B contient le fragment B La sélection d’un item à gauche met à jour le fragment B à droite La sélection d’un item à gauche ouvre l’activité B