Receiver, CGM et + 1 Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction Notes de cours jean-michel Douin, douin au cnam point fr.

Slides:



Advertisements
Présentations similaires
Mais vous comprenez qu’il s’agit d’une « tromperie ».
Advertisements

Gestion des événements (suite)
Classe : …………… Nom : …………………………………… Date : ………………..
Android les Services, Receiver et processus
Android View, onClick, Activity, Modèle Vue Contrôleur
Android UIThread, Thread, Handler et AsyncTask
Les nombres.
1 V-Ingénierie… La compétence au service de lexigence… vous présente.
Cours MIAGE « Architectures Orientées Services » Henry Boccon-Gibod 1 Architectures Orientées Services Composants de Service Exemple pratique de développement.
JXDVDTEK – Une DVDthèque en Java et XML
T ravail E tude R echerche COUREUX Éric DUCK Christian ZENGERLÉ Olivier COUREUX Éric DUCK Christian ZENGERLÉ Olivier EncadrantsEncadrants M. Crescenzo.
Algorithme et structure de données
LICENCE MIAGE Introduction Programmation Orientée Objet JAVA philippe
Autorisations Utilisation eCATT
ESIEE Paris © Denis BUREAU I N Initiation à la programmation avec le langage Java.
Application Android . pour étudiants de l’Esiee
Révision (p. 130, texte) Nombres (1-100).
Page 1 Introduction à ATEasy 3.0 Page 2 Quest ce quATEasy 3.0? n Ensemble de développement très simple demploi n Conçu pour développer des bancs de test.
Configuration Android
Cours N°6 Application sur les listview et les Broadcast Receivers Rami AMRI FST 2011/2012.
Configuration de Windows Server 2008 Active Directory
Chapitre 21 Collections Partie I Introduction Une collection : est un objet qui regroupe multiple éléments dans une unité. Une collection est.
Projet poker 1/56. Introduction Présentation de léquipe Cadre du projet Enjeux Choix du sujet 2.
Développement d’application web
66 Utilisation des classes et des objets. 6-2 Objectifs A la fin de ce cours, vous serez capables de : Créer de nouvelles classes à laide de Eclipse Utiliser.
GPA789 Analyse et conception orientées objet 1 Professeur: Tony Wong, Ph.D., ing. Chapitre 6 Correspondance UML et C++
Notre calendrier français MARS 2014
Année universitaire Réalisé par: Dr. Aymen Ayari Cours Réseaux étendus LATRI 3 1.
COURS DE PROGRAMMATION ORIENTEE OBJET :
Java, les objets : tout de suite ! Rassembler, grouper les objets
jean-michel Douin, douin au cnam point fr
Proxy et plus Cnam Paris jean-michel Douin, douin au cnam point fr
Android View, onClick, Activity, Modèle Vue Contrôleur
MAGIE Réalisé par Mons. RITTER J-P Le 24 octobre 2004.
C'est pour bientôt.....
Veuillez trouver ci-joint
Portail CVM Vision pédagogique.
Projet de Master première année 2007 / 2008
99 Réutilisation du code grâce à l'héritage. 9-2 Objectifs À la fin de ce cours, vous serez capables de : Définir l'héritage Utiliser l'héritage pour.
Tout savoir sur la synchronisation des mails, contacts et calendrier sur Windows Phone Lire cette présentation en mode plein écran.
LA GESTION COLLABORATIVE DE PROJETS Grâce aux outils du Web /03/2011 Académie de Créteil - Nadine DUDRAGNE 1.
JEE 5 F.Pfister 2 institut eerie JEE – Une plateforme serveur  Développement et exécution d'applications réparties.
‘‘Open Data base Connectivity‘‘
BOUSQUET Alexis - GUILLEMIN Vincent - PETIT Cédric
ECOLE DES HAUTES ETUDES COMMERCIALES MARKETING FONDAMENTAL
Projet NavInc Florian Bastien Fabien Cornic Antoine Després
CALENDRIER-PLAYBOY 2020.
Guide de paramétrage RRDI pour CLM v3
Centre d’échange d’informations sur la Convention sur la Diversité Biologique Bienvenue dans le cours sur l’ajout d’une page web sur un site web développé.
Projet de stage d’année IIR4 sous le thème:
1 New Version Acquisition d’images Traitement d’images Interprétation clinique Chaîne de traitement Dev. logiciel creaTools 5 GDCMcreaImageIOcreaMaracasVisu.
Exploration de la programmation android Formation Assurer par: Club FreeWays Réalisé par: BOUHJJA Lamia.
KIWAPP IS A B2B FULL-STACK APP-MANAGEMENT TOOL KIWAPP EN QUELQUES ETAPES Octobre 2014.
Projet SwitcHome Cahier des charges techniques Adeline COUPE, Hélène DRAUX, Ismaïla GIROUX, Loïc TACHET.
Cours n°4M2. ESCE (S. Sidhom) Séminaire ( 6-12 Février 2007 ) Promo. M2 ESCE-Tunis 2006/07 Conception d’un système d'information sur Internet Architecture.
La formation des maîtres et la manifestation de la compétence professionnelle à intégrer les technologies de l'information et des communications (TIC)
Android ListView, ListActivity une introduction
22 Visual Studio Tools et Office 2010 Thomas LEBRUN Architecte Access It Sebastien BOVO Application Dev Consultant Microsoft France
AngularJS.
Android UIThread, Thread, Handler et AsyncTask
11/04/ L'héritage Cours 7 Cours 7.
Réalisé par : Mr IRZIM Hédi Mr JRAD Firas
Service_Receiver 1 Android les Services, Receiver et processus Notes de cours jean-michel Douin, douin au cnam point fr version : 27 Mai 2014.
jean-michel Douin, douin au cnam point fr
Android: Introduction, présentation
BlueJ_III 1 Java, les objets : tout de suite ! Interaction entre objets Notes de cours associées au chapitre 3 tutorial BlueJ
ListActivity_Wifi 1 Android: ListActivity et connexions en Wifi. Le nécessaire pour la réalisation d’un premier TP Notes de cours jean-michel Douin, douin.
Android_Introduction 1 Android: Introduction, présentation Notes de cours jean-michel Douin, douin au cnam point fr version : 24 septembre 2015.
Transcription de la présentation:

