Aller au contenu

répétition périodique de tâche


Kokiyas25

Recommended Posts

Bonjour à tous, Je souhaiterais que mon application teste périodiquement le niveau de ma batterie et envoie un SMS en dessous d'un certain seuil. Le test du niveau de batterie fonctionne, l'nevoie de SMS aussi mais le problème c'est que je n'arrive pas à tester périodiquement la batterie. J'utilise pourtant scheduleAtFixedRate dans laquelle je passe en paramétre une tâche préalablement créée "TimerTask task = new TimerTask(){" mais rien ne se passe. Ci dessous mon code (j'ai glissé des toast un peu partout histoir de voir si tel ou tel morceau de code était bien utilisé). Si quelqu'un peut m'aider merci beaucoup

package android.telephony.gsm;

import java.util.Timer;

import java.util.TimerTask;

import android.app.Service;

import android.content.Context;

import android.content.Intent;

import android.os.IBinder;

import android.util.Log;

import android.widget.Toast;

public class sms extends Service {

//private Timer timer;

public void onCreate(){

//Création du toast//

Context context = getApplicationContext();

int duration = Toast.LENGTH_LONG;

String msg="Battery ALerting activated";

Toast toast=Toast.makeText(context, msg, duration);

toast.show();

}

public void onStart(final Intent intent, int startId){

super.onStart(intent, startId);

Log.d(this.getClass().getName(), "onStart");

//initialisation des variables pour calcul de la charge de la batterie//

int level = intent.getIntExtra("level",-1);

int maxValue= intent.getIntExtra ("scale",-1);

int chargedPct = (level * 100)/maxValue;

//création du toast pour afficher la charge

Context context = getApplicationContext();

int duration = Toast.LENGTH_LONG;

String msgcharge="Charge =" + chargedPct ;

Toast toast2=Toast.makeText(context, msgcharge, duration);

toast2.show();

Timer timer = new Timer();

String Stimer="timer =" + timer ;

Toast toast3=Toast.makeText(context, Stimer, duration);

toast3.show();

// Création de la tâche qui sera lancée périodiquement

//class launchsms extends TimerTask{

TimerTask task = new TimerTask(){

public void run () {

//initialisation des variables pour calcul de la charge de la batterie//

int level = intent.getIntExtra("level",-1);

int maxValue= intent.getIntExtra ("scale",-1);

int chargedPct = (level * 100)/maxValue;

//création du toast pour afficher la charge

Context context = getApplicationContext();

int duration = Toast.LENGTH_LONG;

String msgcharge="Charge2 =" + chargedPct ;

Toast toast2=Toast.makeText(context, msgcharge, duration);

toast2.show();

//envoie des SMS sur condition//

if (chargedPct >= 50 )

{ final android.telephony.SmsManager sms = android.telephony.SmsManager.getDefault();

sms.sendTextMessage ("numéro de tel",null,"Charge de la batterie supérieur à 50%",null,null);

}

if (chargedPct < 50 )

{ final android.telephony.SmsManager sms = android.telephony.SmsManager.getDefault();

sms.sendTextMessage ("numéro de tel",null,"Charge de la batterie inférieur à 50%, vous devriez recharger",null,null);

}

}

};

//lancement période que la tâche

timer.scheduleAtFixedRate(task,1000,6000);

timer.cancel();

String S2timer="timer =" + timer;

Toast toast4=Toast.makeText(context, S2timer, duration);

toast4.show();

}

@Override

public IBinder onBind(Intent intent) {

// TODO Auto-generated method stub

return null;

}

}

Lien vers le commentaire
Partager sur d’autres sites

Il n'y a pas que le cancel() qui est bizarre:

- le nom du package dans lequel se situe ta classse (android.telephony.gsm), qui est un package Android: pas une bonne idée de réutiliser le nom d'un package existant

- la façon dont tu récupères l'état de la batterie; si on fait abstraction du cancel(), au mieux, ton timer va récupérer l'état de la batterie en "scannant" régulièrement le même Intent (celui qui a servi à lancer le service). Or, la doc Android indique que l'intent d'état de la batterie (ACTION_BATTERY_CHANGED) ne peut être récupéré que en s'enregistrement explicitement en tant que brodcastReceiver (ce qui voudrait dire que l'on est alors notifié en temps réel du changement d'état de la batterie, et qu'un timer n'est même pas nécessaire)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour,

Comme le dit chpil, dans tous les cas, l'utilisation d'un java.util.Timer n'est pas adaptée dans ton cas. Tu risques de vider la batterie et en plus Android peut décider de tuer ton Service.

java.util.Timer est utile pour les petites tâches récursives de mise à jour (un chronomètre dans l'interface graphique typiquement). Pour les vérifications périodiques en tâche de fond, il faut privilégier l'utilisation de android.app.AlarmManager (prévu pour et moins énergivore).

Dans ton cas, il y'a encore mieux, il faut que tu instancie dans ton service un broadcast receiver qui intercepte les événements ACTION_BATTERY_CHANGED. Comme ça ton traitement ne se lance que lorsque l'état de la battery est modifié.

Bon courage,

ichpa

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...