Android Activity Intent Filter jeanmichel Douin douin au

  • Slides: 107
Download presentation
Android Activity, Intent. Filter jean-michel Douin, douin au cnam point fr version : 24

Android Activity, Intent. Filter jean-michel Douin, douin au cnam point fr version : 24 Novembre 2020 Notes de cours Android_Activity_Intent_Introduction 1

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage d’une autre activité • Au sein de la même application • Depuis une autre application, – Passage de paramètres – Un résultat produit par l’activité est attendu • Attente du résultat • Communiquer entre deux activités – Plusieurs façons • Permission • Génie logiciel, conception – Approche par composants Logiciels induite, comme méthode de conception ? • Annexes Android_Activity_Intent_Introduction 2

Intergiciel : fonctionnalités attendues • Devenir une activité – Quel « protocole » doit-on

Intergiciel : fonctionnalités attendues • Devenir une activité – Quel « protocole » doit-on respecter ? • Quelles sont les classes à hériter ? • Quelles sont méthodes à redéfinir ? , quel cycle de vie ? Est-il est imposé ? • Communiquer – Entre deux activités, entre deux applications, entre deux processus, – Attente d’un résultat d’une activité ? • Sélection de la « bonne » application – – – Une activité se met à la disposition des autres … comment ? Cette activité devient un fournisseur, Maintenance, déploiement, Substitution d’une application par une autre … Android_Activity_Intent_Introduction 3

Bibliographie utilisée CCY 114/SMB 116 : Certificat de compétences : intégrateur d’applications mobiles Cnam

Bibliographie utilisée CCY 114/SMB 116 : Certificat de compétences : intégrateur d’applications mobiles Cnam http: //developer. android. com/resources/index. html Le cours de Victor Matos http: //grail. cba. csuohio. edu/~matos/notes/cis-493/Android-Syllabus. pdf http: //www. vogella. com/android. html http: //www. cs. unibo. it/projects/android/slides/android_intents. pdf http: //www. cs. unibo. it/projects/android/index. html Plusieurs livres Android A Programmers Guide - Mc. Graw Hill Professional Android Application Development – Wrox Le livre de Mark Murphy - Pearson Android_Activity_Intent_Introduction 4

Présentation • Une application peut être constituée de plusieurs écrans, • A chaque écran

Présentation • Une application peut être constituée de plusieurs écrans, • A chaque écran lui correspond une activité, • Une activité hérite et redéfinit certaines méthodes, – on. Create, -> …, on. Pause, -> …, on. Stop, ->…on. Destroy, -> … • Android se charge des appels de ces méthodes, – Un état de l’activité est donc induit par l’exécution de ces méthodes • Android impose un cycle de vie, un état de l’activité. – Inversion de contrôle • (cf. M. Fowler) http: //martinfowler. com/articles/injection. html Android_Activity_Intent_Introduction 5

Architecture, vocabulaire • Source : http: //developer. android. com/guide/topics/fundamentals. html • Application – –

Architecture, vocabulaire • Source : http: //developer. android. com/guide/topics/fundamentals. html • Application – – Activity Service Content. Provider Broadcast. Receiver Android_Activity_Intent_Introduction 6

Une architecture possible Un processus, une DVM, une application, une activité a 1 est

Une architecture possible Un processus, une DVM, une application, une activité a 1 est une activité a 1 Android_Activity_Intent_Introduction 7

Architecture possible, suite • Un processus, Une application, une DVM • Deux activités, –

Architecture possible, suite • Un processus, Une application, une DVM • Deux activités, – Une activité peut en déclencher une autre a 1 Android_Activity_Intent_Introduction a 2 8

Architectures possibles fin… 2 processus, 2 applications, 2 DVM, 3 activités a 1 a

Architectures possibles fin… 2 processus, 2 applications, 2 DVM, 3 activités a 1 a 2 a 3 Une autre architecture possible : 2 processus, 2 DVM, Une application Android_Activity_Intent_Introduction 9

Le cycle de vie d’une activité • Séquencement imposé – Cf. M. Fowler, inversion

Le cycle de vie d’une activité • Séquencement imposé – Cf. M. Fowler, inversion de contrôle • Android a le contrôle – Impose le séquencement Android_Activity_Intent_Introduction 10

Le cycle de vie on. Create • on. Create – Est appelée à la

Le cycle de vie on. Create • on. Create – Est appelée à la création de l’activité – Contient les opérations d’initialisation – Un Bundle(Map) est en paramètre – Si on. Create se termine avec succès, alors on. Start est appelée Android_Activity_Intent_Introduction 11

Le cycle de vie on. Start • on. Start – Est exécutée à la

Le cycle de vie on. Start • on. Start – Est exécutée à la fin de on. Create • Nouvelle activité – Est exécutée à la fin de Restart • Activité existante préalablement stoppée – Est appelée « juste avant » que l’activité soit visible à l’utilisateur Android_Activity_Intent_Introduction 12

Le cycle de vie on. Resume • on. Resume – Est appelée quand l’activité

Le cycle de vie on. Resume • on. Resume – Est appelée quand l’activité est prête à interagir avec l’utilisateur – Est également appelée quand l’activité reprend son exécution, venant de l’arrière plan – Si on. Resume se termine avec succès alors l’activité est en phase d’exécution • Soit la prise en compte des évènements de l’utilisateur, l’activité possède l’écran et le processus qui lui est associé Android_Activity_Intent_Introduction 13