Receiver, CGM et + 1 Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction Notes de cours jean-michel Douin, douin au cnam point fr version : 8 Décembre 2014

Receiver, CGM et + 2 Sommaire Le socle, les fondements –Le patron publish-subscribe L’entité Android de base : Receiver –Publication sendBroadcast(Intent i), sendOrderedBroadcast –Souscription onReceive, (BroadcastReceiver) –Exemples: Abonnement à un évènement –Batterie, réception de SMS Abonnement à une alarme –Service déjà installé sur le mobile GCM, Google Cloud Messaging –Google/Cloud s’occupe de tout Compte gmail dédié Abonnement de plusieurs mobiles Librairies, BroadcastReceiver et service, prêts à l’emploi –Ce qui reste à faire: Une classe dérivée, 4 redéfinitions de méthodes et c’est tout Une architecture logicielle possible, pour discussions

Receiver, CGM et + 3 Principale bibliographie Le tutorial indispensable – Avant il y avait c2dm –Vogella – –

Receiver, CGM et + 4 Les fondements Le patron publish/subscribe –Publication à l’occurrence d’un évènement –Un sms entrant, la batterie déchargée, … –Un évènement engendré par l’utilisateur –Souscription à un évènement –Agir en conséquence –Un médiateur se charge De la réception des évènements, de leur filtrage De la diffusion auprès des souscripteurs sélectionnés –Diffusion aléatoire ou ordonnée

Receiver, CGM et + 5 Publish-Subscribe,cf NSY102 source:

Receiver, CGM et + 6 Publish-subscribe/ pull-push Les news d’internet, ou le forum de jfod … –Enregistrement d’un « client » à un sujet de discussion, –Un des « clients » décide de poster un message, –Les utilisateurs à leur initiative vont chercher l’information, –Publish-subscribe, mode pull Les listes de diffusion, logiciels de causerie, (« chat ») –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, –Publish-subscribe, mode push

