Android Publish/Subscribe, GCM, Google Cloud Messaging : une introduction



Documents pareils
Android et le Cloud Computing

SOMMAIRE

Projet Android (LI260) Cours 2

Outils, langage et approche Android Une introduction. Nicolas Stouls lyon.fr

Messagerie asynchrone et Services Web

Warren PAULUS. Android SDK et Android x86

TP au menu «UI ANDROID»

1. Base de données SQLite

Les connexions sans fil avec Android. JMF (Tous droits réservés) 1

Android 4 Les fondamentaux du développement d'applications Java

Education Delivery Intelligent Tool

1.3 Gestion d'une application

Utilisation de GCM (Google Cloud Messaging) pour Android. Partie préliminaire éventuelle : Création d'un AVD lisant GCM

TP2 : Client d une BDD SqlServer

Tutorial pour une application simple

- TP Programmation Android - NFA024 Conservatoire National des Arts et Métiers

Programmation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer

TP SIN Programmation sur androïde Support : eclipse

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Web Tier : déploiement de servlets

Android. Présentation d Android. Florent Garin

Créer des applications Android

Programmation mobile avec Android

Bases Java - Eclipse / Netbeans

TD/TP 1 Introduction au SDK d Android

Android UIThread, Thread, Handler et AsyncTask

Les fondamentaux du développement d applications Java

DÉVELOPPEMENT ANDROID

OCLOUD BACKUP GUIDE DE REFERENCE POUR ANDROID

TEPZZ 6Z85Z5A T EP A2 (19) (11) EP A2 (12) DEMANDE DE BREVET EUROPEEN

Apache Camel. Entreprise Integration Patterns. Raphaël Delaporte BreizhJUG

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Master Informatique et Systèmes. Architecture des Systèmes d Information. 03 Architecture Logicielle et Technique

Jean-Philippe Paquette

PROJET : ETNIC ESB JANUS. Guide technique : WS-Notification - Clustering. BULL Services et Solutions

Projet gestion d'objets dupliqués

API04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture

Remote Method Invocation (RMI)

Architecture Orientée Service, JSON et API REST

Approche Contract First

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

La base de données XML exist. A. Belaïd

Environnements de développement (intégrés)

JADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.

Premiers Pas en Programmation Objet : les Classes et les Objets

Journée IJD. Moussa Tari Bako Bachir. 25 juin 2012 ARLES/INRIA. Introduction Travail Chez ARLES

Cours Plugin Eclipse. Université Paris VI / Parcours STL / Master I Pierre-Arnaud Marcelot - Iktek - pamarcelot@iktek.com

Projet. But: consultation en temps réel d événements (cours de bourse, trafic d envoi SMS ) sur des téléphones portables. Serveur de diffusion

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Alfstore workflow framework Spécification technique

Page 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Terminaux Mobiles Communicants

Remote Method Invocation Les classes implémentant Serializable

Intégration de systèmes

MailCube MC 2. 2,5 jours / homme / an. 33 milliards de kwh. 17 millions de. 3,1 millions de. nouvelle génération. Le spam en quelques chiffres :

Corrigé de l'atelier pratique du module 8 : Implémentation de la réplication

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Développement sous Android

Patrons de Conception (Design Patterns)

Solution de fax en mode Cloud

Installation de Premium-RH

Android en action. Abdelkader Lahmadi Université de Lorraine

S T L - C P S - L e s p l u g i n s E c l i p s e. - Une Introduction , Frédéric Peschanski

INSTALLATION DES SERVICES DE DOMAINE ACTIVE DIRECTORY Windows Server 2008 R2

Point sur les solutions de développement d apps pour les périphériques mobiles

A. Architecture du serveur Tomcat 6

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Module 10 : Supplément 2

Programmation par les Objets en Java

SIMPLIFIEZ-VOUS LE FAX GRÂCE AU CLOUD

Le hub d entreprise est une application de déploiement des applications mais aussi un outil de communication

Développement tablette Android. SophiaConf2011 Par Arnaud FARINE

TP WEBSERVICES. 1 Pré-requis. 1.1 L environnement de développement. 1.2 Les librairies nécessaires 1.3 SOAPUI

Guide Utilisateur Transnet

Une passerelle SMS comme périphérique SynoZwave, et un monitoring de votre infrastructure

Datalift. + + Architecture Modularité Déploiements. d j = 09/04/2015 Laurent BIHANIC

Projet de programmation (IK3) : TP n 1 Correction

Programmation Mobile Android Master CCI

Développement Android. J.-F. Couchot

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Guide de mise à jour BiBOARD

Installation et prise en main

MailStore Server 7 Caractéristiques techniques

Modèle de cahier des charges pour un appel d offres relatif à une solution de gestion des processus métier (BPM)

CalDav Manager : Gestionnaire d emploi du temps

