Jorodan Posté(e) 22 octobre 2010 Share Posté(e) 22 octobre 2010 Amis HardCodeurs, j'ai besoin de votre avis. Je commence une liste de Tutoriels "Bonnes pratiques" dans http://wiki.frandroid.com/wiki/D%C3%A9veloppement_Android#Tutoriels_par_cat.C3.A9gories Ma première idée est le service récurrent. J'ai besoin de votre avis pour écrire un truc bon. Voici l'implémentation que je propose : package org.frandroid.tutoriels; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.util.Log; public class MonService extends Service { private LocalBinder binder = new LocalBinder(); private Handler mHandler = new Handler(); private long frequency = 60 * 1000 * 2; @Override public IBinder onBind(Intent intent) { return binder; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); mHandler.removeCallbacks(mActionRecurrente); mHandler.postDelayed(mActionRecurrente, 1); } @Override public void onDestroy() { mHandler.removeCallbacks(mActionRecurrente); super.onDestroy(); } public class LocalBinder extends Binder { MonService getService() { return MonService.this; } } private Runnable mActionRecurrente = new Runnable() { public void run() { Log.d("Action", "Je suis récurrent toutes les 2 minutes."); mHandler.postDelayed(this, frequency); } }; } Comme vous voyez, j'utilise une retard sur un handler plutôt que par le AlarmManager comme conseillé ici : http://android-developers.blogspot.com/2007/11/stitch-in-time.html Pensez vous que c'est une "bonne pratique" ??? (ps : je vous invite à faire pleins de tutos comme ca avec moi). Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 octobre 2010 Share Posté(e) 22 octobre 2010 nan, l'alarm manager est plus adapté si ton appli est tuée, je crois que ton handler est détruit (contrairement à alarm) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 22 octobre 2010 Auteur Share Posté(e) 22 octobre 2010 Non non il n'a pas l'air d'être coupé ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 octobre 2010 Share Posté(e) 22 octobre 2010 http://developer.android.com/reference/android/app/AlarmManager.html Note: The Alarm Manager is intended for cases where you want to have your application code run at a specific time, even if your application is not currently running. For normal timing operations (ticks, timeouts, etc) it is easier and much more efficient to use Handler. donc ça dépend de ce que tu veux faire :P si c'est un texte qui clignote, Handler est plus adapté si tu dois faire une requete http à intervalle régulier, AlarmManager est plus adéquat Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 22 octobre 2010 Auteur Share Posté(e) 22 octobre 2010 Ok ! Je vais modifier mon code en conséquence ! Je reviens vers vous pour proposer une nouvelle version :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 22 octobre 2010 Share Posté(e) 22 octobre 2010 et si tu décides d'arreter tes évènements récurrents, il faut pour cela : - cancel dans l'AlarmManager - ne pas oublier de stop le service Lien vers le commentaire Partager sur d’autres sites More sharing options...
ichpa Posté(e) 22 octobre 2010 Share Posté(e) 22 octobre 2010 Bonjour Jorandan, Effectivement l'utilisation d'un couple Service/Handler n'est pas réellement adapter dans ton exemple. Le couple AlarmManager/BrodcastReceiver me semble une meilleur alternative. Un site "in english" pas mal pour ce type de problématique est http://www.androidguys.com. Il y'a par exemple ce billet sur le sujet ici. Bon courage, ichpa Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 25 octobre 2010 Auteur Share Posté(e) 25 octobre 2010 Dès que j'ai le temps je le refais :) Merci pour votre participation :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 28 octobre 2010 Auteur Share Posté(e) 28 octobre 2010 Nouvelle proposition ! Qu'en pensez vous ? package org.frandroid.tutoriels; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.util.Log; public class MonService extends Service { private LocalBinder binder = new LocalBinder(); private Handler mHandler = new Handler(); private long frequency = 60 * 1000 * 2; private static boolean started = false; @Override public IBinder onBind(Intent intent) { return binder; } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); MesActions } @Override public void onDestroy() { super.onDestroy(); } public class LocalBinder extends Binder { MonService getService() { return MonService.this; } } public final static void scheduleService(Context context) { if (!started) { Intent newIntent = new Intent(context, MonService.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, newIntent, 0); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, 0, frequency, pendingIntent); } started = true; } public final static void unscheduleService(Context context) { if (started) { Intent newIntent = new Intent(context, MonService.class); PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, newIntent, 0); AlarmManager am = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); am.cancel(pendingIntent); } started = false; } } L'intéret vient des deux méthodes statiques pour lancer le service par l'Alarm Manager Lien vers le commentaire Partager sur d’autres sites More sharing options...
Pierre87 Posté(e) 30 octobre 2010 Share Posté(e) 30 octobre 2010 Pour moi, il y a plusieurs choses qui ne "vont pas" :P Tu utilises PendingIntent.getBroadcast() pour démarrer un service :P (sauf si je me trompe) Tu oublies de "stop" ton service dans unscheduleService() Ce qui veut dire que ton service continue de "tourner" :P Que se passe t-il quand un service est lancé? L'appli reste "chargée", et le système ne peut pas la dégager. Si on la tue via un TaskKiller, elle se relance. Comme tu utilises un AlarmManager, il n'est pas nécessaire que l'application continue de "tourner". Et le fait que tu utilises un service oblige le système à garder ton appli active. Mon conseil : - Garde l'AlarmManager - Utilise PendingIntent.getBroadcast() pour lancer un broadcast (et non démarrer un service) à intervalle régulier Par contre, ça oblige à déclarer un BroadcastReceiver dans ton manifest.xml (car ton appli peut ne pas être lancée au moment du Broadcast) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Jorodan Posté(e) 17 janvier 2011 Auteur Share Posté(e) 17 janvier 2011 Ok je vais faire avec le Broadcast ! Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Recommended Posts
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.