Receiver, CGM et + 7 Un exemple, mode push

Receiver, CGM et + 8 En Java/ notation UML/BlueJ

Receiver, CGM et + 9 Android et le patron Publish/Subscribe Une application Android peut : –Souscrire à un thème de publication, réception de SMS, niveau de batterie, … –Publier un évènement une alarme à son échéance, un évènement interne à l’application, … –Google Cloud Messaging une API prête à l’emploi plusieurs mobiles peuvent souscrire et être notifiés « Over the Air »

Receiver, CGM et + 10 Android/Publish-Subscribe : les bases Source : souscription publication

Receiver, CGM et + 11 Publish-Subscribe/Intent & Context Context X,Y Intent BroadcastReceiver

Receiver, CGM et + 12 Souscription : schéma de programme Basée sur les –Intent (Topic), –Context (Mediator), –BroadcastReceiver (Subscriber). import android.content.Intent; import android.content.Context; import android.content.BroadcastReceiver; import android.util.Log; public class ReceiverTemplate extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Log.i(TAG, "onReceive action: "+intent.getAction() ); }

Receiver, CGM et + 13 Souscription effective Déclarative, AndroidManifest.xml –Au sein d’une application Par programme –getApplicationContext().registerReceiver( new ReceiverTemplate(), new IntentFilter(Intent.SMS_RECEIVED_ACTION));