Manipulation 4 : Application de «Change».

Devenez un véritable développeur web en 3 mois!

Applications distribuées: le retour du client "riche"

4. Groupement d objets

Mes documents Sauvegardés

INTRODUCTION AUX TESTS DE PERFORMANCE ET DE CHARGE

Créer et partager des fichiers

ContactOffice. La Messagerie collaborative pour l'éducation. Assises 2015 du CSIESR Avignon

CTIconnect PRO. Guide Rapide

RMI le langage Java XII-1 JMF

Introduction aux applications réparties

NON URGENTE TEMPORAIRE DEFINITIVE. OBJET : FONCTIONNEMENT OmniVista 4760 SUR UN RÉSEAU VPN / NAT

Transcription:

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

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 2

Principale bibliographie Le tutorial indispensable http://developer.android.com/google/gcm/index.html Avant il y avait c2dm Vogella http://www.vogella.com/articles/androidcloudtodevicemessaging/article.html http://blog.octo.com/notifications-push-android-c2dm/ https://github.com/joemoore/c2demo 3

Le patron publish/subscribe Les fondements 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 4

Publish-Subscribe,cf NSY102 source: http://www2.lifl.fr/icar/chapters/intro/intro.html 5

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 6

Un exemple, mode push p1 : Publisher mediator : Mediator s1 : Subscriber publish(p1,meteo,"sun") publish(p1,meteo,"rain") p2 : Publisher publish(p2,sensor,"25 ") addsubscriber(s1,meteo) update(p1,meteo,"sun") update(p1,meteo,"rain") s2 : Subscriber publish(p1,meteo,"sun") publish(p2,sensor,"27 ") publish(p1,meteo,"sun") addsubscriber(s2,sensor) update(p1,meteo,"sun") addsubscriber(s2,meteo) update(p2,sensor,"27 ") update(p1,meteo,"sun") update(p1,meteo,"sun") 7

En Java/ notation UML/BlueJ 8

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» 9

Android/Publish-Subscribe : les bases souscription publication Source : http://marakana.com/s/architecting_android_apps,1178/index.html 10

Publish-Subscribe/Intent & Context Context BroadcastReceiver X,Y Intent http://www2.lifl.fr/icar/chapters/intro/intro.html 11

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() ); } } 12

Souscription effective Déclarative, AndroidManifest.xml Au sein d une application <receiver android:name=".receivertemplate"> <intent-filter> <action android:name=" android.intent.action.sms_received_action " /> </intent-filter> </receiver> Par programme getapplicationcontext().registerreceiver( new ReceiverTemplate(), new IntentFilter(Intent.SMS_RECEIVED_ACTION)); 13

Par programme Cf. le cycle de vie d une activité onresume registerreceiver( onpause unregisterreceiver( 14

Les acteurs classe Context, le Mediator http://developer.android.com/reference/android/content/context.html classe BroadcastReceiver, le Subscriber http://developer.android.com/reference/android/content/broadcastreceiver.html classe Intent + IntentFilter, X,Y les thèmes http://developer.android.com/reference/android/content/intent.html À 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. 15

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); } 16

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() ); } } } http://developer.android.com/training/monitoring-device-state/battery-monitoring.html 17

La publication par Android ressemblerait à android.os.batterymanager Intent broadcastintent = new Intent(); broadcastintent.setaction("action_battery_changed"); broadcastintent.putextra("level", 3567); // // http://developer.android.com/reference/android/os/batterymanager.html // context.sendbroadcast(broadcastintent); 18

Exemple 2 : réception d un SMS // le souscripteur public class SMSReceiver extends BroadcastReceiver{ @Override public void onreceive(context context, Intent intent) { Toast.makeText(context, "sms received", Toast.LENGTH_SHORT).show(); } } 19

Configuration du souscripteur, <receiver /> // AndroidManifest.xml // La souscription <receiver android:name=".smsreceiver"> <intent-filter> <action android:name="android.intent.action.sms_received_action"/> </intent-filter> </receiver> Souscription effectuée (appel implicite de registerreceiver) au chargement de l application (unregisterreceiver lorsque l application est détruite) 20

Exemple 3: «un évènement utilisateur» Ajout, retrait d un «contrôleur» cf. MVC @Override public void onresume(){ super.onresume(); IntentFilter intentfilter = new IntentFilter(); intentfilter.addaction(controller.action); registerreceiver(this.controller, intentfilter); @Override public void onpause(){ super.onpause(); unregisterreceiver(this.controller); Avec Controller.ACTION public static final String ACTION = "fr.cnam.list.items"; 21

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 public static final String REMOVE = "add"; // valeurs = "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 } } @Override 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))); } 22

Démonstration Un des trois exemples Le contrôleur Optionnels: Intent.ACTION_BATTERY_CHANGED android.intent.action.sms_received_action 23

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 24

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 25

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 26

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 27

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); } 28

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: http://android.amolgupta.in/2012/07/google-cloud-messaging-gcm-tutorial.html 29

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: http://android.amolgupta.in/2012/07/google-cloud-messaging-gcm-tutorial.html 30

