Article complet: Utiliser les services sous Android
|
|
- Roland Breton
- il y a 7 ans
- Total affichages :
Transcription
1 Page 1 of 12 Forums Tutoriels Magazine FAQs Blogs Projets Chat Newsletter Études Emploi Club Contacts Accueil Conception Java.NET Dév. Web EDI Langages SGBD Office Solutions d'entreprise Applications Systèmes INDEX DES BLOGS REGLES ENREGISTREZ-VOUS IDENTIFIEZ-VOUS OUVREZ VOTRE BLOG Blogs des développeurs» Android - Le blog d'un développeur Article complet: Utiliser les services sous Android 26/02/ :54:06, Catégories: Récapitulatif Java, Android, Android, 6754 mots, Nicolas Druet [Android][Java] Utiliser les services sous Android A l'instar des Activities, des Intents, les services font partie des briques essentielles d'android. Ils ne disposent pas d'interface utilisateur mais fonctionnent en arrière plan pour une période de temps indéfinie. L'exemple le plus courant est le lecteur de musique, qui vous permet d'écouter vos mp3 sans bloquer la navigation sur internet ou consultre la liste des vos contacts. Un service peut également rapatrier des données sur internet tels que des flux RSS. Dans ce long article nous aborderons : Les services (threads, cycle de vie...) Services Locaux (LocalService) Déclaration du service Implémentation des listeners Implémentation d'un binder Services Distants (RemoteService) Déclaration du service Mise en place des Callbacks Démarrer le service au boot du téléphone Exemple : Connexion au service MP3 [Suite:] > Les services (threads, cycle de vie...) Les services ont pour but de réaliser des tâches de fond sans aucune interaction avec l'utilisateur pour une durée indéfinie. Il existe deux type de services : les services locaux (ou LocalService) qui s'exécutent dans le même processus que votre application Les services distants (ou RemoteService) qui s'exécutent dans un processus différent de celui de application Les services s'exécutent dans le Thread principal du processus parent. Ils doivent être déclarés dans le fichier AndroidManifest.xml: <service android:name=".subpackagename.servicename"/> Ils doivent étendre la classe Service dont vous devrez surcharger les méthodes suivantes en fonction de vos besoins : void oncreate(); // initialisation des ressources void onstart(intent intent); // SDK<2.0 la tâche de fond démarre void onstartcommand(intent intent, int flags, int startid); // SDK>2.0 la tâche de fond démarre void ondestroy(); // libération des ressources IBinder onbind(intent intent); // connexion client distant boolean onunbind(intent intent); // déconnexion d'un client void onrebind(intent intent) Google a publié un post sur la méthode onstartcommand() apparue avec le SDK 2.0 : La méthode onstart() est dépréciée mais doit être redéfinie pour une compatibilité avec les SDK antérieurs (si nécessaire).
2 Page 2 of 12 Quant au cycle de vie d'un service, Google l'illustre de la manière suivante : Pour interagir (demarrer/arrêter...) avec un service, deux possibilités s'offrent à nous : Soit on appelle la méthode startservice() qui invoque la méthode oncreate() puis onstart() service.startservice() -> oncreate() - > onstartcommand() [service running] L'appel de la méthode stopservice() invoque la méthode ondestroy() Soit on appelle la méthode bindservice() qui appelle uniquement la méthode oncreate() activity.bindservice() ->oncreate() [service created] Il est possible de voir la liste des services exécutés en allant dans Menu > Settings > Applications > Running Services > du téléphone: > Services locaux (LocalService) >> Déclaration du service Un service Local n'est accessible que par les Activity de l'application. Pour l'exemple, notre service initialise un Timer et une tâche qui sera exécutée toutes les minutes. Nous allons créer une classe héritant de Service et surcharger les méthodes oncreate(), onstart() et ondestroy(). public class BackgroundService extends Service { private Timer timer ;
3 Page 3 of 12 protected void oncreate() { super.oncreate(); timer = new Timer(); Log.d(this.getClass().getName(), "oncreate"); public int onstartcommand(intent intent, int flags, int startid) { Log.d(this.getClass().getName(), "onstart"); timer.scheduleatfixedrate(new TimerTask() { public void run() { // Executer de votre tâche, 0, 60000); return START_NOT_STICKY; public void ondestroy() { Log.d(this.getClass().getName(), "ondestroy"); this.timer.cancel(); Nous déclarons le service dans le fichier AndroidManifest.xml à l'intérieur de la balise <application> : <service android:name=".backgroundservice" /> Pour le démarrer, nous faisons appel à la méthode startservice(intent) de l'activity prenant en paramêtre un Intent. Ce dernier peut être initialisé de deux manières : Soit en lui passant explicitement le context de l'application et la class du service. Intent intent = new Intent(this,BackgroundService.class); startservice(intent); Soit en déclarant une action dans le fichier AndroidManifest.xml... <service android:enabled="true" android:name=".backgroundservice"> <intent-filter> <action android:name=".backgroundservice.action" /> </intent-filter> </service>... que nous passons au constructeur de l'intent Intent intent = new Intent(".BackgroundService.ACTION"); startservice(intent); Il est possible de passer des objets complets serialisables en paramètre avec les méthodes intent.putextra(...). Les objets pourront être récupérer dans la méthode onstart(intent intent, int startid) du service avec intent.getextras().get(string key). Le fonctionnement est similaire à une table de Hash. Pour arrêter notre service : Intent intent = new Intent(this,BackgroundService.class); stopservice(intent); >> Implémentation des listeners Dans un premier temps, nous allons implémenter un système de listeners très simple. L'interface IBackgroundServiceListener implémentée par notre Activity pour écouter les mises à jour du service est la suivante : public interface IBackgroundServiceListener { public void datachanged(object o); Nous créons l'interface IBackgroundService : public interface IBackgroundService { public void addlistener(ibackgroundservicelistener listener); public void removelistener(ibackgroundservicelistener listener); Nous implémentons l'interface dans le service : private List<IBackgroundServiceListener> listeners = null; // Ajout d'un listener public void addlistener(ibackgroundservicelistener listener) { if(listeners == null){ listeners = new ArrayList<IGoogleWeatherListener>(); listeners.add(listener); // Suppression d'un listener public void removelistener(ibackgroundservicelistener listener) { if(listeners!= null){ listeners.remove(listener); // Notification des listeners private void firedatachanged(object data){ if(listeners!= null){ for(ibackgroundservicelistener listener: listeners){
4 Page 4 of 12 listener.datachanged(data); Pour accéder au service depuis l'activity nous rajoutons une variable static IBackgroundService service que nous initialiserons dans la méthode oncreate() : public class BackgroundService extends Service implements IBackgroundService { private static IBackgroundService service; public void oncreate() {... service = this; public static IBackgroundService getservice() { return service; L'emploi d'une variable static n'est pas la meilleure solution. Nous verrons plus tard comment nous en passer. Mais à ce stade, il n'est pas possible d'accéder aux méthodes du service et d'appeler un setter. Nous poursuivons en définissant notre listener dans notre Activity: Intent intent = new // Lancement du service Intent(this,BackgroundService.class); startservice(intent); // Ajout de l'activity à la liste des listeners du service BackgroundService.getService().addListener(new IBackgroundServiceListener() { public void datachanged(object o) { // mise à jour de l'interface graphique ); Au moment voulu, dans la méthode run() du Timer nous ferons appel à la méthode privée firedatachanged(data) pour notifier les listeners (dans notre cas, l'activity) de la mise à jour des données. Attention! Si nous nous contentons d'implémenter la méthode datachanged(), l'exception suivante sera levée au runtime : android.view.viewroot$calledfromwrongthreadexception: Only the original thread that created a view hierarchy can touch its views. En effet, la méthode du listener datachanged() est appelée par le Timer, et donc exécutée dans le Thread de celui-ci. L'exception nous indique que toute mise à jour de l'interface utilisateur ne peut se faire que par le Thread responsable de la création des View, Button, TextView... Nous utilisons donc la méthode runonuithread de la classe Activity pour poster des instructions dans l'uithread : // Ajout de l'activity à la liste des listeners du service BackgroundService.getService().addListener(new IBackgroundServiceListener() { public void datachanged(final Object o) { MyActivity.this.runOnUiThread(new Runnable() { public void run() { // Mise à jour de l'ui ); ); Il nous reste à mettre à jour la méthode ondestroy() du service pour vider la liste des listeners : public void ondestroy() { this.listeners.clear(); this.timer.cancel(); Log.d(this.getClass().getName(), "ondestroy"); A ce stade, nous avons vu comment déclarer notre service et y accéder, définir une tâche de fond, et mettre à jour notre interface utilisateur. Le défaut de la solution proposée est l'utilisation d'une variable static pour accéder au service depuis l'activity. Malheureusement, la méthode startservice(intent) n'offre pas d'accès direct aux méthodes du services. Pour se faire, nous allons avoir recours au binding. >> Implémentation d'un binder Comme avec un RemoteService, nous allons nous connecter au service et récupérer un Binder. A travers cet objet nous accéderons aux méthodes public du service via l'interface IBackgroundService que nous avons définie plus haut. L'avantage de cette solution est d'unifier l'utilisation des LocalService et RemoteService mais surtout de récupérer l'instance du service. Nous redéfinissons la méthode onbind(), modifions l'implémentation du listener et déportons notre tâche de fond dans la méthode _onstart() : public class BackgroundService extends Service implements IBackgroundService { private Timer timer ; private BackgroundServiceBinder binder ; private List<IBackgroundServiceListener> listeners = null; public void oncreate() { timer = new Timer();
5 Page 5 of 12 binder = new BackgroundServiceBinder(this); _onstart(); public IBinder onbind(intent intent) { return binder; public void _onstart(){ timer.scheduleatfixedrate(new TimerTask() { public void run() { if(listeners!= null){ firedatachanged(new Object());, 0, 60000); public int onstartcommand(intent intent, int flags, int startid) { _onstart(); return START_NOT_STICKY; // Ajout d'un listener public void addlistener(ibackgroundservicelistener listener) { if(listeners == null){ listeners = new ArrayList<IGoogleWeatherListener>(); listeners.add(listener); // Suppression d'un listener public void removelistener(ibackgroundservicelistener listener) { if(listeners!= null){ listeners.remove(listener); // Notification des listeners private void firedatachanged(object data){ if(listeners!= null){ for(ibackgroundservicelistener listener: listeners){ listener.datachanged(data); public void ondestroy() { this.listeners.clear(); this.timer.cancel(); Nous définissons le binder qui nous permettra de récupérer l'instance de notre service : public class BackgroundServiceBinder extends Binder{ private IBackgroundService service = null; public BackgroundServiceBinder(IBackgroundService service) { super(); this.service = service; ; public IBackgroundService getservice(){ return service; L'avantage de l'interface IBackgroundService est de masquer les méthodes oncreate(), onbind()... et de ne proposer uniquement addlistener(), removelistener() et pourquoi pas d'autres méthodes métiers. Il nous reste à nous connecter au service, accéder aux méthodes exposées par l'interface et s'ajouter comme listener pour mettre à jour l'interface utilisateur : Intent intent = new Intent(this,BackgroundService.class); final IBackgroundServiceListener listener = new IBackgroundServiceListener() { public void datachanged(final Object data) { MyActivity.this.runOnUiThread(new Runnable() { public void run() { // Mise à jour de l'ui ); ; ServiceConnection connection = new ServiceConnection() { public void onserviceconnected(componentname name, IBinder service) { Log.i("BackgroundService", "Connected!"); IBackgroundService service = ((BackgroundServiceBinder)service).getService(); service.addlistener(listener); public void onservicedisconnected(componentname name) { Log.i("BackgroundService", "Disconnected!");
6 Page 6 of 12 ; bindservice(intent,connection, Context.BIND_AUTO_CREATE); La connexion au service se fait via la méthode bindservice (Intent service, ServiceConnection conn, int flags) de la classe Context dont hérite Activity. L'argument flags peut prendre soit 0 soit Context.BIND_AUTO_CREATE pour forcer le service à démarrer, s'il ne l'est pas, au moment de la connexion. La partie sur les LocalService est terminée. Je ne suis pas personnellement convaincu de leur intéret. Les classes Service, ServiceConnection, IBinder... sont relativement contraignantes, complexifient le code et n'offrent pas vraiment d'aide à la réalisation de services. Mais si un jour votre LocalService doit se transformer en RemoteService alors vous serez prets. > Services distants (RemoteService) >> Déclaration du service Contrairement aux LocalService qui s'exécutent dans le processus de l'application et plus particulièrement dans le thread principal, les RemoteService s'exécutent dans un processus totalement différent de celui de votre application. Afin que deux processus différents puissent communiquer et s'échanger des données, Google a implémenté son IDL appelé AIDL (Android Interface Definition Language) pour décrire les méthodes publiques et les données échangées. Cette description se fait dans un fichier.aidl qui devra être connu des deux processus! Pourront être échangées entre deux processus, seulement les types primitifs java (int, boolean, etc), les String, List, Map et CharSequence. Pour des objects personnalisés, vous devrez implémenter l'interface Parcelable. Un RemoteService peut être sollicité par plusieurs applications différentes. C'est pourquoi je préfère le déporter dans un nouveau projet Android sous Eclipse. Je conseille également la réalisation d'une petite interface graphique avec deux boutons pour le démarrer et l'arrêter. Si vous ne souhaitez pas créer un projet particulier, il faudra ajouter android:process=":remote" à la déclaration de votre service (<service>) dans le fichier AndroidManifest.xml. Après avoir créer un projet BackgroundService (package de l'application com.android23.backgroundservice), nous créons notre service com.android23.backgroundservice.service.backgroundservice le plus simple qui soit, avec un Timer et un objet Data: public class BackgroundService extends Service { private Timer timer ; private BackgroundServiceBinder binder ; private Data data; public void oncreate() { binder = new BackgroundServiceBinder(this); timer = new Timer(); _onstart(); public void _onstart(){ timer.scheduleatfixedrate(new TimerTask() { public void run() { data = new Data(18, Data.Weather.ENSOLEILLE);, 0, 60000); public void ondestroy() { super.ondestroy(); this.binder = null; this.timer.cancel(); public IBinder onbind(intent intent) { return binder; public Data getdata() { return data; Pour chaque RemoteService il est nécessaire de déclarer un fichier.aidl que nous plaçons dans le même package (com.android23.backgroundservice.service). Voici le contenu de notre fichier IRemoteBackgroundService.aidl : package com.android23.backgroundservice.service; import com.android23.backgroundservice.bo.data; interface IRemoteBackgroundService { int getpid(); // Renvoie le PID du processus du service Data getdata(); // Renvoie notre objet mis à jour //void updatedata(in Data data); Il n'y pas de règle concernant le nom du fichier. Ce fichier sert d'interface entre le client et le service. Nous y déclarons seulement les méthodes public. La syntaxe ressemble fortement au Java bien que cela n'en soit pas. Les mots clefs 'in', 'out', 'inout' sont ajoutés aux paramètres des méthodes. '//' permet d'ajouter des commentaires. Enfin on peut spécifier 'oneway' devant interface. Nous créons dans le package com.android23.backgroundservice.bo, notre objet java Data implémentant l'interface Parcelable : public class Data implements Parcelable { public static enum Weather {NUAGEUX,PLUVIEUX,ENSOLEILLE,BROUILLARD private int temperature;
7 Page 7 of 12 private Weather today; public static final Parcelable.Creator<Data> CREATOR = new Parcelable.Creator<Data>() { public Data createfromparcel(parcel in) { return new Data(in); ; public Data[] newarray(int size) { return new Data[size]; public Data(int temperature, Weather today) { super(); this.temperature = temperature; this.today = today; public int gettemperature() { return temperature; public Weather gettoday() { return today; private Data(Parcel in) { readfromparcel(in); public void readfromparcel(parcel in) { temperature = in.readint(); today = (Weather)in.readSerializable(); public int describecontents() { return 0; public void writetoparcel(parcel arg0, int arg1) { arg0.writeint(temperature); arg0.writeserializable(today); Notre objet contient le temps et la température, deux types java simples. Le code est calqué sur l'exemple que vous trouverez sur L'interface Parcelable nous oblige à définir la méthode writetoparcel() dans laquelle nous ajoutons à l'objet Parcel tous les attributs de notre objet Data. Un Parcel peut être vue comme l'unité de communication entre deux processus. Attention, l'ordre dans lequel nous ajoutons les attributs à une importance. C'est ordre doit être respecté dans la méthode readfromparcel(). L'attribut static CREATOR est obligatoire. Il implémente l'interface Parcelable.Creator. L'implémentation de cette interface nous force a écrire la méthode readfromparcel(). Pour que notre objet Data puisse voyager d'un processus à l'autre, il nous reste à déclarer son fichier Data.aidl : package com.android23.backgroundservice.bo; parcelable Data; Le mot clef parcelable spécifie que notre objet Data implémente bien le protocole Google pour les communication IPC. Les erreurs contenues dans les fichiers.aidl devraient disparaitre. Eclipse génère alors l'interface Java IRemoteBackgroundService dans le répertoire source "gen" du projet : Il nous reste ensuite à déclarer notre BackgroundServiceBinder qui permettra au client d'accéder aux méthodes déclarées dans le fichier aidl. Notre binder hérite de IRemoteBackgroundService.Stub généré par Eclipse : public class BackgroundServiceBinder extends IRemoteBackgroundService.Stub{
8 Page 8 of 12 private BackgroundService service = null; public BackgroundServiceBinder(BackgroundService service) { super(); this.service = service; public Data getdata() throws RemoteException { return service.getdata(); ; public int getpid() throws RemoteException { return Process.myPid(); N'oublions pas de déclarer notre service dans le fichier AndroidManifest.xml : <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:exported="true" android:name=".service.backgroundservice" /> </application> Il est possible d'ajouter une permission : <permission android:name="com.android23.backgroundservice.backgroundservice_permission" /> <application android:icon="@drawable/icon" android:label="backgroundservice"> <service android:exported="true" android:enabled="true" android:name=".service.backgroundservice" android:permission="com.android23.backgroundservice.backgroundservice_permission"/> </application> Les clients devront déclarer cette permission dans leur fichier manifest pour se connecter au service. Sans quoi une SecurityException sera levée à l'appel des méthodes startservice ou bindservice. Pour plus d'informations concernant les permissions, jetez un coup d'oeil à la documentation Google: Revenons à notre projet Eclipse principal. Pour réaliser notre appel distant au service, nous devons y copier/coller les fichier.aidl Data.aidl, et IRemoteBackgroundService.aidl dans le même package que le projet BackgroundService, ainsi que votre objet java Data! Eclipse créera automatiquement les interfaces d'accès. Pour nous connecter au service, rien de bien compliqué : Intent intent = new Intent(); intent.setclassname("com.android23.backgroundservice", "com.android23.backgroundservice.service.backgroundservice"); ServiceConnection remoteconnection = new ServiceConnection() { public void onservicedisconnected(componentname name) { ; public void onserviceconnected(componentname name, IBinder service) { IRemoteBackgroundService service = IRemoteBackgroundService.Stub.asInterface(service); try { service.getpid(); service.getdata(); catch (RemoteException e) { // TODO Auto-generated catch block bindservice(intent, remoteconnection, Context.BIND_AUTO_CREATE); Nous passons au constructeur de l'intent le package principal de notre projet BackgroundService puis la classe du service. IRemoteBackgroundService.Stub.asInterface() nous permet de récupérer notre service. A noter également que chaque appel de méthode peut lever une RemoteException. Pour nous déconnecter au service, nous faisons appel à la méthode unbindservice(serviceconnection) qui prend en paramêtre l'object ServiceConnection que nous avons créé : unbindservice(remoteconnection); Il est indispensable d'ajouter la permission dans le fichier AndroidManifest.xml, au même niveau que la balise <application> sans quoi notre Activity ne se connectera jamais : <uses-permission android:name="com.android23.backgroundservice.backgroundservice_permission"></usespermission> Il n'est pas possible de débugger à la fois le service et notre application. Pour tester, notre service il sera nécessaire de développer dans notre projet BackgroundService une Activity avec 2 boutons : un pour démarrer le service, et l'autre pour l'arrêter. Pour tester notre application, nous déployons le service en premier puis nous lançons notre application en mode debug. >> Mise en place d'un syteme de Callback/Listeners Comme pour les LocalService, les RemoteService peuvent également notifier leurs clients grâce une liste RemoteCallbackList. Pour cela nous allons apporter quelques modifications. Pour commencer, retournons dans le projet BackgroundService, et modifions le fichier IRemoteBackgroundService.aidl en supprimant la méthode getdata() et en rajoutant les méthodes registercallback et unregistercallback qui permettrons aux clients de s'enregistrer auprès du service : package com.android23.backgroundservice.service; import com.android23.backgroundservice.service.iremotebackgroundservicecallback;
9 Page 9 of 12 interface IRemoteBackgroundService { int getpid(); void registercallback(iremotebackgroundservicecallback cb); void unregistercallback(iremotebackgroundservicecallback cb); A travers cette interface, les clients pourront s'enregistrer. Une fois enregistrés il leur faudra implémenter l'interface IRemoteBackgroundServiceCallback que nous déclarons dans le fichier IRemoteBackgroundServiceCallback.aidl : package com.android23.backgroundservice.service; import com.android23.backgroundservice.bo.data; interface IRemoteBackgroundServiceCallback { void datachanged(in Data data); Nous déclarons dans notre service, la liste des clients à l'écoute : final RemoteCallbackList<IRemoteBackgroundServiceCallback> callbacks = new RemoteCallbackList<IRemoteBackgroundServiceCallback>(); public RemoteCallbackList<IRemoteBackgroundServiceCallback> getcallbacks() { return callbacks; Nous mettons à jour la méthode _onstart() afin de créer un nouvel objet Data toutes les minutes et notifier les clients : public void _onstart() { Log.i(getClass().getSimpleName(), "_onstart()"); timer.scheduleatfixedrate(new TimerTask() { public void run() { data = new Data(++counter, Data.Weather.BROUILLARD); // Broadcast to all clients the new value. final int N = callbacks.beginbroadcast(); for (int i = 0; i < N; i++) { try { callbacks.getbroadcastitem(i).datachanged(data); catch (RemoteException e) { callbacks.finishbroadcast();, 0,60000); callbacks.beginbroadcast() et callbacks.finishbroadcast(); encadre le début et la fin de la notification des clients. callbacks.getbroadcastitem(i) vous permet d'appeler les méthodes de l'intarface IRemoteBackgroundServiceCallback et prévenir les clients. Elle ne peut être appelée qu'après beginbroadcast() Nous désactivons la liste des callbacks dans la méthode ondestroy() : public void ondestroy() { super.ondestroy(); this.binder = null; this.callbacks.kill(); // Désactive tous les éléments de la liste this.timer.cancel(); N'oublions pas de mettre à jour notre Binder implémentant l'interface IRemoteBackgroundService.Stub : public class BackgroundServiceBinder extends IRemoteBackgroundService.Stub{ private BackgroundService service = null; public BackgroundServiceBinder(BackgroundService service) { super(); this.service = service; public int getpid() throws RemoteException { return Process.myPid(); public void registercallback(iremotebackgroundservicecallback cb) throws RemoteException { if(cb!= null){ service.getcallbacks().register(cb); ; public void unregistercallback(iremotebackgroundservicecallback cb) throws RemoteException { if(cb!= null){ service.getcallbacks().unregister(cb); Retournons maintenant du côté de notre application principale pour y copier les fichiers IRemoteBackgroundService.aidl et IRemoteBackgroundServiceCallback.aidl dans le package com.android23.backgroundservice.service.
10 Page 10 of 12 Puis mettons à jour la manière dont nous nous connectons au service en déclarant un IRemoteBackgroundServiceCallback et en l'inscrivant auprès du service dans la méthode onserviceconnected() : Intent intent = new Intent(); intent.setclassname("com.android23.backgroundservice", "com.android23.backgroundservice.service.backgroundservice"); final IRemoteBackgroundServiceCallback callback = new IRemoteBackgroundServiceCallback.Stub() { public void datachanged(data data) throws RemoteException { Log.d( getclass().getsimplename(), "Temperature : " + data.gettemperature()); Log.d( getclass().getsimplename(), "Temps : " + data.gettoday().tostring()); ; ServiceConnection remoteconnection = new ServiceConnection() { public void onservicedisconnected(componentname name) { Log.d( getclass().getsimplename(), "onserviceconnected()" ); ; public void onserviceconnected(componentname name, IBinder service) { remotebackgroundservice = IRemoteBackgroundService.Stub.asInterface(service); try { remotebackgroundservice.getpid(); remotebackgroundservice.registercallback(callback); catch (RemoteException e) { bindservice(intent, remoteconnection, Context.BIND_AUTO_CREATE); Pour tester, nous déployons le service et puis nous lançons en mode debug notre application. >> Démarrer le service au boot du téléphone Dans le projet BackgroundService, nous rajoutons un BroadcastReceiver : public class BackgroundServiceReceiver extends BroadcastReceiver{ public void onreceive(context context, Intent intent) { Intent serviceintent = new Intent(); serviceintent.setclassname("com.android23.backgroundservice", "com.android23.backgroundservice.service.backgroundservice"); context.startservice(serviceintent); Nous le rajoutons dans le fichier AndroidManifest.xml : <permission android:name="com.android23.backgroundservice.backgroundservice_permission" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <service android:exported="true" android:name=".service.backgroundservice" android:permission="com.android23.backgroundservice.backgroundservice_permission" /> <receiver android:name=".service.backgroundservicereceiver"> <intent-filter> <action android:name="android.intent.action.boot_completed" /> <category android:name="android.intent.category.home" /> </intent-filter> </receiver> </application> <uses-permission android:name="com.android23.backgroundservice.backgroundservice_permission"/> Nous avons également précisé que notre service demande la permission BACKGROUNDSERVICE_PERMISSION pour pouvoir démarrer tout seul. Déployons le service sur l'émulateur en faisant un clic droit sur le projet : Run As > Android Application. Une fois déployé, re-démarrons l'émulateur en cliquant sur le bouton dans la barre d'outil d'eclipse puis sur le bouton start dans la fenêtre qui apparait. Une fois l'émulateur lancé, il suffit d'aller dans Menu > Settings > Applications > Running Services > pour constater que notre BackgroundService est bien en route. >> Exemple : Connexion au service MP3 Le lecteur MP3 d'android est lui aussi un RemoteService. Il est donc très simple de s'y connecter pour récupérer la chanson en cours, l'artiste... Pour l'exemple n'oubliez pas de lancer la lecture d'un fichier mp3. Profitons du fait qu'android soit open-source pour nous rendre sur Google Code et récupérer le fichier IMediaPlaybackService.aidl. Une fois le fichier récupéré, nous créons le package "com.android.music" dans lequel nous insérons le fichier.aidl. Eclipse génère alors automatiquement l'interface IMediaPlaybackService. Le service ne renvoyant que des types primitifs, seul ce fichier suffit au client. Nous nous connectons au lecteur mp3 comme nous nous connections à notre BackgroundService : Intent intent = new Intent(); intent.setclassname("com.android.music", "com.android.music.mediaplaybackservice"); ServiceConnection conn = new ServiceConnection() { public void onservicedisconnected(componentname componentname) { public void onserviceconnected(componentname componentname, IBinder ibinder) {
11 Page 11 of 12 IMediaPlaybackService service = IMediaPlaybackService.Stub.asInterface(ibinder); try { Log.i("ServiceConnection", "Playing track: " + service.gettrackname()); Log.i("ServiceConnection", "By artist: " + service.getartistname()); catch (Exception e) { ; this.bindservice(intent, conn, 0); Malheureusement, si Google modifie l'interface.aidl de son lecteur MP3 il faudra mettre à jour le fichier IMediaPlaybackService.aidl dans notre projet. > Conclusion Le post est relativement long mais regroupe tout ce que j'ai pu apprendre en parcourant le net. Je vais réfléchir à le publier au format PDF dans la rubrique tutorial. L'intérêt des LocalService reste flou à mes yeux. J'ai la fâcheuse impression de gagner plus en complexité qu'en productivité. A contrario, les RemoteService ont une véritable valeur ajoutée. Ainsi on peut imaginer un service météo commun à toutes nos applications et nos widgets. Les possibilités sont nombreuses dès lors que l'os gère le multi-taches Si vous souhaitez que certains points soient approfondis, ou corrigés, n'hésitez pas à m'en faire part. > Ressources Commentaires: Commentaire de: vincebodi [Membre] Merci pour ce tutorial. Cependant, je ne suis toujours pas sûr d'avoir bien compris le principe du service. Une contradiction dans le premier paragraphe me désarme complétement dans le choix de mon implémentation d'une tâche de fond dans mon appli. La phrase : "Les services s'exécutent dans le Thread principal du processus parent." est pour moi très contradictoire avec la phrase qui la précède : "Les services distants (ou RemoteService) qui s'exécutent dans un processus différent de celui de application" Du coup, si je considère la première phrase, ma tâche de fond sera interrompue lors de la destruction de l'activité qui l'a lancé (ce que je ne souhaite pas). Si je considère la deuxième phrase, un RemoteService me permet d'exécuter ma tâche de fond dans un processus indépendant de l'application. Seulement, son processus parent est le processus de mon application. Voilà la source de ma grande détresse. Help ;-) 20:44 Commentaire de: Nicolas Druet [Membre] "Les services s'exécutent dans le Thread principal du processus parent" C'est pourquoi on crée un thread dans le localservice. Ainsi avoir un vrai tâche de fond. Mais qui sera détruite quand l'application sera fermée. "Les services distants (ou RemoteService) qui s'exécutent dans un processus différent de celui de application" Tout a fait. Mais en aucun cas son processus parent est le processus de l'application. Sinon ca n'aurait pas grand intérêt. Le RemoteService est une autre application Android sans IHM ;) 22:32 Commentaire de: Inrokuptible [Membre] Merci pour ce riche tutoriel. Mon activité doit être amenée à invoquer régulièrement des méthodes distantes. Dois-je pour ça appeler à chaque fois la méthode bindservice()? 17:40 Commentaire de: Nicolas Druet [Membre] Il suffit de faire un bind une fois pour que l'application soit "connectée" au service. 18:00 Commentaire de: Inrokuptible [Membre] re Est ce que les objets contenus dans l'objet qui sera échangé entre les processus devront eux aussi être déclaré dans des AIDL différents et implémenter l'interface Parcelable? Par exemple dans ta classe Data si Weather n'était pas de type primitif je l'aurai déclaré dans un AIDL et lui faire implémenter parcelable?
12 Page 12 of 12 14:15 Commentaire de: Inrokuptible [Membre] re Est ce que les objets contenus dans l'objet qui sera échangé entre les processus devront eux aussi être déclaré dans des AIDL différents et implémenter l'interface Parcelable? Par exemple dans ta classe Data si Weather n'était pas de type primitif je l'aurai déclaré dans un AIDL et lui faire implémenter parcelable? 14:15 Commentaire de: jekho [Membre] Bonjour, J'ai testé ce tutoriel mais lors du test sur l'émulateur android, j'ai un warning : 'unable to start service intent : "nomdemonpackage" : not found ' alors que le nom du package est bien celui que j'ai... je ne comprends pas. D'ailleurs, il y a un point sur le tutoriel qui est ambigüe : public void onserviceconnected(componentname name, IBinder service) { IRemoteBackgroundService service = IRemoteBackgroundService.Stub.asInterface(service); try { service.getpid(); service.getdata(); catch (RemoteException e) { // TODO Auto-generated catch block le 'service' du type IRemoteBackgroundService doit être différent du 'service' type IBinder non? 15:11 Commentaire de: jekho [Membre] désolé pour le double post, j'ai trouvé la solution : pour appeler le service par un objet Intent, mettre directement le nom de la classe du service plutôt que d'utiliser la méthode 'setclassename()', cela marche beaucoup. Super tuto sinon. 15:37 Commentaire de: James_Carr [Membre] A propos des binder pour les services locaux. jai implémenté un service local comme decrit dans le tuto. Jai créé deux activité : La premiere se connecte à l'activité comme dans le tuto. De cette activité, je passe à la seconde activité. j'aiconnecté la 2eme activité au même service, mais dans cette nouvelle activité, je n'arrive pas à recuperer l'instance du service. jai un NullPointerException. Normallement, plusieurs activités devraient pouvoir se connecter au même service grace au binding. Pouvez vous m'aider à resoudre ce pb? merci 14:45 Commentaire de: capslock [Membre] J'aime bien lire un bon article avec le code source complet à coté. J'ai beau regarder, mais je ne vois de lien pour le code de la demo... 17:39 Vous devez être identifié pour poster un commentaire. Responsable bénévole de la rubrique Blogs : - Contacter par Vos questions techniques : forum d'entraide Blogs - Publiez vos articles, tutoriels et cours et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones Nous contacter - Hébergement - Participez - Copyright Legal informations.
Tutorial pour une application simple
ANDROID & ECLIPSE Tutorial pour une application simple 1. Introduction Android est un système d'exploitation pour téléphone portable de nouvelle génération développé par Google. Celui-ci met à disposition
Plus en détailOutils, langage et approche Android Une introduction. Nicolas Stouls nicolas.stouls@insa lyon.fr
Outils, langage et approche Android Une introduction Nicolas Stouls nicolas.stouls@insa lyon.fr Webographie La bible contenant «tout» : http://developer.android.com/index.html Les supports cette intervention
Plus en détailTP SIN Programmation sur androïde Support : eclipse
TP SIN Programmation sur androïde Support : eclipse Support : Smartphone sur androïde Pré requis (l élève doit savoir): Savoir utiliser un ordinateur Savoir utiliser un Smartphone Programme Objectif terminale
Plus en détailRemote Method Invocation Les classes implémentant Serializable
Parallélisme Architecture Eric Goubault Commissariat à l Energie Atomique Saclay Classe qui implémente la méthode distante (serveur): - dont les méthodes renvoient un objet serializable - ou plus généralement
Plus en détailProgrammer en JAVA. par Tama (tama@via.ecp.fr( tama@via.ecp.fr)
Programmer en JAVA par Tama (tama@via.ecp.fr( tama@via.ecp.fr) Plan 1. Présentation de Java 2. Les bases du langage 3. Concepts avancés 4. Documentation 5. Index des mots-clés 6. Les erreurs fréquentes
Plus en détailDéveloppement sous Android
Développement sous Android Chapitres traités Les fournisseurs de contenu (Content Provider) Pour cette dernière étude de l'environnement Android, nous allons en profiter pour découvrir plein de fonctionnalités
Plus en détailAuto-évaluation Programmation en Java
Auto-évaluation Programmation en Java Document: f0883test.fm 22/01/2013 ABIS Training & Consulting P.O. Box 220 B-3000 Leuven Belgium TRAINING & CONSULTING INTRODUCTION AUTO-ÉVALUATION PROGRAMMATION EN
Plus en détailCalcul Parallèle. Cours 5 - JAVA RMI
Calcul Parallèle Cours 5 - JAVA RMI Eric Goubault Commissariat à l Energie Atomique & Chaire Ecole Polytechnique/Thalès Saclay Le 28 février 2012 Eric Goubault 1 28 février 2012 Remote Method Invocation
Plus en détailTP2 : Client d une BDD SqlServer
TP2 : Client d une BDD SqlServer Objectifs : utiliser la barre de menu, utiliser les préférences d application (settings) ou (options), gérer la persistance des données, utiliser la bibliothèque jtds:jdbc
Plus en détailTP au menu «UI ANDROID»
TP au menu «UI ANDROID» Pré-requis & Installation ( du couvert) soit installer en natif sur vos postes (!!! ATTENTION!!! FromScratch 1,1 Go à télécharger ) JDK http://www.oracle.com/technetwork/java/javase/downloads/index.html
Plus en détailRemote Method Invocation (RMI)
Remote Method Invocation (RMI) TP Réseau Université Paul Sabatier Master Informatique 1 ère Année Année 2006/2007 Plan Objectifs et Inconvénients de RMI Fonctionnement Définitions Architecture et principe
Plus en détailRMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.
RMI Remote Method Invocation: permet d'invoquer des méthodes d'objets distants. Méthode proche de RPC. Outils et classes qui rendent l'implantation d'appels de méthodes d'objets distants aussi simples
Plus en détailJava 7 Les fondamentaux du langage Java
184 Java 7 Les fondamentaux du langage Java 1.1 Les bibliothèques graphiques Le langage Java propose deux bibliothèques dédiées à la conception d'interfaces graphiques. La bibliothèque AWT et la bibliothèque
Plus en détailDébuter avec OOo Base
Open Office.org Cyril Beaussier Débuter avec OOo Base Version 1.0.7 Novembre 2005 COPYRIGHT ET DROIT DE REPRODUCTION Ce support est libre de droit pour une utilisation dans un cadre privé ou non commercial.
Plus en détailTrier les ventes (sales order) avec Vtiger CRM
Trier les ventes (sales order) avec Vtiger CRM Dans l'activité d'une entreprise, on peut avoir besoin d'un outil pour trier les ventes, ce afin de réaliser un certain nombre de statistiques sur ces ventes,
Plus en détail1.3 Gestion d'une application
1.3 Gestion d'une application 1. Un premier projet... Il est temps maintenant d'écrire la véritable première application Android avec l'inévitable affichage du mot bonjour, ce qui évidemment pour un développement
Plus en détailLes fondamentaux du développement d applications Java
Android 5 Les fondamentaux du développement d applications Java Nazim BENBOURAHLA Table des matières 1 Les éléments à télécharger sont disponibles à l'adresse suivante : http://www.editions-eni.fr Saisissez
Plus en détailTP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile
TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile Dans ce TP, vous apprendrez à définir le type abstrait Pile, à le programmer en Java à l aide d une interface
Plus en détailCréation d'un questionnaire (sondage)
Création d'un questionnaire (sondage) Le but de ce petit tuto est d'avoir les séquences pas à pas pour la création d'un questionnaire de façon à ne pas devoir rechercher la manière de procéder si l'outil
Plus en détailPremiers Pas en Programmation Objet : les Classes et les Objets
Chapitre 2 Premiers Pas en Programmation Objet : les Classes et les Objets Dans la première partie de ce cours, nous avons appris à manipuler des objets de type simple : entiers, doubles, caractères, booléens.
Plus en détailAndroid 4 Les fondamentaux du développement d'applications Java
La plateforme Android 1. Présentation 13 2. Historique 14 3. Google Play 15 3.1 Création d'un compte développeur 16 3.2 Publication d'une application 16 3.3 Suivi et mise à jour d'une application 18 Environnement
Plus en détailProgrammation Par Objets
Programmation Par Objets Structures de données package java.util B. Carré Polytech Lille 1 Tableaux et structures de données Tableaux «Objets» taille fixe type des éléments : primitif (homogène) ou objets
Plus en détailPour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère
L'héritage et le polymorphisme en Java Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère En java, toutes les classes sont dérivée de la
Plus en détailTP1 : Initiation à Java et Eclipse
TP1 : Initiation à Java et Eclipse 1 TP1 : Initiation à Java et Eclipse Systèmes d Exploitation Avancés I. Objectifs du TP Ce TP est une introduction au langage Java. Il vous permettra de comprendre les
Plus en détailCréation d un service web avec NetBeans 5.5 et SJAS 9
Sommaire Création d un service web avec NetBeans 5.5 et SJAS 9 1. Présentation... 2 2. Création d un service web avec NetBeans... 2 2.1. Création d une application Web... 2 2.2. Création du service web...
Plus en détailTD/TP 1 Introduction au SDK d Android
TD/TP 1 Introduction au SDK d Android Romain Raveaux 1 Introduction Android est un système d'exploitation pour téléphone portable de nouvelle génération développé par Google. Celui-ci met à disposition
Plus en détailIFT287 Exploitation de base de données relationnelles et orientées objet. Laboratoire Mon premier programme Java en Eclipse
IFT287 Exploitation de base de données relationnelles et orientées objet Laboratoire Mon premier programme Java en Eclipse Comment faire? Nous allons utiliser l environnement de travail proposé par Eclipse
Plus en détailProgrammation Objet Java Correction
INSA - 4 AE 2007 2008 Durée : 1H00 Contrôle Programmation Objet Java Correction Consignes Tous les documents sont autorisés, mais ils seront peu utiles. Indiquez vos nom et prénom sur chaque feuille. Le
Plus en détailRMI le langage Java XII-1 JMF
Remote Method Invocation (RMI) XII-1 Introduction RMI est un ensemble de classes permettant de manipuler des objets sur des machines distantes (objets distants) de manière similaire aux objets sur la machine
Plus en détailServeur d'application Client HTML/JS. Apache Thrift Bootcamp
Serveur d'application Client HTML/JS Apache Thrift Bootcamp Pré-requis La liste ci-dessous de logiciels doit être installée et opérationnelle sur la machine des participants : Compilateur thrift http://thrift.apache.org/
Plus en détailJAVA 8. JAVA 8 - Les fondamentaux du langage. Les fondamentaux du langage Java. Avec exercices pratiques et corrigés JAVA 8 29,90.
Analyste et développeur pendant plus de 10 ans, Thierry GROUSSARD s est ensuite orienté vers la formation et plus particulièrement dans le domaine du développement. Sa connaissance approfondie des besoins
Plus en détailSéquence de découverte de SparkAngels Logiciel d entraide numérique
Contributeurs : GUILLEZ Frédéric BANDINI Gérard DENIGOT Michaël FOLCH Janine PERILLAUD Stéphanie PLATEL Carl REANT Franck I. Matériel et préparation Pré requis matériel et logiciel : Ordinateur avec connexion
Plus en détailSommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et
Licence 3 CDA 2010/2011 Client FTP Java Maxence Jaouan Sommaire Introduction... 3 Le but du projet... 3 Les moyens utilisés... 3 Informations sur le client FTP... 4 Pourquoi une version Linux et Windows?...
Plus en détailLe stockage local de données en HTML5
Le stockage local HTML5, pourquoi faire? Dans une optique de réduction des couts de maintenance, de déploiement, beaucoup d'entreprises ont fait le choix de migrer leurs applicatifs (comptables, commerciales,
Plus en détailGénéralités sur le Langage Java et éléments syntaxiques.
Généralités sur le Langage Java et éléments syntaxiques. Généralités sur le Langage Java et éléments syntaxiques....1 Introduction...1 Genéralité sur le langage Java....1 Syntaxe de base du Langage...
Plus en détailPage 1 sur 5 TP3. Thèmes du TP : l la classe Object. l Vector<T> l tutorial Interfaces. l Stack<T>
Page 1 sur 5 TP3 Lectures préalables : l Java_II l tutorial Interfaces Thèmes du TP : l la classe Object l Vector l Stack Une pile d'objects Les éléments de la classe Pile sont maintenant des instances
Plus en détailTD Objets distribués n 3 : Windows XP et Visual Studio.NET. Introduction à.net Remoting
IUT Bordeaux 1 2005-2006 Département Informatique Licence Professionnelle ~ SI TD Objets distribués n 3 : Windows XP et Visual Studio.NET Introduction à.net Remoting Partie 1 : l'analyseur de performances
Plus en détailAssistance à distance sous Windows
Bureau à distance Assistance à distance sous Windows Le bureau à distance est la meilleure solution pour prendre le contrôle à distance de son PC à la maison depuis son PC au bureau, ou inversement. Mais
Plus en détailProjet Android (LI260) Cours 2
Projet Android (LI260) Cours 2 Nicolas Baskiotis Université Pierre et Marie Curie (UPMC) Laboratoire d Informatique de Paris 6 (LIP6) S2-2013/2014 Plan Les ressources Debug Communication entre activités
Plus en détailSynchro et Threads Java TM
Synchro et Threads Java TM NICOD JEAN-MARC Master 2 Informatique Université de Franche-Comté UFR des Sciences et Techniques septembre 2008 NICOD JEAN-MARC Synchro et Threads avec Java TM 1 / 32 Sommaire
Plus en détailLe service de création de site Internet : Mode d emploi. La Création de Site Internet
Le service de création de site Internet : Mode d emploi Sommaire 1) Comment se connecter à votre interface client? 2) Comment démarrer la création de votre site Internet? 3) Comment gérer les pages de
Plus en détailTRUECRYPT SUR CLEF USB ( Par Sébastien Maisse 09/12/2007 )
TRUECRYPT SUR CLEF USB ( Par Sébastien Maisse 09/12/2007 ) Voici un petit document concernant d'un espace crypté sur une clef usb en utilisant le logiciel TRUECRYPT. Ce dernier est gratuit et disponible
Plus en détailCréer un sondage en ligne
Créer un sondage en ligne Par Clément JOATHON Dernière mise à jour : 02/04/2015 Que cela soit pour récolter l'avis des membres d'une association ou encore les idées de vos visiteurs, il est toujours intéressant
Plus en détailChapitre 10. Les interfaces Comparable et Comparator 1
Chapitre 10: Les interfaces Comparable et Comparator 1/5 Chapitre 10 Les interfaces Comparable et Comparator 1 1 Ce chapitre a été extrait du document "Objets, Algorithmes, Patterns" de [René Lalement],
Plus en détailSYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8
SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8 INTRODUCTION Bonjour à tous; Aujourd hui je publie une nouvelle version de l adaptation de la Sync Framework Toolkit,
Plus en détailInstallation et prise en main
TP1 Installation et prise en main Android est le système d'exploitation pour smartphones, tablettes et autres appareils développé par Google. Pour permettre aux utilisateurs d'installer des applications
Plus en détailJ2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation
J2SE Threads, 1ère partie Principe Cycle de vie Création Synchronisation Cycle Ingénierie 2e année SIGL Dernière mise à jour : 19/10/2006 Christophe Porteneuve Threads Principes Cycle de vie Création java.lang.thread
Plus en détailUn ordonnanceur stupide
Un ordonnanceur simple Université Paris Sud L objet des exercices qui suivent est de créer un ordonanceur implantant l algorithme du tourniquet ( round-robin scheduler ). La technique utilisée pour élire
Plus en détailSHERLOCK 7. Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5
SHERLOCK 7 Version 1.2.0 du 01/09/09 JAVASCRIPT 1.5 Cette note montre comment intégrer un script Java dans une investigation Sherlock et les différents aspects de Java script. S T E M M E R I M A G I N
Plus en détailLa base de données XML exist. A. Belaïd
La base de données XML exist Introduction Qu est-ce-que exist? C est une base de donnée native, entièrement écrite en Java XML n est pas une base de données en soi Bien qu il possède quelques caractéristiques
Plus en détailTutoriel Inscription et utilisation basique d'un blog hébergé chez Blogger.com
Tutoriel Inscription et utilisation basique d'un blog hébergé chez Blogger.com Contenu I.Validation (ou inscription) de son adresse chez Google...2 II.Utilisation des fonctionnalités du blog...5 1.Accès
Plus en détailProgrammation des applications mobiles avec Android. 1 Inspiré du cours de Olivier Le Goaer
Programmation des applications mobiles avec Android 1 Inspiré du cours de Olivier Le Goaer 2 OS mobile : outils de développement D après le cours de Olivier Le Goaer 3 Plateforme de développement MobileApp
Plus en détailTalkToMe : votre première appli App Inventor Ce tutoriel vous aidera à construire une appli parlante qui peut sauvegarder des phrases sur demande.
TalkToMe : votre première appli App Inventor Ce tutoriel vous aidera à construire une appli parlante qui peut sauvegarder des phrases sur demande. Connectez-vous sur App Inventor avec le nom d'utilisateur
Plus en détailProgrammation par les Objets en Java
Programmation par les Objets en Java Najib TOUNSI Les classes en Java (TD 3) I. Notion de classe I.1 Classe, champs, méthodes, instanciation, this, private vs. public. Créer une classe Point (coordonnée
Plus en détailInfo0604 Programmation multi-threadée. Cours 5. Programmation multi-threadée en Java
Info0604 Programmation multi-threadée Cours 5 Programmation multi-threadée en Java Pierre Delisle Université de Reims Champagne-Ardenne Département de Mathématiques et Informatique 18 février 2015 Plan
Plus en détailANIMER UNE COMMUNAUTÉ CONSTRUCTION21
ANIMER UNE COMMUNAUTÉ CONSTRUCTION21 Les communautés en ligne sont des espaces d échange, de veille et de partage documentaire. En créant une communauté sur un sujet précis, vous vous posez en expert de
Plus en détailVotre premier projet Android
3 Votre premier projet Android Maintenant que le SDK Android est installé, il est temps de créer votre premier projet. La bonne nouvelle est qu il n exige aucune ligne de code les outils Android créent
Plus en détailProgrammation par composants (1/3) Programmation par composants (2/3)
Programmation par composants (1/3) La programmation par composant vise le développement de logiciel par aggrégation de briques logicielles existantes est indépendante de la POO La programmation par composant
Plus en détailEducation Delivery Intelligent Tool
Education Delivery Intelligent Tool Projet AMO2 Maxence RAOUX Joachim SEGALA RICM 4 Avril 2012 Sommaire I. Presentation du projet... 2 1. Contexte... 2 2. Demande... 2 3. Spécifications... 2 II. Guide
Plus en détailWarren PAULUS. Android SDK et Android x86
Android SDK et Android x86 2010/2011 Voici un petit tutoriel pour installer Android de façon à ce qu il soit compatible avec NetBeans et Eclipse, ainsi que l utilisation d Android x86. Ce tutoriel a été
Plus en détailProjet serveur OwnCloud
Projet serveur OwnCloud 1. Présentation 1. Environnement vsphere 2. Environnement Linux Ubuntu 3. Owncloud 5.0 2. Plan de travail 1. Matériel 2. Schéma physique 3. Installation ESXi sur serveur lame 4.
Plus en détailNavigation dans Windows
Cours 03 Navigation dans Windows Comme je le disais en introduction, notre souris se révèle plus maligne qu'elle n'en a l'air. À tel point qu'il faut apprendre à la dompter (mais c'est très simple, ce
Plus en détailNFP 121. Java et les Threads. Présentation : Thierry Escalarasse Mai 2007
NFP 121 Java et les Threads Présentation : Thierry Escalarasse Mai 2007 Plan du cour Présentation de la notion de Threads La classe Thread L interface Runnable Les états d un thread La Synchronisation
Plus en détailAteliers Python+Qt : Premiers pas : Comment développez ses propres interfaces graphiques sur le RaspberryPi?
Ateliers Python+Qt : Premiers pas : Comment développez ses propres interfaces graphiques sur le RaspberryPi? par X. HINAULT www.mon-club-elec.fr Tous droits réservés 2013. Document gratuit. Ce support
Plus en détailCours 1: Java et les objets
Ressources Les interface homme-machine et le langage Java DUT première année Henri Garreta, Faculté des Sciences (Luminy) Cyril Pain-Barre & Sébastien Nedjar, IUT d Aix-Marseille (Aix) Cours 1: infodoc.iut.univ-aix.fr/~ihm/
Plus en détailInitiation à JAVA et à la programmation objet. raphael.bolze@ens-lyon.fr
Initiation à JAVA et à la programmation objet raphael.bolze@ens-lyon.fr O b j e c t i f s Découvrir un langage de programmation objet. Découvrir l'environnement java Découvrir les concepts de la programmation
Plus en détailApplet pour visualiser les variables «automate» notifiées
Applet pour visualiser les variables «automate» notifiées Sommaire 1. Introduction...2 2. Lecture de variables «automate» notifiées...2 2.1. IHM servant au test :...2 2.2. Codage de l'applet :...2 3. Codage
Plus en détailUne introduction à la technologie EJB (2/3)
Une introduction à la technologie EJB (2/3) 1 Les singletons des EJB 3.1 1.1 Synchronisation gérée manuellement Depuis la version 3.1, des EJB Statless à instance unique sont maintenant disponibles : ce
Plus en détail1. Base de données SQLite
Dans ce TP, nous allons voir comment créer et utiliser une base de données SQL locale pour stocker les informations. La semaine prochaine, ça sera avec un WebService. On repart de l application AvosAvis
Plus en détailAndroid et le Cloud Computing
Android et le Cloud Computing 1 Plan de l'exposé Rappels sur Android et le cloud Présentation de GCM Notions fondamentales de GCM Construire un projet GCM Ecrire un client GCM (récepteur GCM) Ecrire un
Plus en détailCompte-rendu de projet de Système de gestion de base de données
Compte-rendu de projet de Système de gestion de base de données Création et utilisation d'un index de jointure LAMBERT VELLER Sylvain M1 STIC Université de Bourgogne 2010-2011 Reponsable : Mr Thierry Grison
Plus en détailThreads. Threads. USTL http://www.lifl.fr/ routier 1
Threads USTL http://www.lifl.fr/ routier 1 Rappels - Définitions un Process est un programme qui tourne et dispose de ses propres ressources mémoire. OS multi-tâche plusieurs process en concurrence un
Plus en détailTD/TP PAC - Programmation n 3
Université Paris Sud Licence d informatique/iup-miage2 - Année 2004-2005 auteur : Frédéric Vernier semaine : 11-16 octobre 2004 conditions : sur machine avec les outils standards java web: http://vernier.frederic.free.fr/indexpac.html
Plus en détailJava RMI. Arnaud Labourel Courriel: arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 8 mars 2011
Java RMI Arnaud Labourel Courriel: arnaud.labourel@lif.univ-mrs.fr Université de Provence 8 mars 2011 Arnaud Labourel (Université de Provence) Java RMI 8 mars 2011 1 / 58 Web services Services par le réseau
Plus en détailLambda! Rémi Forax Univ Paris-Est Marne-la-Vallée
Lambda! Rémi Forax Univ Paris-Est Marne-la-Vallée forax at univ-mlv dot fr - ParisJUG Java.next() - Mars 2012 What Else? Lambda == Inner class? Java a des lambdas depuis la version 1.1 Exemple utilisant
Plus en détailPolymorphisme, la classe Object, les package et la visibilité en Java... 1
Polymorphisme, la classe Object, les package et la visibilité en Java. Polymorphisme, la classe Object, les package et la visibilité en Java.... 1 Polymorphisme.... 1 Le DownCast... 4 La Classe Object....
Plus en détailINITIATION AU LANGAGE JAVA
INITIATION AU LANGAGE JAVA I. Présentation 1.1 Historique : Au début des années 90, Sun travaillait sur un projet visant à concevoir des logiciels simples et performants exécutés dans des PDA (Personnal
Plus en détailPlateforme PAYZEN. Intégration du module de paiement pour la plateforme Magento version 1.3.x.x. Paiement en plusieurs fois. Version 1.
Plateforme PAYZEN Intégration du module de paiement pour la plateforme Magento version 1.3.x.x Paiement en plusieurs fois Version 1.4a Guide d intégration du module de paiement Multiple Magento 1/24 SUIVI,
Plus en détailEncapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.
Encapsulation L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets. La visibilité dépend des membres : certains membres peuvent être visibles et d'autres
Plus en détailContrôler un ordinateur à distance avec Google Chrome
Contrôler un ordinateur à distance avec Google Chrome Lorsque l on a un minimum de connaissances en informatique, on nous demande souvent de résoudre des problèmes sur des PC à l autre bout de la France!
Plus en détailTutorial et Guide TeamViewer
Tutorial et Guide TeamViewer TeamViewer est un programme qui permet de partager son bureau ou prendre la main d'un bureau à distance via internet partout dans le monde, et d'ainsi avoir l'opportunité de
Plus en détailDéveloppement Logiciel
Développement Logiciel Éxamen session 1-2012-2013 (Vendedi 25 mai, 9h-11h) Seuls les documents liés directement au cours sont autorisés (comme dit sur le site) : sujets de TD, notes de cours, notes personnelles
Plus en détailMaîtriser le menu contextuel dans un OfficeBean
Maîtriser le menu contextuel dans un OfficeBean Diffusé Par Le Projet Documentation d'openoffice.org Version 1.0 Aurélie Schröder Université de Genève Division informatique AurelieSch@netcourrier.com Table
Plus en détailApprendre la Programmation Orientée Objet avec le langage Java (avec exercices pratiques et corrigés)
Introduction à la POO 1. Histoire de la POO 9 2. Historique du 12 La conception orientée objet 1. Approche procédurale et décomposition fonctionnelle 13 2. La transition vers l'approche objet 14 3. Les
Plus en détailDis papa, c est quoi un bus logiciel réparti?
Dis papa, c est quoi un bus logiciel réparti? Raphael.Marvie@lifl.fr LIFL IRCICA Equipe GOAL Octobre 2006 10. Des sockets aux bus logiciels répartis 1 0. Une application répartie 2 Objectif Découvrir la
Plus en détailitalc supervision de salle
italc italc supervision de salle 01 Présentation générale : italc est un logiciel de supervision de salles d'ordinateurs. Il fonctionne en mode poste «maitre» et postes «élèves». Avec votre serveur AbulEdu,
Plus en détailEXTENSION WORDPRESS. Contact Form 7. Proposé par :
Contact Form 7 Proposé par : Sommaire Sommaire... 2 Présentation... 3 I. Le Tutoriel... 3 1) Espace de travail... 3 2) Téléchargez les extensions nécessaires... 3 3) Configuration du Formulaire... 7 1)
Plus en détailhttp://www.jdl68160.com/informatique/yawcam.htm
Date de publication: le 11/05/2013 Date de modification le : 19/05/2013-20:45 Edition de la version PDF le 20/05/2013 Yawcam est un petit logiciel gratuit, mais très complet, permettant de diffuser/d'enregistrer
Plus en détail1-Introduction 2. 2-Installation de JBPM 3. 2-JBPM en action.7
Sommaire 1-Introduction 2 1-1- BPM (Business Process Management)..2 1-2 J-Boss JBPM 2 2-Installation de JBPM 3 2-1 Architecture de JOBSS JBPM 3 2-2 Installation du moteur JBoss JBPM et le serveur d application
Plus en détailRapidMiner. Data Mining. 1 Introduction. 2 Prise en main. Master Maths Finances 2010/2011. 1.1 Présentation. 1.2 Ressources
Master Maths Finances 2010/2011 Data Mining janvier 2011 RapidMiner 1 Introduction 1.1 Présentation RapidMiner est un logiciel open source et gratuit dédié au data mining. Il contient de nombreux outils
Plus en détailIntroduction à JDBC. Accès aux bases de données en Java
Introduction à JDBC Accès aux bases de données en Java Eric Cariou Université de Pau et des Pays de l'adour Département Informatique Eric.Cariou@univ-pau.fr 1 Introduction JDBC : Java Data Base Connectivity
Plus en détailAPI04 Contribution. Apache Hadoop: Présentation et application dans le domaine des Data Warehouses. Introduction. Architecture
API04 Contribution Apache Hadoop: Présentation et application dans le domaine des Data Warehouses Introduction Cette publication a pour but de présenter le framework Java libre Apache Hadoop, permettant
Plus en détailAdministration du site (Back Office)
Administration du site (Back Office) A quoi sert une interface d'administration? Une interface d'administration est une composante essentielle de l'infrastructure d'un site internet. Il s'agit d'une interface
Plus en détailJADE : Java Agent DEvelopment framework. Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.
: Java Agent DEvelopment framework Laboratoire IBISC & Départ. GEII Université & IUT d Evry nadia.abchiche@ibisc.univ-evry.fr Introduction à la plateforme JADE 1) Modèle d agent 2) Services 3) Norme FIPA
Plus en détailMicro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance
Micro-ordinateurs, informations, idées, trucs et astuces utiliser le Bureau à distance Auteur : François CHAUSSON Date : 8 février 2008 Référence : utiliser le Bureau a distance.doc Préambule Voici quelques
Plus en détailGénéralités. javadoc. Format des commentaires. Format des commentaires. Caractères spéciaux. Insérer du code
Généralités javadoc Université de Nice - Sophia Antipolis Richard Grin Version 1.4.1 8/2/11 javadoc produit de la documentation en partant de commentaires particuliers insérés dans le code source des classes
Plus en détailTutoriel pour la création d'un Google Sites
Créer un site web gratuitement avec Google Sites Le site des tutoriels Google Sites, pour créer gratuitement un site Google, trucs et astuces, best practice et info technique pour Google Sites, Gmail,
Plus en détailAUVRAY Clément (168187) HOMBERGER Alexandre (186897) GLADE. Langages, outils et méthodes pour la programmation avancée Page 1 sur 12
GTK+ GLADE Page 1 sur 12 SOMMAIRE INTRO 3 Présentation de GTK+ 3 Présentation de GLADE 3 GTK+ 4 Installation 4 Les Widgets 4 Le système de hiérarchie 5 Les signaux 6 GLADE 7 Installation 7 L interface
Plus en détail