Receiver, CGM et + 14 Par programme Cf. le cycle de vie d’une activité onResume –registerReceiver( … onPause –unregisterReceiver( …

Receiver, CGM et + 15 Les acteurs classe Context, le Mediator – classe BroadcastReceiver, le Subscriber – classe Intent + IntentFilter, X,Y les thèmes – À suivre: 3 exemples avec le système Android 1.Le niveau de la batterie vient d’être réactualisé, 2.Un sms vient d’arriver, 3.Un évènement de l’utilisateur.

Receiver, CGM et + 16 Exemple 1 : la batterie a changé d’état public class LowBatteryActivity extends Activity { private BroadcastReceiver receiver; public void onCreate(Bundle savedInstanceState) { …} public void onResume() { IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED); this.receiver = new BatteryChangedReceiver(); // Souscription registerReceiver(this.receiver, filter ); } public void onPause() { // Dé-souscription unregisterReceiver(this.receiver); }

Receiver, CGM et + 17 Le souscripteur // le Souscripteur private static class BatteryChangedReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { Toast.makeText(context, "battery changed", Toast.LENGTH_SHORT).show(); Log.d(TAG, "onReceive action: "+intent.getAction() ); }

Receiver, CGM et + 18 La publication par Android ressemblerait à android.os.BatteryManager Intent broadcastIntent = new Intent(); broadcastIntent.setAction( " ACTION_BATTERY_CHANGED " ); broadcastIntent.putExtra( " level ", 3567); // // // context.sendBroadcast(broadcastIntent);

Receiver, CGM et + 19 Exemple 2 : réception d’un SMS // le souscripteur public class SMSReceiver extends public void onReceive(Context context, Intent intent) { Toast.makeText(context, "sms received", Toast.LENGTH_SHORT).show(); }

Receiver, CGM et + 20 Configuration du souscripteur, // AndroidManifest.xml // La souscription Souscription effectuée (appel implicite de registerReceiver) au chargement de l’application (unregisterReceiver lorsque l’application est détruite)

Receiver, CGM et + 21 Exemple 3: « un évènement utilisateur » Ajout, retrait d’un « contrôleur » cf. public void onResume(){ super.onResume(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Controller.ACTION); registerReceiver(this.controller, public void onPause(){ super.onPause(); unregisterReceiver(this.controller); Avec Controller.ACTION public static final String ACTION = "fr.cnam.list.ITEMS";

Receiver, CGM et + 22 La classe « Controller », ici gestion d’une liste Le contrôleur agit sur le modèle, ici une liste (classe Items) public class ItemsController extends BroadcastReceiver { public static final String ACTION = "fr.cnam.list.ITEMS"; public static final String ADD = "add"; // valeurs public static final String REMOVE = "remove"; private Items items; // le modèle private Context context; // Android framework public ItemsController(Context context, final Items items){ this.context = context; this.items = items; // le modèle public void onReceive(final Context context, final Intent intent) { String operation = intent.getStringExtra(OPERATION_KEY); if(operation.equals(ADD)) items.ajouter(intent.getStringExtra(DATA_KEY)); else if(operation.equals(REMOVE)) items.retirer(Integer.parseInt(intent.getStringExtra(DATA_KEY))); }

Receiver, CGM et + 23 Démonstration Un des trois exemples Le contrôleur Optionnels: Intent.ACTION_BATTERY_CHANGED android.intent.action.SMS_RECEIVED_ACTION

Receiver, CGM et + 24 Autre façon de souscrire PendingIntent Intent à effet immédiat PendingIntent à effet retardé –Destiné à un tiers A destination d’un service existant –AlarmManager, NotificationManager … Souscription auprès du service –Exécution de l’intent passé en paramètre, à l’aide d’un PendingIntent

Receiver, CGM et + 25 Souscription auprès d’un service existant Intent intent = new Intent(this, ReceiverTemplate.class); PendingIntent appIntent = PendingIntent.getBroadcast(this, 0, intent, 0); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(System.currentTimeMillis()); calendar.add(Calendar.SECOND, 3); AlarmManager am = (AlarmManager)getSystemService(ALARM_SERVICE); am.set(AlarmManager.RTC, calendar.getTimeInMillis(), appIntent); // sendBroadcast( intent) par le service d’alarme

Receiver, CGM et + 26 Variante de l’écriture précédente PendingIntent appIntent = PendingIntent.getBroadcast (this, 0, new Intent(), 0); Calendar calendar = Calendar.getInstance(); // idem diapositive précédente am.set(AlarmManager.RTC, calendar.getTimeInMillis(), appIntent); // Ce sont les receveurs déclarés dans AndroidManifest.xml // qui seront déclenchés, (méthode onReceive) // puis sendBroadcast( intent) par le service d’alarme

Receiver, CGM et + 27 Notification Souvent associée à la réception d’un évènement –Déclenchée par le souscripteur Un « Receiver », un service, … –Exemple: Une notification à la réception d’un message sms »telnet localhost 5554 »send 1234 SMS test message

Receiver, CGM et + 28 Notification : affichage private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); Intent intent = // page suivante notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); }

Receiver, CGM et + 29 Autre exemple : une notification Au clic sur la notification une application est déclenchée private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); Intent notificationIntent = new Intent(context,GCMClientActivity.class); // afin que l’intent retardée démarre une nouvelle activité notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent, 0); notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); } Source:

Receiver, CGM et + 30 Autre usage : une notification, sans effet au clic Au clic sur la notification rien ne se passe private static void generateNotification(Context context, String message) { long when = System.currentTimeMillis(); NotificationManager notificationManager = null; notificationManager(NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); Notification notification = new Notification(R.drawable.ic_launcher,message, when); String title = context.getString(R.string.app_name); PendingIntent intent = PendingIntent.getActivity(context, 0, null, 0); notification.setLatestEventInfo(context, title, message, intent); notification.flags |= Notification.FLAG_AUTO_CANCEL; notificationManager.notify(0, notification); } Source:

Receiver, CGM et + 31 Démonstration

Receiver, CGM et + 32 GCM Google Cloud Messaging –Anciennement c2dm, Cloud to Delivering Message >= Android 2.2 Message <= 4ko Trafic illimité –Nécessite une inscription auprès de Google Avec de préférence un compte gmail que l’on dédiera à cet usage

Receiver, CGM et + 33 Architecture : Objectifs Un client, tout système connecté –S’adresse au serveur Google qui se chargera de publier auprès des mobiles Mobiles ayant préalablement souscrits Mise en œuvre : une librairie toute prête, un appel de méthode suffit

Receiver, CGM et + 34 Architecture : Mise en œuvre, inscription Chaque participant –Doit avoir un compte google gmail –S’inscrit auprès de GCM, en retour un identifiant lui est attribué Un serveur mémorise, l’identifiant retourné par GCM –Un serveur au protocole HTTP de préférence –Ces serveur contient les abonnés 1)inscription 2)identifiant 3) dépôt de l’identifiant GCM

Receiver, CGM et + 35 Architecture : Mise en œuvre, inscriptions Le serveur contient une liste des identifiants Un identifiant par application –Application : un service sous Android Exemple : Une liste d’identifiants accessible depuis le web id1 id2 id3 …

Receiver, CGM et + 36 Architecture : Mise en œuvre, publications Publication par tout système connecté 1,2) Obtention de la liste des identifiants, des abonnés 3) Envoi de cette liste au serveur Google/GCM accompagnée du message à transmettre GCM se charge de publier le message, de le ré-émettre, de le conserver … 2) [id1, id2, id3, ……] 1) Demande de la liste 3) Demande de publication [id1, id2, id3, ……] + message id1 message id2 id3

