Jump to content
Sign in to follow this  
rubixcube

cherche tuto pour créer un service ( tache de fond)

Recommended Posts

bonjour

pour mon application j'aurais besoin d'un service qui tourne en tâche de fond ( un peu comme les 'task manager' qui vérifie toutes les X secondes le nombre d'appli qui tourne ).

cependant, même en cherchant sur le net je ne trouve rien qui puisse m'aider.

quelqu'un pourrait m'expliquer comment faire ?

Share this post


Link to post
Share on other sites

ben [color=red]jsuis[/color] déjà aller voir le premier lien ( et ceux d'en dessous par la même occasion)

j'adapte ce que je trouve a ce qu'il me faut.

il n'y a pas d'erreur, sa compile.... et après sa fait rien du tout .

j'ai même essayer de regarder avec le logcat en mode débug avec des points d'arret et tout , mais rien n'y fait.

Share this post


Link to post
Share on other sites

j'étais persuadé t avoir répondu rubixcube ^^

tu as eut mon mail avec la programmation de l'alarmmanager pour démarrer le service ?

Intent i = new Intent();

ComponentName comp = new ComponentName(getPackageName(),tonservice.class.getCanonicalName());

i.setComponent(comp);

PendingIntent pending = PendingIntent.getService(this, 0,

i,PendingIntent.FLAG_UPDATE_CURRENT);

AlarmManager amgr = (AlarmManager) getSystemService(ALARM_SERVICE);

amgr.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(),15000, pending);

si tu mets ce bout de code sur un bouton ton service s exécutera toutes les 15 secondes même une fois l activity fermée.

attention évidement à ne pas killer les tâches avec un taskiller ou autre.

Si tu veux démarrer au boot tu fais un brodcastreceiver qui capte le boot et tu mets ce bout de code dans le onReceive.....

Share this post


Link to post
Share on other sites

ok popolbx merci.

j'ai pas (encore) reçus ton mail.

jvais tester ça cette aprem, je verrai ce que sa donne.

Share this post


Link to post
Share on other sites

si je déclare tout le machin au début, et que je met uniquement

amgr.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(),15000, pending);

dans le bouton, sa devrait marcher non ?

Share this post


Link to post
Share on other sites

soit j'ai merdé quelque part, soit j'ai merdé quelque part, mais en tout cas, sa marche pas !

j'ai mis ton code popol, en mettant bien mon nom de service et tout ce qu'il faut, mais

1° quand j'essaye de le mettre sur un bouton je me retrouve avec un nullpointerexception ( ?? )

