French Comment savoir si un service est en route ?

Oceaneml

Member
Licensed User
Longtime User
Bonjour,
Je suis en train de faire une appli qui enregistre la pression sur plusieurs jours.
J'ai donc utilisé un service START_STICKY avec un StartServeAt pour enregistrer mes données en tache de fond. Jusque là, tout va bien.

Le problème est que quand je veux voir mes données avec le prog qui a lancé la tache de fond et après un certain temps (1 nuit), ce prog a été perdu et je me retrouve avec un FirstTime = True et le prog réinitialise la tache de fond !

Il faut donc que je teste si la tache de fond est active pour pour éviter que le tache soit redémarrée.

J'ai bien trouvé un test "IsBackgroundTaskRunning" mais je n'arrive pas à mettre les bons paramètres.
On demande "ContainerObject As Object" et "TaskId As Int" et je ne sais pas quoi mettre.
Je n'ai pas trouvé d'explication sur les docs ni dans le forum.

Si cette fonction peut me servir, merci de me dire comment l'utiliser ou quel autre moyen je peux utiliser pour me sortir de ce problème.

PS : Le service à tester se nome "Tdf" est son nom de notification "Test Tdf"
A+
 

Informatix

Expert
Licensed User
Longtime User
La seule solution que je connaisse, c'est de regarder si ton service est présent dans la liste des processus (moi, je code en Java pour savoir ça, mais je crois que la bibliothèque "OS library" doit pouvoir te fournir le renseignement).
"IsBackgroundTaskRunning" n'a rien à voir. Ca sert à tester l'état d'un thread.
 

Oceaneml

Member
Licensed User
Longtime User
Ok, merci.
Je vais voir OS library, mais j'ai vu aussi que je pouvais peut-être sauver l'état FirstTime dans un fichier quand je passe dans Activity_Pause...
 

Informatix

Expert
Licensed User
Longtime User
Ok, merci.
Je vais voir OS library, mais j'ai vu aussi que je pouvais peut-être sauver l'état FirstTime dans un fichier quand je passe dans Activity_Pause...
Oui bien sûr mais ça présente un risque: si le service plante, le fichier mentionne que le service a été lancé alors qu'il n'est plus en mémoire. Il vaut mieux aller lire directement la liste des "running services".
 

Oceaneml

Member
Licensed User
Longtime User
Je comprends bien, mais si le service a planté ça ne me sert plus à rien puisque je n'ai plus de données à analyser.
Pour mieux comprendre mon projet, je souhaites analyser les dernières heures (1h, 3h, 24h) de variation de pression atmosphérique pour faire une prévision météo (coup de vent, tempête...) utile pour la navigation.

Donc il faut aussi que je trouve un moyen pour que le service ne plante pas (Dur, Dur !)
 

lemonisdead

Well-Known Member
Licensed User
Longtime User
Hello,

Mes 50 centimes : as-tu envisagé un startforeground ? Si tu as une activité, tu lies ton service à une notification. Le système considère alors que l'application est visible et détruit ce service plus rarement que sticky. L'application ayant lancé le service et liée par l'activité reste active. Le programme d'analyse peut donc continuer à tourner en pause sans repasser par un Firstime=True tant que le service lancé avec startforeground n'a pas été détruit.
Il pourrait donc être intéressant d'envisager ce second service permettant à l'activité de rester active.
 
Last edited:

Oceaneml

Member
Licensed User
Longtime User
Bonjour,

Merci pour l'aide, après plusieurs heures de test avec les différentes possibilités pour les mesures à enregistrer :
- start sticky + timer : pas précis et perte des données en mémoire
- startforeground + timer : plantage après quelques heures

Le meilleur choix est start sticky avec startserviceat (avec une correction du pas pour avoir toujours 10 mesures par heure).
Je sauve les données avec une liste dans un fichier à chaque mesure.
Le programme qui traite les données (graphique et alertes) relit le fichier des données et pour éviter que le service soit relancé, je sauve un flag pour dire que le service est déjà en marche. (first time = false)

Dans ces conditions ça fonctionne bien, le service n'est pas effacé, même si le programme de traitement (et ses données) sont effacées par le système je peux le relancer sans problème.
 

Oceaneml

Member
Licensed User
Longtime User
Bonjour,

J'ai encore quelques problèmes quand je reçois des mails ou des mises à jours. Je pense que le StartServiceAT se plante malgré le Start_Sticky.

Alors j'ai vu que je pouvais peut-être modifier le manifest pour définir un intent filter ?

J'ai recherché sur android developer et j'ai trouvé:

AddPermission(com.android.alarm.permission.SET_ALARM)
AddReceiverText(monprog,
<intent-filter>
<action android:name="android.provider.AlarmClock.ACTION_SET_ALARM" />
</intent-filter>)

Est-ce que c'est bon ?
 
Top