Receiver, CGM et + 37 Architecture : publications Chaque mobile de la liste [id1, id2, id3, ……] est notifié –C’est un « Receiver » prêt à l’emploi qui est déclenché sur chaque mobile –Un service prêt à l’emploi est créé afin de prendre en compte cette notification Une de ses méthodes est appelée (onMessage) id1 message id2 id3

Receiver, CGM et + 38 Le tutorial que l’on se doit de lire

Receiver, CGM et + 39 Comment ? Création d’un projet auprès des serveurs Google En retour : un numéro_de_projet (ProjectId) Une API key est nécessaire 1.Exemple ProjectId: , API_KEY: AIzaSyC60sIgG-fB3JSW47X2zGrOqJHGzV1jh0g 1.Un mobile s’inscrit auprès du serveur Google (ProjectId) 1.En retour un jeton d’identification lui est attribué Chaque participant doit posséder un compte gmail 2.Cet identifiant est déposé sur un serveur, qui est connu de tous les participants 2.Envoi d’un message aux participants(API_KEY) 1.Obtention de la liste des identifiants auprès du serveur 2.Publication du message Librairies toutes prêtes

Receiver, CGM et + 40 Création du projet API_Key ProjectId

Receiver, CGM et + 41 Inscription, mise en oeuvre Depuis une activity –1) Inscription auprès du cloud GCMRegistrar.register(this, " "); –GCMRegistrar, une classe toute prête –Démarrage du service… –Attente asynchrone de la réponse de GCM 1)inscription 2)identifiant 3) dépôt de l’identifiant GCM

Receiver, CGM et + 42 Le service hérite d’une classe toute prête 4 méthodes à redéfinir, public class GCMIntentService extends GCMBaseIntentService { –Méthode déclenchée à la suite de la demande d’inscription au GCM –2) onRegistered(Context context, String identifiant) 3) Dépôt de l’identifiant sur un serveur –onMessage(Context context, Intent intent ) –onError …. –onUnregistered 1)inscription 2)identifiant 3) dépôt de l’identifiant GCM

Receiver, CGM et + 43 Liste des indentifiants Service web, servlette, php – 1)inscription 2)identifiant 3) dépôt de l’identifiant GCM id1 id2 id3 … id1 id2 id3 …

Receiver, CGM et + 44 Publication Envoi de la liste des identifiants au GCM + un message + API_KEY Et se charge de tout id1 message id3 id1 id2 id3 … API_KEY + Message + id1 message id2 id3