2° quand je le met directement comme ça, l'ui de l'appli ( qui se lance d'habitude) ne se lance pas, et après il ne se passe rien.

EDIT : j'ai essayer de remettre monancien code, et j'ai aussi une nullpointerexception sur

 bouton.setOnClickListener(new Button.OnClickListener() {
           public void onClick(View v) {
               affichNotification() ;
           }
       });

Edited by rubixcube

Share this post


Link to post
Share on other sites

bon alors j'ai bidouiller un peu hier soir, j'ai un truc qui remarche enfin.

le soucis que j'ai maintenant, c'est que j'ai du raté quelque chose au niveau du service.

j'ai copié le code de popolbx, je lance le programme , la fenêtre de mon activity se lance et .... ba mon service fait rien ( j'appelle le service dés le début de l'activité)

package rubix.sms.notifier;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class SmsService extends Service{

   public smsnotifier sms = new smsnotifier() ;
   @Override
   public void onCreate(){
       super.onCreate();

   }
   public void startservice() {

   sms.affichNotification() ;

   }
   @Override
   public IBinder onBind(Intent arg0) {
       // TODO Auto-generated method stub
       return null;
   }

}

voila l code de mon service, smsnotifier étant l'activité et affichNotification la fonction qui traite tout le bordel et l'envoi de la barre de notif.

ou est ce que j'ai merdé ? si quelqu'un peut m'aider je lui en serait reconnaissant .

Share this post


Link to post
Share on other sites

il est où le onStart dans le service ?c est la méthode onStart qui va s exécuter ...si elle est pas surchargée. ..le startservice ne sers a rien (renomme le onStart )

Share this post


Link to post
Share on other sites

ok ( donc j'avais rien compris au tuto en anglais que j'avais trouvé ><' )

Share this post


Link to post
Share on other sites

Basiquement t'as pas grand chose à faire :

tu fais une classe service

et dans l'activity:

//tu créés un intent
serviceIntent = new Intent(this, TaClasseService.class);
//tu lances le service
startService(serviceIntent);
//et tu le stoppes
stopService(serviceIntent);

Et en plus de ça Popolbx t'as filé ce qu'il faut pour lancer le service en dehors de l'activity.

Edited by dekans

Share this post


Link to post
Share on other sites

I NEED HEEEEEELLLLLPPPPPPP !

j'ai essayé et le code de popolbx et le bout de code de dekans et ça ne marche pas mon appli se lance, affiche l'écran de l'activity et puis rien ne se passe ... :'(

actuellement j'ai

Intent i = new Intent();
       ComponentName comp = new ComponentName(getPackageName(),SmsService.class.getCanonicalName());
       i.setComponent(comp); 
       PendingIntent pending = PendingIntent.getService(this, 0, i,PendingIntent.FLAG_UPDATE_CURRENT);
       AlarmManager amgr = (AlarmManager) getSystemService(ALARM_SERVICE);
       amgr.setRepeating(AlarmManager.RTC, SystemClock.elapsedRealtime(),15000, pending);

dans le oncreate de l'activity.

et mon service

package rubix.sms.notifier;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class SmsService extends Service{

   public smsnotifier sms = new smsnotifier() ;
   @Override
   public void onCreate(){
       super.onCreate();

   }
   public void onStart() {

       sms.affichNotification() ;

   }
   @Override
   public IBinder onBind(Intent arg0) {
       // TODO Auto-generated method stub
       return null;
   }

}

affichnotification() étant la fonction qui permet d'afficher ce que je veux. ( et qui marche si je l'appelle directement depuis l'activity, part un bouton par exemple).

quelqu'un aurait une solution ?

Edited by rubixcube

Share this post


Link to post
Share on other sites

là j 'ai deux remarques:

1 - il manque le override sur le onStart

2 - pour choper la notification, il faut un Context. hors ton smsnotifier n'a pas de COntext en paramètres et ton affichenotification non plus....comment la fonction va créer sa notification ?

si on pouvait avir le code de affichenotification ^

Share this post


Link to post
Share on other sites

alors je vais répondre point par point :

1° bien vue, je vais le rajouter

voila le code fonction affichnotification

Uri sms = Uri.parse("content://sms/sent");// chemin(URI) contenant les sms envoyés
       final Cursor c = managedQuery(sms, SMS_REPORT_STATUS_PROJECTION, null, null, null);//requête SQLlite

       String contentText = "" ;
       c.moveToFirst() ;
       contentText = c.getString(0) + "/" + getSmsStatusText(c.getInt(1))  ;

       final String text = contentText ;

       final NotificationManager myNM = (NotificationManager) getSystemService(NOTIFICATION_SERVICE); 

       myNM.notify(1,getNotification(c,text));

       c.close();

et le code de getNotification

long when = System.currentTimeMillis();
       int icon = R.drawable.icon;
       CharSequence tickerText = "Notification sms accusé de réception";
       final Notification notif = new Notification(icon, tickerText, when);

       Context context = getApplicationContext();
       CharSequence contentTitle = "longueur curs" + curs.getCount();
       Intent notificationIntent = new Intent(this, smsnotifier.class);
       PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
       notif.setLatestEventInfo(context, contentTitle,text, contentIntent);
       return notif ;

Share this post


Link to post
Share on other sites

correction :

lorsque je rajoute @Override devant public void onStart() {

il me met une erreur, l'erreur étant :

the method onStart() of type SmsService must override or implement a supertype method

( gné ??)

et il me propose comme solution .... d'enlever le @Override :/

Share this post


Link to post
Share on other sites

Il manque des choses dans ton corps de onStart()

@Override
   public void onStart(Intent intent, int startId) {
       super.onStart(intent, startId);

}

Edited by Burn2

Share this post


Link to post
Share on other sites

j'ai essayé de relancer l'application et j'ai un FC

voici l'erreur sortie du logcat ( d'ailleurs j'y comprend rien a cette erreur :/ )

06-13 13:02:49.503: ERROR/AndroidRuntime(3298): Uncaught handler: thread main exiting due to uncaught exception
06-13 13:02:49.523: ERROR/AndroidRuntime(3298): java.lang.RuntimeException: Unable to start service rubix.sms.notifier.SmsService@43b3d080 with Intent { flg=0x4 cmp=rubix.sms.notifier/.SmsService (has extras) }: java.lang.NullPointerException
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2882)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.ActivityThread.access$3500(ActivityThread.java:119)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1926)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.os.Handler.dispatchMessage(Handler.java:99)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.os.Looper.loop(Looper.java:123)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.ActivityThread.main(ActivityThread.java:4363)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at java.lang.reflect.Method.invokeNative(Native Method)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at java.lang.reflect.Method.invoke(Method.java:521)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at dalvik.system.NativeStart.main(Native Method)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298): Caused by: java.lang.NullPointerException
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.content.ContextWrapper.getContentResolver(ContextWrapper.java:90)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.Activity.managedQuery(Activity.java:1495)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at rubix.sms.notifier.smsnotifier.affichNotification(smsnotifier.java:70)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at rubix.sms.notifier.SmsService.onStart(SmsService.java:18)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.Service.onStartCommand(Service.java:306)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     at android.app.ActivityThread.handleServiceArgs(ActivityThread.java:2873)
06-13 13:02:49.523: ERROR/AndroidRuntime(3298):     ... 10 more

Share this post


Link to post
Share on other sites

"06-13 13:02:49.523: ERROR/AndroidRuntime(3298): Caused by: java.lang.NullPointerException"

Voilà ou est le prpoblème...

Share this post


Link to post
Share on other sites

alors ma question est, pourquoi j'ai un nullpointerexception ? est ce que l'erreur viendrait pas plutot du intent

Unable to start service rubix.sms.notifier.SmsService@43b3d080 with Intent { flg=0x4 cmp=rubix.sms.notifier/.SmsService (has extras) }

Share this post


Link to post
Share on other sites

la ligne 70 de smsnotifier.java correspond à ma requête sql :

final Cursor c = managedQuery(sms, SMS_REPORT_STATUS_PROJECTION, null, null, null);//requête SQLlite

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  





×
×
  • Create New...