Le cycle de vie on. Pause • on. Pause – Est appelée quand une

Le cycle de vie on. Pause • on. Pause – Est appelée quand une autre activité passe au premier plan ou quand la touche retour est appuyée – Doit libérer les ressources capteurs, … – Est arrêtée en fin de on. Pause, – Android peut décider de l’arrêt par destruction de cette activité à tout moment – La persistance de l’activité peut (doit) être assurée: on. Save. Instance. State Android_Activity_Intent_Introduction 14

Le cycle de vie on. Stop • on. Stop – L’activité n’est plus visible

Le cycle de vie on. Stop • on. Stop – L’activité n’est plus visible à l’utilisateur – Est appelée quand • Une autre activité est passée au premier plan. Cf. on. Resume • L’activité s’apprête à être détruite, – Android peut décider de l’arrêt par destruction de cette activité à tout moment Android_Activity_Intent_Introduction 15

Le cycle de vie on. Restart • on. Restart – Est appelée quand l’activité

Le cycle de vie on. Restart • on. Restart – Est appelée quand l’activité a été préalablement stoppée – L’utilisateur a de nouveau sélectionné cette activité Android_Activity_Intent_Introduction 16

Le cycle de vie on. Destroy • on. Destroy – L’activité va être détruite

Le cycle de vie on. Destroy • on. Destroy – L’activité va être détruite Le système a besoin de place ou bien la méthode finish a été appelée Android_Activity_Intent_Introduction 17

Le cycle de vie d’une activité • Un scénario : – Une activité affiche

Le cycle de vie d’une activité • Un scénario : – Une activité affiche une fenêtre de dialogue – L’activité est au second plan, • Notée semi –visible dans la documentation – L’écran est flouté au second plan • • La fenêtre de dialogue est au 1 er plan on. Pause (de l’activité) La fenêtre de dialogue disparaît on. Resume • Phase d’exécution Android_Activity_Intent_Introduction 18

Le cycle de vie d’une activité a 1 • a 2 Un autre scénario

Le cycle de vie d’une activité a 1 • a 2 Un autre scénario : – a 1 déclenche a 2 – L’activité a 1 se met en pause • on. Pause a 1 – L’activité a 2 « démarre » • 1. 2. 3. 4. Cf. son cycle de vie on. Create a 2 on. Start a 2 on. Resume a 2 on. Stop a 1, (a 1 n’est plus visible) 5. a 2 poursuit son exécution Android_Activity_Intent_Introduction 19

Le cycle de vie d’une activité a 1 • a 2 scénario suite: –

Le cycle de vie d’une activité a 1 • a 2 scénario suite: – a 2 se termine par un appel de finish – L’activité a 2 se met en pause • on. Pause a 2 – L’activité a 1 « revient » 1. on. Restart a 1 2. on. Resume a 1 3. on. Stop a 2, (a 2 n’est plus visible) 4. on. Destroy 5. a 1 reprend son exécution Android_Activity_Intent_Introduction 20

États d’une Activité • http: //inandroid. in/archives/tag/activity-lifecycle Android_Activity_Intent_Introduction 21

États d’une Activité • http: //inandroid. in/archives/tag/activity-lifecycle Android_Activity_Intent_Introduction 21

Cycle de vie + états… • Visible • Semi-visible • Stoppée Note: Attention on.

Cycle de vie + états… • Visible • Semi-visible • Stoppée Note: Attention on. Freeze (Android 0. 9) a été depuis renommée par on. Save. Instance. State (la bien nommée) Android_Activity_Intent_Introduction 22

Le cycle de vie d’une activité • En résumé, une seule activité, un écran,

Le cycle de vie d’une activité • En résumé, une seule activité, un écran, un seul Thread (l’UIThread) … • Android gère le cycle de vie de vos activités Android_Activity_Intent_Introduction 23

Avec une pyramide, doc développeur http: //developer. android. com/training/basics/activity-lifecycle/starting. html#lifecycle-states Pour en savoir plus

Avec une pyramide, doc développeur http: //developer. android. com/training/basics/activity-lifecycle/starting. html#lifecycle-states Pour en savoir plus : une démo est à télécharger à cette URL Android_Activity_Intent_Introduction 24

En diagramme de séquences • https: //thamilandroid. wordpress. com/2013/04/29/android-life-cycle/ Android_Activity_Intent_Introduction 25

En diagramme de séquences • https: //thamilandroid. wordpress. com/2013/04/29/android-life-cycle/ Android_Activity_Intent_Introduction 25

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage d’une autre activité • Au sein de la même application • Depuis une autre application, – Passage de paramètres – Un résultat produit par l’activité est attendu • Attente du résultat • Communiquer entre deux activités – Plusieurs façons • Permission • Génie logiciel, conception – Approche par composants Logiciels induite, comme méthode de conception ? • Annexes Android_Activity_Intent_Introduction 26

Activité • Créer une activité c’est – Hériter de la classe android. app. Activity;

Activité • Créer une activité c’est – Hériter de la classe android. app. Activity; – Redéfinir certaines méthodes • on. Create – super. on. Create cumul de comportement (obligatoire) – initialisation des variables d’instance – set. Content. View affectation de la vue • on. Start, – super. on. Start cumul du comportement • on. Resume … – super. on. Resume cumul du comportement on. Create, on. Pause, … sont appelées des « callback » http: //developer. android. com/training/basics/activity-lifecycle/starting. html#lifecycle-states Android_Activity_Intent_Introduction 27