Démonstration 31

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 32

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 33

Architecture : Mise en œuvre, inscription 1)inscription 2)identifiant GCM 3) dépôt de l identifiant 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 34

Architecture : Mise en œuvre, inscriptions id1 id2 id3 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 http://jfod.cnam.fr/registration/demo/?cmd=tostring 35

Architecture : Mise en œuvre, publications 1) Demande de la liste 2) [id1, id2, id3, ] 3) Demande de publication [id1, id2, id3, ] + message message id1 message id2 message id3 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 36

Architecture : publications message id1 message id2 message id3 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) 37

Le tutorial que l on se doit de lire http://developer.android.com/google/gcm/index.html https://cloud.google.com/console 38

Comment? Création d un projet auprès des serveurs Google 1. https://code.google.com/apis/console 2. En retour : un numéro_de_projet (ProjectId) 1. https://code.google.com/apis/console/#project:numéro_de_projet 3. Une API key est nécessaire 1. Exemple ProjectId:138387916323, 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 39

Création du projet ProjectId API_Key https://code.google.com/apis/console/#project:138387916323 40

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

Le service hérite d une classe toute prête 1)inscription GCM 4 méthodes à redéfinir, public class GCMIntentService extends GCMBaseIntentService { 2)identifiant 3) dépôt de l identifiant 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 42

Liste des indentifiants id1 id2 id3 1)inscription GCM 2)identifiant 3) dépôt de l identifiant Service web, servlette, php http://jfod.cnam.fr/registration/demo/?cmd=tostring 43

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

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 45

Démonstration, Obtention du jeton GCMRegistrar: Classe interface avec le service GCM ProjectId: 138387916323 1. GCMRegistrar.getRegistrationId(this, "138387916323"); 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 46

Souscription suite Souscription du mobile Permissions <uses-permission android:name="com.google.android.c2dm.permission.registration" /> <uses-permission android:name="android.permission.internet" /> Le receveur, un extrait de AndroiManifest.xml <receiver android:name=".c2dmregistrationreceiver" android:permission="com.google.android.c2dm.permission.send" > <intent-filter > <action android:name="com.google.android.c2dm.intent.registration" > </action> </intent-filter> </receiver> 47

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"); 48

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(); 49

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 50

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 publish onmessage( ) receveurs 51

Réalisation, onmessage Émis directement au receveur concerné intenttoancontroler(intentfromcloud.getstringextra(operation_key)); 52

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 Receveur dédié au cloud publish onmessage( ) Receveur associé à l ACTION 53

Publication, le contrôleur dédié au cloud pourrait s en charger Receveur dédié au cloud PUBLISH ACTION publish Publication vers le GCM via le contrôleur 54

Une Application Une liste partagée 55

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

Android Les outils nécessaires Intent IntentFilter BroadcastReceiver registerreceiver 57

La vue, une liste d items Affichage Opérations d ajout et de suppression 58

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

La classe Items : le modèle Java J2SE portable synchronized(this) par précaution (plusieurs contrôleurs) 60

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 61

Le contrôleur est un BroadcastReceiver Items extends Observable MainActivity extends ListActivity implements Observer sendbroadcast ItemsControler ItemsController extends BroadcastReceiver A chaque Click sendbroadcast Intent intent = new Intent(); intent.setaction(itemscontroller.action); sendbroadcast( 62

Action de l utilisateur, gérée par le contrôleur MainActivity extends ListActivity implements Observer sendbroadcast ItemsControler ItemsController extends BroadcastReceiver sendbroadcast 63

ItemsController A chaque «clic» la méthode onreceive est exécutée abortbroadcast(); si non cumul du comportement 64

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

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

La Vue 1/4 initialisation oncreate de l activité Création du modèle et du contrôleur 67

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) 68

La Vue 3/4 A chaque clic! onclickajouter 69

La Vue 4/4 update update appelée par le modèle (extends Observable) La vue est un observateur( implements java.util.observer) 70

CloudController Généralisation, discussions 71

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

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

GenericController GenericController ItemsController extends BroadcastReceiver L ACTION_KEY est redirigée vers le «bon» contrôleur Discussion 74

Cumul du comportement ItemsController extends BroadcastReceiver ItemsControllerPlus extends ItemsController Avec une sous classe de ItemsController: ItemsControllerPlus @Override onreceive(context context, Intent intent){ super.onreceive(context, intent); 75

Démonstration Démonstration 76

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 77

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 78

Annexe consommation en «polling» 79