2011-01-21 14 views
55

Ho un servizio con un gestore che deve scrivere "Ciao" nel logcat ogni 5 secondi. Ma non scrive nulla sul logcat ... È come se il servizio non fosse in esecuzione, e ho inserito un breakpoint su di esso e la modalità di debug non si ferma mai sul breakpoint.Perché questo servizio semplice non si avvia?

ho avviare il servizio, nella prima azione del mio app, con questo:

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

Sono sicuro che il codice startService viene eseguito perché si chiama prima di avviare un'altra attività, e l'altra attività inizia .

Questo è il codice del mio servizio:

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"); 
    }  
} 
+10

hai dichiarato il servizio nel file manifest? – Franco

+0

metti un logcat all'interno di onCreate(), viene usato? Inoltre, quando stai chiamando run() su updateRunnable? Non riesco a vedere che viene eseguito – Jimmy

+0

ohh vero, mi perdoni per mettere in maNIFEST !! grazie – NullPointerException

risposta

163

Hai dichiarato il servizio in AndroidManifest.xml?

+7

Wow, mi sento stupido ora :) Sono sorpreso che non ci siano errori registrati quando succede come per le attività. –

+1

Il rantolo fa quando si rende conto di aver dimenticato qualcosa di così semplice, specialmente dopo aver fatto scorrere su e giù il codice per ore ... lol. – user3635998

+0

Inoltre deve essere dichiarato all'interno della sezione . Non chiedermi come ho scoperto ... – Tequilaman

13

Hi il codice u scrivere sta lavorando bene. Potresti dimenticarti del codice seguente nel file manifest prima di chiudere il tag dell'applicazione.

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

Il mio voto è "prima della chiusura del tag dell'applicazione". I programmatori fanno errori stupidi! –

+0

Questo si presenterebbe se si esegue Analizza ... Esamina il codice nel manifest. – Merk

58

Molto importante: scrivere lo spazio nome correttamente, ad esempio:

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

nel mio AndroidManifest.xml In precedenza era (sbagliato):

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

Nessun servizio avviato e nessun messaggio di errore!

+1

Questa soluzione mi ha davvero aiutato molto! – marcos1490

+0

Imbarazzato per ammetterlo, ma ho passato un'ora a litigare con le cose prima di rendermi conto che questo era il problema anche per me. – Jared

+2

Forse Android Studio avrà più enfasi nel riconoscere questo tipo di problemi ... –

0

Se si utilizza Xamarin Droid il modo più semplice per farlo è quello di contrassegnare la classe come un servizio come questo:

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

Poi non c'è bisogno di metterla in AndroidManifest.xml.