Receiver, CGM et + 45 Librairie toute prête \android-sdk\extras\google\gcm\gcm-client\dist\ –gcm.jar Souscription, abonnement –Un service qu’il suffit de dériver public class GCMIntentService extends GCMBaseIntentService { Réception d’un message : un Receiver + un service –Un Receiver prêt à l’emploi –Une classe GCMIntentBaseService qu’il suffit de dériver

Receiver, CGM et + 46 Démonstration, Obtention du jeton GCMRegistrar: Classe interface avec le service GCM ProjectId: GCMRegistrar.getRegistrationId(this, " "); Une demande est faite auprès de Google 2. onRegistered(Context context, String regId) –En retour cette méthode du service est déclenchée Un exemple d’identifiant reçu par le mobile: APA91bGy- GWQqqrgyFc652jghpTPygBsKyDHNFPWqzJDCMvtcIx7rtVecmxAYkDItfgztJcEJhyA Rnx0fmmp6FtqrFKNXqftmGXhRIGM5eObyLY67YkT_Aez3RJeOZFVkOpjv- _FRNASI0ZJL6VQk95Y925MQ9Wihw

Receiver, CGM et + 47 Souscription suite Souscription du mobile –Permissions –Le receveur, un extrait de AndroiManifest.xml –<receiver android:name=".C2DMRegistrationReceiver" android:permission="com.google.android.c2dm.permission.SEND" >

Receiver, CGM et + 48 Le service public class GCMIntentService extends GCMBaseIntentService –onRegistered(Context context, String regId) Déclenchée par le Receiver pré-installé à la suite de l’abonnement –Mémorisation de regId –onMessage(Context context, Intent intent ) Déclenchée par le Receiver pré-installé à la suite de la réception d’un message –String msg = intent.get( "message");

Receiver, CGM et + 49 Publication : le message Par tout système connecté, \android-sdk-new\extras\google\gcm\gcm-server\dist\ –gcm-server.jar Sender sender = new Sender(API_KEY); String msg = "un message"; Message message = new Message.Builder() //.collapseKey("1").timeToLive(60*60*24) // 24 heures //.timeToLive(0) // maintenant ou jamais.delayWhileIdle(true).addData("message",msg).build();

Receiver, CGM et + 50 Publication : Envoi de message Publication d’un message –Send devices : une liste de regId –MulticastResult result = sender.send(message, devices, 5); // 5 essais en cas d’indisponibilité des serveurs google –Ensuite le cloud s’occupe de tout …

Receiver, CGM et + 51 Une architecture possible, publication De type MVC … un essai pour discussions –Rappels: Hypothèse –Un receveur et un service prêts à l’emploi »Ce service est appelé à chaque publication par le cloud »onMessage, onRegistered, onUnregistered, onError –A chaque réception d’un message, envoi de celui-ci vers le receveur concerné Un champ du message contient l’ACTION à déclencher … Les receveurs peuvent être locaux à une activité, un service … publishonMessage(…) receveurs

Receiver, CGM et + 52 Réalisation, onMessage Émis directement au receveur concerné –intentToAnControler(intentFromCloud.getStringExtra(OPERATION_KEY));

Receiver, CGM et + 53 Réalisation, une variante onMessage Un contrôleur dédié au cloud est installé Il est chargé de générer un journal, d’effectuer des statistiques, de contrôler… publishonMessage(…) Receveur dédié au cloud Receveur associé à l’ACTION

Receiver, CGM et + 54 Publication, le contrôleur dédié au cloud pourrait s’en charger… Publication vers le GCM via le contrôleur PUBLISH ACTION Receveur dédié au cloud publish

Receiver, CGM et + 55 Une Application Une liste partagée

Receiver, CGM et + 56 Architecture MVC, rappel Application: –Une liste d’item : le modèle, du java standard, portable –ListView + ListActivity : la Vue –Un Receiver : le Contrôleur

Receiver, CGM et + 57 Android Les outils nécessaires Intent IntentFilter BroadcastReceiver –registerReceiver

Receiver, CGM et + 58 La vue, une liste d’items Affichage Opérations –d’ajout et de suppression

Receiver, CGM et + 59 La liste d’items Items : le modèle MainActivity : la vue ItemsController : le contrôleur Items extends Observable MainActivity extends ListActivity implements Observer ItemsControler extends BroadcastReceiver MainActivity extends ListActivity implements Observer ItemsController extends BroadcastReceiver le modèle la vue le contrôleur

Receiver, CGM et + 60 La classe Items : le modèle Java J2SE portable –synchronized(this) par précaution (plusieurs contrôleurs)

Receiver, CGM et + 61 Architecture suite Items : le modèle –extends java.util.Observable MainActivity : la vue –extends android.app.ListActivity implements java.util.Observer ItemsController : le contrôleur –extends android.content.BroadcastReceiver

Receiver, CGM et + 62 Le contrôleur est un BroadcastReceiver Items extends Observable MainActivity extends ListActivity implements Observer ItemsControler extends BroadcastReceiver MainActivity extends ListActivity implements Observer ItemsController extends BroadcastReceiver sendBroadcast A chaque Click  sendBroadcast Intent intent = new Intent(); intent.setAction(ItemsController.ACTION); … sendBroadcast(

Receiver, CGM et + 63 Action de l’utilisateur, gérée par le contrôleur sendBroadcast MainActivity extends ListActivity implements Observer ItemsControler extends BroadcastReceiver MainActivity extends ListActivity implements Observer ItemsController extends BroadcastReceiver sendBroadcast

Receiver, CGM et + 64 ItemsController A chaque « clic » la méthode onReceive est exécutée abortBroadcast(); si non cumul du comportement

Receiver, CGM et + 65 Contrôleur -> Modèle Appel de la méthode ajouter du modèle Items extends Observable ItemsControler extends BroadcastReceiver ItemsController extends BroadcastReceiver

Receiver, CGM et + 66 Modèle -> Vue La méthode update est déclenchée au sein de l’activité Items extends Observable MainActivity extends ListActivity implements Observer

Receiver, CGM et + 67 La Vue 1 /4 initialisation onCreate de l’activité –Création du modèle et du contrôleur

Receiver, CGM et + 68 La Vue 2 /4 enregistrement du contrôleur onResume de l’activité (ou onCreate, dépend de l’application) –enregistrement du contrôleur onPause (ou onDestroy)

Receiver, CGM et + 69 La Vue 3 /4 A chaque clic ! onClickAjouter

Receiver, CGM et + 70 La Vue 4 /4 update update appelée par le modèle –(extends Observable) –La vue est un observateur( implements java.util.Observer)

Receiver, CGM et + 71 CloudController Généralisation, discussions

Receiver, CGM et + 72 MVC MVC respecté Couplage faible conservé Au sein de la même application Items extends Observable MainActivity extends ListActivity implements Observer MainActivity extends ListActivity implements Observer ItemsController extends BroadcastReceiver CloudController AnotherActivity extends Activity implements Observer web, cloud ItemsController extends BroadcastReceiver

Receiver, CGM et + 73 Généralisation Le champ Action sélectionne le contrôleur ad’hoc MVC respecté Couplage faible conservé Items extends Observable MainActivity extends ListActivity implements Observer MainActivity extends ListActivity implements Observer ItemsController extends BroadcastReceiver GenericController AnotherActivity extends Activity implements Observer web, cloud

Receiver, CGM et + 74 GenericController L’ACTION_KEY est redirigée vers le « bon » contrôleur Discussion ItemsController extends BroadcastReceiver GenericController

Receiver, CGM et + 75 Cumul du comportement Avec une sous classe de ItemsController: onReceive(Context context, Intent intent){ super.onReceive(context, intent); … ItemsController extends BroadcastReceiver ItemsControllerPlus extends ItemsController

Receiver, CGM et + 76 Démonstration

Receiver, CGM et + 77 Mise en œuvre Répertoire du projet eclipse du client souscripteur Depuis l’explorateur windows, (eclipse n’est pas démarré) créer un répertoire libs dans lequel vous copiez gcm.jar libs>copy D:\android-sdk\extras\google\gcm\gcm-client\dist\gcm.jar. Répertoire du projet eclipse du client « publieur » Depuis l’explorateur windows, (eclipse n’est pas démarré) créer un répertoire libs dans lequel vous copiez gcm-server.jar libs>copy D:\android-sdk\extras\google\gcm\gcm-server\dist\gcm-server.jar.. Si bluej, installez gcm-server.jar dans le répertoire +libs A l’exécution json est requis D:\android-sdk\extras\google\gcm\gcm-server\lib\ json_simple-1.1.jar

Receiver, CGM et + 78 Conclusion Simple Push/polling (voir en annexe) … Indispensable Note: Sous eclipse dans le projet créez un dossier libs –Dans lequel sont copiés : gcm.jar pour souscrire gcm-server.jar et json-simple-1.1.jar pour publier

Receiver, CGM et + 79 Annexe consommation en « polling »