Android Publish/Subscribe, GCM, GoogleCloud …jfod.cnam.fr/SMB116/Android_GCM.pdf · •...

79
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

Transcript of Android Publish/Subscribe, GCM, GoogleCloud …jfod.cnam.fr/SMB116/Android_GCM.pdf · •...

Receiver, CGM et +1

AndroidPublish/Subscribe,

GCM, Google Cloud Messaging : une introduction

Notes de cours

jean-michel Douin, douin au cnam point frversion : 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 discussion s

Receiver, CGM et +3

Principale bibliographie

• Le tutorial indispensable– http://developer.android.com/google/gcm/index.html

• Avant il y avait c2dm– Vogella

• http://www.vogella.com/articles/AndroidCloudToDevic eMessaging/article.html

– http://blog.octo.com/notifications-push-android-c2dm/– https://github.com/joemoore/c2demo

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: http://www2.lifl.fr/icar/Chapters/Intro/intro.html

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

mediator : Mediatorp1 : Publishers1 : Subscriber

s2 : Subscriberp2 : Publisher

addSubscriber(s1,meteo)

publish(p1,meteo,"sun")

update(p1,meteo,"sun")

addSubscriber(s2,sensor)

publish(p2,sensor,"25°")

update(p1,meteo,"rain")

publish(p1,meteo,"rain")

publish(p1,meteo,"sun")

update(p1,meteo,"sun")

publish(p2,sensor,"27°")

update(p2,sensor,"27°")

addSubscriber(s2,meteo)

publish(p1,meteo,"sun")

update(p1,meteo,"sun")

update(p1,meteo,"sun")

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 : http://marakana.com/s/architecting_android_apps,1178/index.html

souscription publication

Receiver, CGM et +11

Publish-Subscribe/Intent & Context

• http://www2.lifl.fr/icar/Chapters/Intro/intro.html

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

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

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– http://developer.android.com/reference/android/cont ent/Context.html

• classe BroadcastReceiver, le Subscriber– http://developer.android.com/reference/android/cont ent/BroadcastReceiver.html

• classe Intent + IntentFilter, X,Y les thèmes– http://developer.android.com/reference/android/cont ent/Intent.html

• À suivre: 3 exemples avec le système Android1. 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é-souscriptionunregisterReceiver (this.receiver);

}

Receiver, CGM et +17

Le souscripteur

// le Souscripteurprivate 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

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

//

// http://developer.android.com/reference/android/os/BatteryManager.html

//

context.sendBroadcast( broadcastIntent);

Receiver, CGM et +19

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

}

}

Receiver, CGM et +20

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)

Receiver, CGM et +21

Exemple 3: « un évènement utilisateur »

• Ajout, retrait d’un « contrôleur » cf. MVC

