75 votes

Pourquoi ce simple service ne démarre-t-il pas ?

J'ai un service avec un handler qui doit écrire "Hello" dans le logcat toutes les 5 secondes. Mais il n'écrit rien dans le logcat... C'est comme si le service ne s'exécutait pas, et je mets un point d'arrêt sur lui et le mode débogage ne s'arrête jamais sur le point d'arrêt.

Je lance le service, dans la première activité de mon application, avec ceci :

startService(new Intent(GPSLoc.this, MyServiceNotifications.class)); //enciendo el service

Je suis sûr que le code startService est exécutée parce qu'elle est appelée avant de lancer une autre activité, et l'autre activité démarre.

C'est le code de mon service :

public class MyServiceNotifications extends Service {

    boolean serviceStopped;

    private Handler mHandler;
    private Runnable updateRunnable = new Runnable() {
        @Override
        public void run() {
            if (serviceStopped == false)
            {
                createNotificationIcon();
            }
            queueRunnable();
        }
    };

    private void queueRunnable() {
        // 600000 : cada 10 minutos, comprueba si hay nuevas notificaciones y actualiza la
        // notification BAR
        mHandler.postDelayed(updateRunnable, 5000);

    }

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        serviceStopped = false;

        // //////////////////////////////////////MANEJADOR SIMILAR A UN HILO
        mHandler = new Handler();
        queueRunnable();
        // ///////////////////////////////////// FIN MANEJADOR
    }

    @Override
    public void onDestroy() {
        serviceStopped = true;
    }

    @Override
    public void onStart(Intent intent, int startid) {

    }

    public void createNotificationIcon()
    {
        Log.d("MyServiceNotifications", "Hello");
    }    
}

12 votes

Avez-vous déclaré le service dans le fichier manifeste ?

0 votes

Mettre un logcat dans onCreate(), est-ce qu'il est utilisé ? De plus, quand appelez-vous run()sur updateRunnable ? Je ne vois pas comment il est exécuté

0 votes

Ohh vrai, j'oublie de mettre le maNIFEST !! merci

210voto

Franco Points 3426

Avez-vous déclaré le service en AndroidManifest.xml ?

15 votes

Wow, je me sens stupide maintenant :) Je suis surpris qu'il n'y ait pas d'erreur enregistrée lorsque cela se produit, comme c'est le cas pour les activités.

2 votes

Le souffle que l'on pousse lorsqu'on se rend compte que l'on a oublié quelque chose d'aussi simple, surtout après avoir fait défiler le code de haut en bas pendant des heures... lol.

2 votes

Il doit également être déclaré dans la section <application ... <application/>. Ne me demandez pas comment je l'ai découvert.....

69voto

Seraphim's Points 2393

Très important : écrire le espace du nom correctement, par exemple :

<service android:name="com.example.data.synchronization.SynchronizationService"/>

dans mon AndroidManifest.xml auparavant, c'était (faux) :

<service android:name="com.example.data.SynchronizationService"/>

Aucun service n'a été lancé y aucun message d'erreur !

1 votes

Cette solution m'a vraiment beaucoup aidé !

0 votes

J'ai honte de l'admettre, mais j'ai passé une heure à faire des manipulations avant de réaliser que c'était aussi mon problème.

2 votes

Peut-être qu'Android Studio mettra davantage l'accent sur la reconnaissance de ce type de problèmes...

19voto

VenkaReddy Points 1282

Bonjour, le code que vous avez écrit fonctionne bien. Peut-être avez-vous oublié d'ajouter le code suivant dans le fichier manifest avant de fermer le tag de l'application.

<application>
    ....
    <service android:name=".MyServiceNotifications"/>
</application>

2 votes

Je vote pour "avant la fermeture de la balise d'application". Les programmeurs font des erreurs stupides !

1 votes

Cela apparaîtrait si vous exécutez Analyze...Inspect Code dans le manifeste.

9voto

dbm Points 3814

Dans certaines circonstances, vous devez également attribuer la valeur "true" à l'attribut "enabled" lorsque vous le définissez dans le manifeste, par exemple :

<service android:enabled="true" android:name=".MyServiceNotifications" />

Voir ce lien pour plus d'informations : http://developer.Android.com/guide/topics/manifest/service-element.html

2 votes

" La valeur par défaut est true ."

3voto

noelicus Points 3788

Si vous utilisez Xamarin Droid, la manière la plus simple de le faire est de marquer la classe comme un service comme ceci :

[Service]
public class LongRunningTaskService : Service
{
    ...
}

Il n'est donc pas nécessaire de le mettre dans le fichier AndroidManifest.xml.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X