Activity les bases, Hello. World. Activity. java • Une simple Activité, Hello. World (

Activity les bases, Hello. World. Activity. java • Une simple Activité, Hello. World ( encore) on. Create • super. on. Create cumul de comportement (obligatoire) • set. Content. View affectation de la vue Android_Activity_Intent_Introduction 28

Description de l’activité pour Android • Android. Manifest. xml pour Hello. World. Activity –

Description de l’activité pour Android • Android. Manifest. xml pour Hello. World. Activity – Un langage destiné au système Android • Précise – Le nom de l’application, son icône, … – Le nom de l’activité, – Le nom du paquetage, – Les permissions, – Les autres activités de cette application, – Les autres services, –… Android_Activity_Intent_Introduction 29

Android. Manifest. xml … • Le nom de l’application, son icône, … • Le

Android. Manifest. xml … • Le nom de l’application, son icône, … • Le nom de l’activité, – Comment le système déclenche t-il cette activité ? • <intent. Filter ? – <action ? – <category ? Android_Activity_Intent_Introduction 30

Android. Manifest. xml • <intent-filter> comme Intent. Filter A destination du système, un mécanisme

Android. Manifest. xml • <intent-filter> comme Intent. Filter A destination du système, un mécanisme de sélection de la « bonne » activité Abonnement, souscription à ce type d’évènement • Une Intention a été générée par le système Android_Activity_Intent_Introduction 31

Intent : un message • Explicite – Intent intent = new Intent(…. . );

Intent : un message • Explicite – Intent intent = new Intent(…. . ); – La cible est précisée • Dans le constructeur – new Intent(this, Activity. Class. Name. class) • Par un appel de set. Class. Name – i. set. Class. Name(Context, Activity. Class. Name) • Ou bien de set. Component. Name – i. set. Component. Name( package, package+. Activity. Class. Name) • Implicite – La cible ou les cibles dépendent du filtre – Une résolution est effectuée • Sélection des activités répondant aux critères • Critères comme – Le nom d’une action (ex: Intent. ACTION_DIAL) – Une catégorie d’action (ex: android. intent. category. DEFAULT) – Une donnée (ex: http: //www. google. com ) Android_Activity_Intent_Introduction 32

Sommaire • Activity – Présentation, cycle de vie • Intent, Intent. Filter – Démarrage

Sommaire • Activity – Présentation, cycle de vie • Intent, Intent. Filter – Démarrage d’une autre activité • Au sein de la même application • Depuis une autre application, – Passage de paramètres – Un résultat produit par l’activité sélectionnée • Attente du résultat, • Communiquer entre deux activités – Plusieurs façons • Permission • Génie logiciel, conception – Approche par composants Logiciels induite, comme méthode de conception ? • Annexes Android_Activity_Intent_Introduction 33

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity Au sein de la même application Hello. World. Master Android_Activity_Intent_Introduction Hello. World. Activity 34

Intent Explicite, constructeur • Au sein de la même application, dans le constructeur Android.

Intent Explicite, constructeur • Au sein de la même application, dans le constructeur Android. Manifest. xml Android_Activity_Intent_Introduction 35

Intent Explicite, set. Class. Name • Au sein de la même application, tjs Master.

Intent Explicite, set. Class. Name • Au sein de la même application, tjs Master. Activity Manifest. Android. xml identique au précédent Android_Activity_Intent_Introduction 36

Séqencement, diagramme d’état, illustration • Par la pratique … Une trace est installée dans

Séqencement, diagramme d’état, illustration • Par la pratique … Une trace est installée dans chaque méthode, • on. Create, on. Start … des deux activités public void on. Create(Bundle b){ super. oncreate(b); Log. i(TAG, " on. Create "); Avec TAG = get. Class(). get. Name() Démonstration Android_Activity_Intent_Introduction 37

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity Une application, un processus, une DVM Hello World Master Android_Activity_Intent_Introduction Hello World Activity 38

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity

Une DVM, une application deux activités • Hello. World. Master déclenche Hello. World. Actvity Une application, deux processus, deux DVM Hello. World. Master Android_Activity_Intent_Introduction Hello. World. Activity 39

Une application, deux processus, deux DVM • Android. Manifest. xml Android_Activity_Intent_Introduction 40

Une application, deux processus, deux DVM • Android. Manifest. xml Android_Activity_Intent_Introduction 40

Séquencement identique et constaté • Hello. World. Master 1. on. Create • 2. 3.

Séquencement identique et constaté • Hello. World. Master 1. on. Create • 2. 3. 4. 8. start. Activity … on. Start on. Resume on. Pause • Hello. World. Activity 5. 6. 7. – on. Create on. Start on. Resume Touche retour 9. on. Pause on. Stop 10. on. Restart 11. on. Start 12. on. Resume 13. on. Stop • Hello. World. Activity s’arrête, • Hello. World. Master redevient le maître • À trois activités ? , un appel urgent ? Android_Activity_Intent_Introduction Une pile des activités 41

Une pile des activités est en place • http: //docs. huihoo. com/android/3. 0/guide/topics/fundamentals/tasks-and-back-stack. html

Une pile des activités est en place • http: //docs. huihoo. com/android/3. 0/guide/topics/fundamentals/tasks-and-back-stack. html Android_Activity_Intent_Introduction 42

Intent explicite, set. Component. Name • Une autre application, – Au sein de laquelle

Intent explicite, set. Component. Name • Une autre application, – Au sein de laquelle une activité Hello. World. Master est créée • cnam. master. Hello. World. Master – Cette activité se charge de déclencher la simple Activité … • cnam. essais. Hello. World. Activity Android_Activity_Intent_Introduction 43

Intent explicite, set. Component. Name • Une autre application, une autre activité – La

Intent explicite, set. Component. Name • Une autre application, une autre activité – La balise <activity de l’activité appelée n’est plus présente Android_Activity_Intent_Introduction 44

Une autre activité d’une autre application • Une autre activité d’une autre application est

Une autre activité d’une autre application • Une autre activité d’une autre application est spécifiée – Par son nom de package, son nom de classe – Deux applications, deux processus, deux DVM cnam. master. Hello. World. Master cnam. essais. Hello. World. Activity • Avec – <activity android: exported="true" android: name=". Hello. World. Activity" /> » Au sein de Android. Manifest. xml Android_Activity_Intent_Introduction 45

Séquencement identique • Hello. World. Master 1. on. Create • start. Activity … 2.

Séquencement identique • Hello. World. Master 1. on. Create • start. Activity … 2. on. Start 3. on. Resume 4. on. Pause • Hello. World. Activity 5. 6. 7. – on. Create on. Start on. Resume Touche retour 8. on. Stop 10. on. Restart 11. on. Start 12. on. Resume 9. on. Pause 13. on. Stop Android_Activity_Intent_Introduction 46

Intent Explicite • Démonstration • Divers, syntaxe Note : set. Class. Name Android_Activity_Intent_Introduction 47

Intent Explicite • Démonstration • Divers, syntaxe Note : set. Class. Name Android_Activity_Intent_Introduction 47

Un résumé • Intent explicite – Le nom de la classe est connue •

Un résumé • Intent explicite – Le nom de la classe est connue • set. Component. Name – Au sein de la même DVM • Android. Manifest le précise (<activity – Dans une autre application • Le nom du paquetage identifie l’activité cible • La suite : Intent implicite – Abstraction du nom de la classe …. – Notion de clients demandeurs / fournisseurs Android_Activity_Intent_Introduction 48

Intent implicite • Le système sélectionne la ou les bonnes activités – En fonction

Intent implicite • Le système sélectionne la ou les bonnes activités – En fonction de critères • Un nom d’action, une donnée … • Exemple – Renseignons le filtre de l’activité simple bonjour. ACTION !!! • Enregistrement auprès du système Android avec cette ACTION, – Cette activité devient éligible à deux types d’Intention Android_Activity_Intent_Introduction 49

Intent implicite, le Maître … • Hello. Word. Master à la recherche d’une bonne

Intent implicite, le Maître … • Hello. Word. Master à la recherche d’une bonne ACTION – Quels sont les fournisseurs de bonjour. ACTION ? – Hello. World. Activity est sélectionné et s’exécute Android reçoit l’intention, du client parcourt ses tables, à la recherche de la bonne activité Trouve et sélectionne le fournisseur Hello. World. Activity Android_Activity_Intent_Introduction 50

Ajoutons une seconde Activity • Avec le même filtre, bonjour. ACTION – Dis bonjour

Ajoutons une seconde Activity • Avec le même filtre, bonjour. ACTION – Dis bonjour à la dame est une nouvelle activité • Le code est identique … Hello. World –Cette activité est éligible à un seul type d’Intention Android_Activity_Intent_Introduction 51

Intent implicite, le Maître … • Hello. Word. Master à la recherche d’une bonne

Intent implicite, le Maître … • Hello. Word. Master à la recherche d’une bonne ACTION – Quels sont les fournisseurs de bonjour. ACTION ? • Nouvelle exécution de l’application • Nous avons maintenant plusieurs fournisseurs possibles – Hello. Word. Activity – Dis. Bonjour. ALa. Dame. Activity Android_Activity_Intent_Introduction 52

Le Maître a maintenant le choix ………. . • Qui voudrait dire Bonjour ?

Le Maître a maintenant le choix ………. . • Qui voudrait dire Bonjour ? – Quels sont les fournisseurs de ce service ? • 2 activités sont candidates Une fenêtre de dialogue apparaît … Décidez vous … Android_Activity_Intent_Introduction 53

Intent implicite • Démonstration Android_Activity_Intent_Introduction 54

Intent implicite • Démonstration Android_Activity_Intent_Introduction 54

Remarques … post démonstration • L’activité sélectionnée engendre un processus – Processus avec sa

Remarques … post démonstration • L’activité sélectionnée engendre un processus – Processus avec sa DVM – Ce processus engendre des Thread, au démarrage de la DVM dont l’un d’entre eux (main) se charge 1. De créer l’activité 2. D’exécuter les méthodes selon le cycle de vie Android_Activity_Intent_Introduction 55

Intent implicite, autres critères • Envoyer un SMS : Hello. World Intent intent =

Intent implicite, autres critères • Envoyer un SMS : Hello. World Intent intent = new Intent(Intent. ACTION_VIEW); intent. set. Data(Uri. parse("sms: ")); intent. put. Extra("sms_body", "hello world"); start. Activity(intent); • Ouvrir un fichier : hello_world. mp 3 Intent intent = new Intent(Intent. ACTION_VIEW); File hello = new File("/sdcard/hello. mp 3"); intent. set. Data. And. Type(Uri. from. File(hello), "audio/mp 3"); start. Activity(intent); Android_Activity_Intent_Introduction 56

Intent implicite, autres critères • Téléphoner String url = "tel: 43556"; Intent intent =

Intent implicite, autres critères • Téléphoner String url = "tel: 43556"; Intent intent = new Intent( start. Activity(intent); Intent. ACTION_CALL, Uri. parse(url)); • Ouvrir un navigateur Intent intent = new Intent(Intent. ACTION_VIEW); intent. set. Data(Uri. parse("http: //www. hello. com")); start. Activity(intent); Android_Activity_Intent_Introduction 57

Le scheme hello: // devient un critère Intent intent = new Intent(Intent. ACTION_VIEW); intent.

Le scheme hello: // devient un critère Intent intent = new Intent(Intent. ACTION_VIEW); intent. set. Data(Uri. parse("hello: //www. world. com")); start. Activity(intent); Android_Activity_Intent_Introduction 58

Composants logiciels, enfin ? Serait-ce une « nouvelle » approche de conception des logiciels

Composants logiciels, enfin ? Serait-ce une « nouvelle » approche de conception des logiciels ? Une application est constituée de composants logiciels, Ces composants sont indépendants, interchangeables, ont leur contexte d’exécution, … Déploiement, maintenance, … Ces composants sont sélectionnés à l’exécution, Peut-on avoir une liste des applications candidates ? Comment obtient-on les fonctionnalités de chacune ? cf. les travaux sur service requis service fourni ? Android_Activity_Intent_Introduction 59

Mécanisme de résolution • Quelles sont les activités sensibles à cette Intention ? –

Mécanisme de résolution • Quelles sont les activités sensibles à cette Intention ? – Calcul de l’éligibilité des activités, (une notification conditionnée) – La sélection de l’activité est définie, par un Intent. Filter – Sur cet exemple la résolution s’effectue en 2 étapes : – – Test du champ action (pour l’activité) Test du champ category (pour Android) – Si les deux réussissent alors l’activité est sélectionnée Android_Activity_Intent_Introduction 60

Résolution phase 1 • Le test réussit si le champ action de l’Intent est

Résolution phase 1 • Le test réussit si le champ action de l’Intent est inclus dans la liste – http: //developer. android. com/guide/components/intents-filters. html • phase 1 : test du champ action Android_Activity_Intent_Introduction 61

ACTION prédéfinies – http: //developer. android. com/reference/android/content/Intent. html – Action définies par le programmeur,

ACTION prédéfinies – http: //developer. android. com/reference/android/content/Intent. html – Action définies par le programmeur, une règle d’écriture • Le nom du paquetage + le nom de l’action Android_Activity_Intent_Introduction 62

Résolution phase 2 • Le test réussit si le champ category de l’Intent est

Résolution phase 2 • Le test réussit si le champ category de l’Intent est inclus dans la liste – http: //developer. android. com/guide/components/intents-filters. html • phase 2 : test du champ category Android_Activity_Intent_Introduction 63

CATEGORY prédéfinies – http: //developer. android. com/reference/android/content/Intent. html – Le programmeur peut ajouter des

CATEGORY prédéfinies – http: //developer. android. com/reference/android/content/Intent. html – Le programmeur peut ajouter des catégories à l’Intent • add. Category() – Par exemple pour demander au système toutes les applications candidates … candidates à cet Intention Android_Activity_Intent_Introduction 64

Résolution phase 3 • Le test réussit si le champ data de l’Intent appartient

Résolution phase 3 • Le test réussit si le champ data de l’Intent appartient à cette liste – http: //developer. android. com/guide/components/intents-filters. html • Phase 3 : test du champ data – Le programmeur peut ajouter des data à l’Intent • set. Data() set. Data. And. Type Android_Activity_Intent_Introduction 65

Toutes les applications éligibles, précaution Obtenir la liste de toutes les activités éligibles à

Toutes les applications éligibles, précaution Obtenir la liste de toutes les activités éligibles à une intention ? Toutes non, seules celles capables de dire Bonjour ! Package. Manager pm = get. Package. Manager(); Intent intent = new Intent(); intent. set. Action("bonjour. ACTION"); List<Resolve. Info> l = pm. query. Intent. Activities(intent, 0); boolean intent. Safe = l. size() > 0; if(intent. Safe) start. Activity(intent) Attention émettre une intention sans qu’il y ait d’applications éligibles lève une exception http: //developer. android. com/training/basics/intents/sending. html Android_Activity_Intent_Introduction 66

Intent, la suite • Un résumé – Intent explicite, implicite, processus • Un rappel

Intent, la suite • Un résumé – Intent explicite, implicite, processus • Un rappel sur la pile des activités • Architecture : Le pattern Publish-Subscribe • Passage de paramètres, via l’intent – ( ce n’est pas la seule façon…) • Retour de résultats – Comment ? – Redéfinition de start. Activity. For. Result Android_Activity_Intent_Introduction 67

Rappel : Une pile des activités est en place • Pouvons nous modifier le

Rappel : Une pile des activités est en place • Pouvons nous modifier le contenu de cette Pile ? start. Activity et les FLAG_ACTIVITY Méthode set. Flags ou add. Flags d’une Intent intent = new Intent(ctxt, Activity 2. class); Intent. set. Flags(Intent. FLAG_ACTIVITY… Android_Activity_Intent_Introduction 68

Pile des activités… cf FLAG_ACTIVITY_. . . • A, B, C, D sont des

Pile des activités… cf FLAG_ACTIVITY_. . . • A, B, C, D sont des activités, – A démarre B (A -> B, par start. Activity) – A -> B -> C -> D • A la fin de D Nous voudrions directement revenir en A • Depuis D Intent intent = new Intent(this, A. class); Intent. add. Flags(Intent. FLAG_ACTIVITY_CLEAR_TOP); start. Activity(intent); – A -> B -> A … • Par défaut : création d’une nouvelle activité à chaque start. Activity • La même instance est conservée – Depuis A Intent intent = new Intent(this, B. class); Intent. add. Flags(Intent. FLAG_ACTIVITY_REORDER_TO_FRONT); start. Activity(intent); – Depuis B idem Android_Activity_Intent_Introduction 69

Architecture • Nous avons : – Des souscripteurs de certaines intentions, – Des publieurs

Architecture • Nous avons : – Des souscripteurs de certaines intentions, – Des publieurs d’intentions, – Un mécanisme de résolution de la bonne activité, – Le système Android se charge de tout. • Alors serait-ce le patron Publish-Subscribe ? Android_Activity_Intent_Introduction 70

Publish-Subscribe • source: http: //www 2. lifl. fr/icar/Chapters/Intro/intro. html Android_Activity_Intent_Introduction 71

Publish-Subscribe • source: http: //www 2. lifl. fr/icar/Chapters/Intro/intro. html Android_Activity_Intent_Introduction 71

Publish-subscribe / pull-push • Un forum de discussion … – Enregistrement d’un « client

Publish-subscribe / pull-push • Un forum de discussion … – Enregistrement d’un « client » à un sujet de discussion, – Un des « clients » décide de poster un message, – Les utilisateurs à leur initiative vont cher l’information, – Publish-subscribe, mode pull • Les listes de diffusion, logiciels de causerie, – – Abonnement d’un « client » à une liste de diffusion, Un des « clients » décide de poster un message, Tous les abonnés reçoivent ce message, Les abonnés peuvent installer un filtre sur les contenus des messages, – Publish-subscribe, mode push Android_Activity_Intent_Introduction 72

Publish-Subscribe/Intent & Context Activity • Activity X, Y Intent Activity, Service, Receiver même principe

Publish-Subscribe/Intent & Context Activity • Activity X, Y Intent Activity, Service, Receiver même principe … Android_Activity_Intent_Introduction 73

Les classes au sein de ce patron • Basé sur les – Intent (Topic),

Les classes au sein de ce patron • Basé sur les – Intent (Topic), – Context (Mediator), – Activity (Subscriber, Publisher). • Publisher – Intent i = new … – start. Activity(context, i); • Subscriber – Intent. Filter • Mediator – Context • La notification utilise un mécanisme de résolution – En fonction des filtres installés par les souscripteurs Android_Activity_Intent_Introduction 74

Sommaire-suite • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage

Sommaire-suite • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage d’une autre activité • Au sein de la même application • Depuis une autre application, – Passage de paramètres – Un résultat produit par l’activité est attendu • Attente du résultat, • Communiquer entre deux activités – Plusieurs façons • Permission • Génie logiciel, conception – Approche par composants Logiciels induite, comme méthode de conception ? • Annexes Android_Activity_Intent_Introduction 75

L’intent peut contenir des paramètres • Les extras, un Bundle, une Map ! Une

L’intent peut contenir des paramètres • Les extras, un Bundle, une Map ! Une table de couples <clé, valeur>, la clé est de type String Intent i = new Intent(); // i. set. Action… i. put. Extra("fichier", "hello. mp 3"); i. put. Extra("compteur", 2); Des paramètres à l’intention de Android_Activity_Intent_Introduction 76

L’activité lit les paramètres transmis • Les extras, un Bundle, une Map ! Une

L’activité lit les paramètres transmis • Les extras, un Bundle, une Map ! Une table de couples <clé, valeur>, la clé est de type String Intent i = get. Intent(); String f = i. get. String. Extra("fichier"); Des paramètres reçus par l’activité sélectionnée Android_Activity_Intent_Introduction 77

put. Extra, get. Extras http: //developer. android. com/reference/android/content/Intent. html Types simples : c’est prévu

put. Extra, get. Extras http: //developer. android. com/reference/android/content/Intent. html Types simples : c’est prévu Objets métiers : ils implementeront Parcelable Android_Activity_Intent_Introduction 78

L’activité transmet une instance complète : Parcelable • La classe des instances transmises implémente

L’activité transmet une instance complète : Parcelable • La classe des instances transmises implémente Parcelable • Parcelable comme Serializable –Sauf que tout est à la charge du programmeur –Chaque champ doit être écrit et restitué • Exemple : –Auditeur est une classe qui implémente Parcelable • Les noms de méthodes sont imposées via l’interface • Envoi depuis l’activité a 1 • Appel – du constructeur –Lors de la transmission • write. To. Parcel Android_Activity_Intent_Introduction 79

L’activité reçoit une instance Parcelable • Restitution : – Classe Auditeur suite • Les

L’activité reçoit une instance Parcelable • Restitution : – Classe Auditeur suite • Les noms de méthodes sont imposées via l’interface • Un constructeur avec en paramètre l’instance Parcel reçue –Déclenché par le mécanisme de restitution • La classe Auditeur se doit d’être dans une librairie • ( afin d’éviter la recopie multiple des sources) Android_Activity_Intent_Introduction 80

Une librairie, un. jar • Connaissance des classes par les deux activités ? –

Une librairie, un. jar • Connaissance des classes par les deux activités ? – Toutes classes sont dans un projet eclipse : case is. Library à cocher – Une librairie, un. jar à installer dans chaque application cliente – Cnam. Lib contient la classe Auditeur ci-dessous Android_Activity_Intent_Introduction 81

Serializable / Parcelable, discussions • Serializable – Puissant mais lent, dû à l’usage de

Serializable / Parcelable, discussions • Serializable – Puissant mais lent, dû à l’usage de l’introspection – Comically slow … • Parcelable – Pas d’introspection, tout est défini par l’utilisateur – Fanstastically quick … • http: //stackoverflow. com/questions/5550670/benefit-of-using-parcelable-instead-ofserializing-object • Benchmark intéressant … – http: //code. google. com/p/thrift-protobuf-compare/wiki/Benchmarking • Java Serializable, Externalizable, JSON … Android_Activity_Intent_Introduction 82

Retour de résultats a 1 a 2 a 1) start. Activity. For. Result(intent, request.

Retour de résultats a 1 a 2 a 1) start. Activity. For. Result(intent, request. Code); • Un résultat est attendu une intention comme d’habitude … un paramètre request. Code, un identifiant de l’activité appelante (a 1) on. Activity. Result est redéfinie dans l’activité appelante (a 1) Android_Activity_Intent_Introduction 83

L’activité a 2 est déclenchée, et s’exécute a 2 • Tout s’est bien passé

L’activité a 2 est déclenchée, et s’exécute a 2 • Tout s’est bien passé – set. Result(RESULT_OK); • Tout s’est bien passé et en plus il y a des résultats retournés – set. Result(RESULT_OK, intent); • a 2 se termine cf cycle de vie Android_Activity_Intent_Introduction 84

a 2 se termine a 1 a 2 on. Activity. Result redéfinie dans a

a 2 se termine a 1 a 2 on. Activity. Result redéfinie dans a 1 est appelée, cette méthode s’exécutera lorsque a 1 sera au 1 er plan Android_Activity_Intent_Introduction 85

Exemple Hello. Master -> Hello. Activity • Hello. Master déclenche Hello. Activity – Le

Exemple Hello. Master -> Hello. Activity • Hello. Master déclenche Hello. Activity – Le dialogue s’installe « Bonjour ! » -> « Bonjour, comment allez-vous ? » – Reprenons l’exemple des deux activités une application, deux DVM Android_Activity_Intent_Introduction 86

Hello. Activity répond (aujourd’hui) • set. Result est appelée • Puis touche retour Android_Activity_Intent_Introduction

Hello. Activity répond (aujourd’hui) • set. Result est appelée • Puis touche retour Android_Activity_Intent_Introduction 87

Exemple Hello. Activity -> Hello. Master • Hello. Master reçoit une réponse – on.

Exemple Hello. Activity -> Hello. Master • Hello. Master reçoit une réponse – on. Activity. Result est appelée Android_Activity_Intent_Introduction 88

Séquencement des deux activités • Hello. World. Master 1. on. Create • start. Activity

Séquencement des deux activités • Hello. World. Master 1. on. Create • start. Activity … 2. on. Start 3. on. Resume 4. on. Pause – Activity en arrière plan 8. on. Stop 10. on. Activity. Result 11. on. Restart 12. on. Start 13. on. Resume • Hello. World. Activity 5. on. Create 6. on. Start 7. on. Resume – Activity visible – set. Result – « Touche retour » 9. on. Pause 14. on. Stop Android_Activity_Intent_Introduction 89

Deux activités fournissent des résultats start. Activity. For. Result(CODE_a 2, … start. Activity. For.

Deux activités fournissent des résultats start. Activity. For. Result(CODE_a 2, … start. Activity. For. Result(CODE_a 3, … a 2 • a 2 • set. Result a 1 a 3 public void on. Activity. Result( CODE if (CODE==CODE_a 2) … else if (CODE==CODE_a 3) … Android_Activity_Intent_Introduction • a 3 • set. Result 90

on. Activity. Result, schéma de programme • request. Code identifie l’activité appelée – Sur

on. Activity. Result, schéma de programme • request. Code identifie l’activité appelée – Sur cet exemple LOGIN_REQUEST_CODE • • i. e. start. Activity. For. Result(intent, LOGIN_REQUEST_CODE); Ou start. Activity. For. Result(intent, ANOTHER_REQUEST_CODE); Android_Activity_Intent_Introduction 91

Passage de paramètres, suite • Passage de paramètres, via l’intent Mias ce n’est pas

Passage de paramètres, suite • Passage de paramètres, via l’intent Mias ce n’est pas la seule façon http: //developer. android. com/guide/faq/framework. html#3 http: //stackoverflow. com/questions/4878159/android-whats-the-best-way-to-share-data-between-activities http: //developer. android. com/guide/practices/performance. html – L’activité déclenchée partage la même application • • Une instance d’une classe, pattern Singleton, cf annexe Une variable de classe et ses méthodes, cf annexe Une Hash. Map de Weak. Reference, la clé est transmise via l’intent cf annexe Via l’application. – L’activité est sur une autre DVM • Intent, • Messager (autre support, cf; service) – Avec persistance • Préférences, • Fichiers, (java. io) • content. Providers, SQLite(autre support) Android_Activity_Intent_Introduction 92

Paramètres : via l’application • Android. Manifest. xml • Même Application, même DVM –

Paramètres : via l’application • Android. Manifest. xml • Même Application, même DVM – Chaque application Android peut être associée à une instance de Android. app. Application – Un seul point d’entrée pour toutes les activités • Peut-être le plus COO voir annexe, cf pattern délégation et façade Android_Activity_Intent_Introduction 93

Paramètres : via l’Application • Ecriture • Lecture • Attention même DVM … Android_Activity_Intent_Introduction

Paramètres : via l’Application • Ecriture • Lecture • Attention même DVM … Android_Activity_Intent_Introduction 94

Passage de paramètres avec persistance • Un fichier xml est généré, – ici accessible

Passage de paramètres avec persistance • Un fichier xml est généré, – ici accessible et modifiable par tous Android_Activity_Intent_Introduction 95

Persistance, lecture • Lecture du fichier de préférences Android_Activity_Intent_Introduction 96

Persistance, lecture • Lecture du fichier de préférences Android_Activity_Intent_Introduction 96

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage

Sommaire • Activity – Présentation, cycle de vie • Intent, intent. Filter – Démarrage d’une autre activité • Au sein de la même application • Depuis une autre application, – Passage de paramètres – Un résultat produit par l’activité est attendu • Attente du résultat, • Communiquer entre deux activités – Plusieurs façons • Permission • Génie logiciel, conception – Approche par composants Logiciels induite, comme méthode de conception ? • Annexes Android_Activity_Intent_Introduction 97

Les Permissions • Une activité peut – exiger d’avoir la bonne permission afin d’être

Les Permissions • Une activité peut – exiger d’avoir la bonne permission afin d’être appelée – La clause <use-permission est installée chez l’appelant – Le fichier Android. Manifest. xml de l’appelé contient • Les déclarations des permissions <permission • L’attribut android: permission , balise <activity Android_Activity_Intent_Introduction 98

Permission d’être poli • La permission de dire bonjour … Les permissions sont installées,

Permission d’être poli • La permission de dire bonjour … Les permissions sont installées, Android. Manifest. xml <permission <activity android: permission= Android_Activity_Intent_Introduction 99

Si j’ai la permission • Si j’ai la permission, je pourrais démarrer l’activité –

Si j’ai la permission • Si j’ai la permission, je pourrais démarrer l’activité – <use-permission Android_Activity_Intent_Introduction 100

Génie Logiciel et plus • Autre support en cours … • Design – http:

Génie Logiciel et plus • Autre support en cours … • Design – http: //developer. android. com/design/index. html – http: //mobile. smashingmagazine. com/2012/07/26/android-design-tips/ Android_Activity_Intent_Introduction 101

Annexes • Passage de paramètres, même DVM – L’activité déclenchée partage la même application

Annexes • Passage de paramètres, même DVM – L’activité déclenchée partage la même application • Une instance d’une classe, pattern Singleton, • Une variable de classe et ses méthodes, • Une Hash. Map de Weak. Reference, la clé est transmise via l’intent Android_Activity_Intent_Introduction 102

Passage de paramètres, même DVM • Passage de paramètres, via l’intent Ce n’est pas

Passage de paramètres, même DVM • Passage de paramètres, via l’intent Ce n’est pas la seule façon http: //developer. android. com/guide/faq/framework. html#3 http: //stackoverflow. com/questions/4878159/android-whats-the-best-way-to-share-data-betweenactivities http: //developer. android. com/guide/practices/performance. html Android_Activity_Intent_Introduction 103

Paramètres : le pattern Singleton • Attention : même DVM, pour les deux activités

Paramètres : le pattern Singleton • Attention : même DVM, pour les deux activités – Variables de classes … Android_Activity_Intent_Introduction 104

Paramètres : le pattern Singleton, lecture – Même DVM, pour les deux activités –

Paramètres : le pattern Singleton, lecture – Même DVM, pour les deux activités – Le singleton est ici en mémoire « globale » – Autre technique : Variables et méthodes de classes, idem • Attention tout de même à cet usage, ce n’est pas de la COO (Thread safe, … Android_Activity_Intent_Introduction 105

Paramètres: Weak. Hash. Map • Weak. Hash. Map – – Une nouvelle clé est

Paramètres: Weak. Hash. Map • Weak. Hash. Map – – Une nouvelle clé est générée, La clef référence une instance côté activité cliente, Cette clef est transmise à l’activité appelée via l’intent, Weak : Le ramasse miettes(GC) libère tous les couples <clef, valeur>, dont la clef n’est plus référencée par le programme Android_Activity_Intent_Introduction 106

Paramètres : Weak. Hash. Map, lecture • Le client lit la référence de la

Paramètres : Weak. Hash. Map, lecture • Le client lit la référence de la liste depuis la table • Même DVM, pour les deux activités Android_Activity_Intent_Introduction 107