@Overridepublic void onResume(){

super.onResume();IntentFilter intentFilter = new IntentFilter();intentFilter.addAction(Controller. ACTION);

registerReceiver(this.controller, intentFilter);

@Overridepublic void onPause(){

super.onPause();

unregisterReceiver(this.controller);

Avec Controller. ACTION

public static final String ACTION = "fr.cnam.list.IT EMS";

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 BroadcastReceive r {

public static final String ACTION = "fr.cnam.list.ITEMS";

public static final String ADD = "add"; // valeurspublic static final String REMOVE = "remove";

private Items items ; // le modèleprivate Context context ; // Android framework

public ItemsController(Context context, final Items items){this.context = context;this.items = items; // le modèle

}

@Overridepublic void onReceive(final Context context, final In tent 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_CHANGEDandroid.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(ALAR M_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 contex t, String message) {long when = System. currentTimeMillis();

NotificationManager notificationManager = null;

notificationManager(NotificationManager) context.getSystemService(Context. NOTIFICATION_SERVICE);

Notification notification = new Notification(R.drawa ble. ic_launcher,message, when);

String title = context.getString(R.string. app_name);

Intent intent = // page suivante

notification.setLatestEventInfo(context, title, mes sage, 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 contex t, String message) {long when = System. currentTimeMillis();

NotificationManager notificationManager = null;notificationManager(NotificationManager) context.ge tSystemService(Context. NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawa ble. 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 a ctiviténotificationIntent.setFlags(Intent.FLAG_ACTIVITY_CL EAR_TOP |

Intent.FLAG_ACTIVITY_SINGLE_TOP);

PendingIntent intent = PendingIntent.getActivity(context, 0, notificationIntent , 0);

notification.setLatestEventInfo(context, title, mes sage, intent );notification.flags |= Notification. FLAG_AUTO_CANCEL;notificationManager.notify(0, notification);}

• Source: http://android.amolgupta.in/2012/07/google-cloud-me ssaging-gcm-tutorial.html

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 contex t, String message) {long when = System. currentTimeMillis();

NotificationManager notificationManager = null;notificationManager(NotificationManager) context.ge tSystemService(Context. NOTIFICATION_SERVICE);Notification notification = new Notification(R.drawa ble. ic_launcher,message, when);

String title = context.getString(R.string. app_name);

PendingIntent intent = PendingIntent.getActivity(context, 0, null , 0);

notification.setLatestEventInfo(context, title, mes sage, intent );notification.flags |= Notification. FLAG_AUTO_CANCEL;notificationManager.notify(0, notification);}

• Source: http://android.amolgupta.in/2012/07/google-cloud-me ssaging-gcm-tutorial.html

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 publi er 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 l ui 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 depui s le web• http://jfod.cnam.fr/registration/demo/?cmd=toString

• 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 ab onnés3) Envoi de cette liste au serveur Google/GCM accom pagné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

message

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 notificati on• Une de ses méthodes est appelée (onMessage)

id1message

message

message

id2

id3

Receiver, CGM et +38

Le tutorial que l’on se doit de lire

• http://developer.android.com/google/gcm/index.html• https://cloud.google.com/console

Receiver, CGM et +39

Comment ?

Création d’un projet auprès des serveurs Google1. https://code.google.com/apis/console2. En retour : un numéro_de_projet (ProjectId)

1. https://code.google.com/apis/console/#project:numér o_de_projet3. 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

Receiver, CGM et +40

Création du projet

• https://code.google.com /apis/console/#project:138387916323

API_Key

ProjectId

Receiver, CGM et +41

Inscription, mise en oeuvre

• 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

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 lademande 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– http://jfod.cnam.fr/registration/demo/?cmd=toString

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 mess age + API_KEY• Et se charge de tout

id1message

message

message id3

• id1• id2• id3• …• …• …

API_KEY+

Message+ id1

message

message

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éri ver

Receiver, CGM et +46

Démonstration, Obtention du jeton

GCMRegistrar: Classe interface avec le service GCMProjectId: 1383879163231. 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-GWQqqrgyFc652jghpTPygBsKyDHNFPWqzJDCMvtcIx7rtVecmxAYkDItfgztJcEJhyARnx0fmmp6FtqrFKNXqftmGXhRIGM5eObyLY67YkT_Aez3RJeOZFVkOpjv-_FRNASI0ZJL6VQk95Y925MQ9Wihw

Receiver, CGM et +47

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>

Receiver, CGM et +48

Le service

public class GCMIntentService extends GCMBaseIntentServic e

– 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 g oogle

– 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é, u n service …

publish onMessage(…)

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…

publish onMessage(…)

Receveur dédié au cloud

Receveur associé à l’ACTION

Receiver, CGM et +54

Publication, le contrôleur dédié au cloudpourrait s’en charger…

• Publication vers le GCM via le contrôleur

PUBLISHACTION

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, por table– 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

Itemsextends Observable

MainActivityextends ListActivityimplements Observer

ItemsControlerextends BroadcastReceiver

MainActivityextends ListActivityimplements Observer

ItemsControllerextends BroadcastReceiver

• le modèle

• la vuele 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

Itemsextends Observable

MainActivityextends ListActivityimplements Observer

ItemsControlerextends BroadcastReceiver

MainActivityextends ListActivityimplements Observer

ItemsControllerextends BroadcastReceiversendBroadcast

• 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

MainActivityextends ListActivityimplements Observer

ItemsControlerextends BroadcastReceiver

MainActivityextends ListActivityimplements Observer

ItemsControllerextends BroadcastReceiversendBroadcast

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

Itemsextends Observable

ItemsControlerextends BroadcastReceiverItemsControllerextends BroadcastReceiver

Receiver, CGM et +66

Modèle -> Vue

• La méthode update est déclenchée au sein de l’activité

Itemsextends Observable

MainActivityextends ListActivityimplements 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.Obse rver)

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

Itemsextends Observable

MainActivityextends ListActivityimplements Observer

MainActivityextends ListActivityimplements Observer

ItemsControllerextends BroadcastReceiver

CloudController

AnotherActivityextends Activityimplements Observer

web, cloud

ItemsControllerextends BroadcastReceiver

Receiver, CGM et +73

Généralisation

• Le champ Action sélectionne le contrôleur ad’hoc

• MVC respecté• Couplage faible conservé

Itemsextends Observable

MainActivityextends ListActivityimplements Observer

MainActivityextends ListActivityimplements Observer

ItemsControllerextends BroadcastReceiver

GenericController

AnotherActivityextends Activityimplements Observer

web, cloud

Receiver, CGM et +74

GenericController

• L’ACTION_KEY est redirigée vers le « bon » contrôleur• Discussion

ItemsControllerextends BroadcastReceiver

GenericController

Receiver, CGM et +75

Cumul du comportement

• Avec une sous classe de ItemsController: ItemsContro llerPlus

@OverrideonReceive(Context context, Intent intent){super.onReceive(context, intent);……

ItemsControllerextends BroadcastReceiver

ItemsControllerPlusextends ItemsController

Receiver, CGM et +76

Démonstration

• Démonstration

Receiver, CGM et +77

Mise en œuvre

• Répertoire du projet eclipse du client souscripteurDepuis l’explorateur windows, (eclipse n’est pas dém arré)

créer un répertoire libs dans lequel vous copiez gcm .jarlibs>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ém arré)

créer un répertoire libs dans lequel vous copiez gcm -server.jarlibs>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 requisD:\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 »