Bonjour à tous,

J'ai deja beaucoup manipulé les services par le passé au sein de différentes applications et dans des buts différents ; je pense(-ais ? :p) en connaitre un rayon sur les Services mais récemment je me suis retrouvé embêté avec la méthode stopService() d'un Service que j'ai codé afin de tourner en Background afin de réaliser des appels webservices toutes les 2 heures.

Jusqu'ici, rien d'exceptionnel sauf que ce service peut être "désactivé" par l'utilisateur mais qu'une fois activé, il doit tourner même si l'application est tuée (STICKY) et également se redémarrer au BOOT_COMPLETED.

Tout cela fonctionne correctement SAUF le stopService() que j'utilise pour le désactiver tel que ::
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 
public void doStartOrStopBackgroundService() {
        if (! isSyncMode1Activated && ! isSyncMode2Activated) {
            // stop the service if it's running ::
            if (isServiceRunning("<package.name.du.service>")) {
                Log.e(TAG, ">> Stops BackGroundService");
                Intent intent = new Intent(this, BackgroundService.class);
                stopService(intent);
            }
        } else {
            // Launch the BackgroundService if it's not already running ::
            if ( ! isServiceRunning("<package.name.du.service>")) {
                Log.e(TAG, ">> Starts BackGroundService");
                Intent intent = new Intent(this, BackgroundService.class);
                startService(intent);
            } else {
                Log.e(TAG, "This service was already running in background !");
            }
        }
    }
 
    public boolean isServiceRunning(String serviceClassName){
        final ActivityManager activityManager = (ActivityManager) this.getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        final List<ActivityManager.RunningServiceInfo> services = activityManager.getRunningServices(Integer.MAX_VALUE);
        for (ActivityManager.RunningServiceInfo runningServiceInfo : services) {
            // Log.i(TAG, runningServiceInfo.service.getClassName());
            if (runningServiceInfo.service.getClassName().equals(serviceClassName)){
                return true;
            }
        }
        return false;
    }
où les isSyncMode1Activated et isSyncMode2Activated sont gérés via des toggleButton inApp.

Mon soucis ::
- j'ai ajouté un timer dans le service pour me logger "Running" toutes les secondes.
- quand j'execute stopService(intent), je passe bien dans la méthode onDestroy() du service mais malgré cela les Logs continuent à apparaitre ! (et même après 10-15mn)
- J'ai pu observer que le service, si on kill l'application, ne se restart plus de façon automatique malgré le STICKY.
- par conséquent il est bien considéré comme "killed" mais continue malgré tout à vivre et à s'executer (appels WS)

Mon gros problème après avoir lu la doc officielle qui stipule que le service est considéré comme tué mais ne le sera vraiment qu'au moment où l'OS le décidera afin de regagner de la ressource (autant dire potentiellement jamais???), c'est que du point de vue de mon application :
- il réalise toujours les appels WS (consommant data et énergie)
- si l'utilisateur s'amuse à switcher on/off sur le toggleButton, cela créera une multitude de Service "zombies" qui feront autant d'appels WS au lieu d'un seul...

Résultat, pour l'instant, j'ai juste envie d'en faire tourner un de façon infinie même si je désactive son action plutôt que de faire appel à stopService(intent) afin de m'assurer de ne pas avoir plusieurs Service inutiles à un instant T.

Je préférerai bien entendu stopper mon Service (Bonne pratique) mais a condition de pouvoir complètement le tuer instantanément...

Quelqu'un pourrait t'il m'éclairer sur le sujet?

D'avance merci