2011-01-22 11 views
93

Desidero chiamare un servizio all'avvio di una determinata attività. Quindi, ecco la classe di servizio:Avvio del servizio in Android

public class UpdaterServiceManager extends Service { 

    private final int UPDATE_INTERVAL = 60 * 1000; 
    private Timer timer = new Timer(); 
    private static final int NOTIFICATION_EX = 1; 
    private NotificationManager notificationManager; 

    public UpdaterServiceManager() {} 

    @Override 
    public IBinder onBind(Intent intent) { 
     // TODO Auto-generated method stub 
     return null; 
    } 

    @Override 
    public void onCreate() { 
     // Code to execute when the service is first created 
    } 

    @Override 
    public void onDestroy() { 
     if (timer != null) { 
      timer.cancel(); 
     } 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startid) { 
     notificationManager = (NotificationManager) 
       getSystemService(Context.NOTIFICATION_SERVICE); 
     int icon = android.R.drawable.stat_notify_sync; 
     CharSequence tickerText = "Hello"; 
     long when = System.currentTimeMillis(); 
     Notification notification = new Notification(icon, tickerText, when); 
     Context context = getApplicationContext(); 
     CharSequence contentTitle = "My notification"; 
     CharSequence contentText = "Hello World!"; 
     Intent notificationIntent = new Intent(this, Main.class); 
     PendingIntent contentIntent = PendingIntent.getActivity(this, 0, 
       notificationIntent, 0); 
     notification.setLatestEventInfo(context, contentTitle, contentText, 
       contentIntent); 
     notificationManager.notify(NOTIFICATION_EX, notification); 
     Toast.makeText(this, "Started!", Toast.LENGTH_LONG); 
     timer.scheduleAtFixedRate(new TimerTask() { 

      @Override 
      public void run() { 
       // Check if there are updates here and notify if true 
      } 
     }, 0, UPDATE_INTERVAL); 
     return START_STICKY; 
    } 

    private void stopService() { 
     if (timer != null) timer.cancel(); 
    } 
} 

Ed ecco come lo chiamo io:

Intent serviceIntent = new Intent(); 
serviceIntent.setAction("cidadaos.cidade.data.UpdaterServiceManager"); 
startService(serviceIntent); 

Il problema è che non succede nulla. Il blocco di codice sopra riportato viene chiamato alla fine dell'attività onCreate. Ho già eseguito il debug e non viene generata alcuna eccezione.

Qualche idea?

+1

Attento con Timer - per quanto ne so quando il tuo servizio è spento gratuitamente risorse questo timer non verrà riavviato quando il servizio viene riavviato.Hai ragione. '' START_STICKY'' riavvierà il servizio, ma solo onCreate viene chiamato e il timer var non verrà reinizializzato. Puoi giocare con '' 'START_REDELIVER_INTENT''', il servizio di allarme o l'Utilità di pianificazione lavori API 21 per risolvere il problema. – georg

+0

Nel caso in cui tu abbia dimenticato, assicurati di aver registrato il servizio nel manifest Android usando '' all'interno del tag dell'applicazione. –

risposta

227

Probabilmente non hai il servizio nel tuo manifest o non ha uno <intent-filter> corrispondente alla tua azione. Esaminare LogCat (tramite adb logcat, DDMS o la prospettiva DDMS in Eclipse) dovrebbe attivare alcuni avvisi che potrebbero essere di aiuto.

Più probabilmente, si dovrebbe iniziare il servizio tramite:

startService(new Intent(this, UpdaterServiceManager.class)); 
+0

Come si può eseguire il debug? mai chiamato il mio servizio, il mio debug non mostra nulla – delive

+0

Aggiungi un shitton di tag Log.e ovunque: prima di avviare il servizio, il risultato dell'intenzione del servizio, all'interno della classe di servizio in cui viaggerebbe (onCreate, onDestroy, qualsiasi e tutti metodi). – Zoe

69
startService(new Intent(this, MyService.class)); 

Basta scrivere questa linea non era sufficiente per me. Il servizio non funzionava ancora. Tutto aveva funzionato solo dopo la registrazione del servizio a manifestare

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 

    ... 

    <service 
     android:name=".MyService" 
     android:label="My Service" > 
    </service> 
</application> 
+1

Il miglior esempio per imparare tutto ciò che riguarda i servizi in Android http://coderzpassion.com/implement-service-android/ e scusa per il ritardo –

42

codice Java per inizioservizio:

servizio Inizio da Attività:

startService(new Intent(MyActivity.this, MyService.class)); 

servizio Inizio da Frammento :

getActivity().startService(new Intent(getActivity(), MyService.class)); 

MyService.java:

import android.app.Service; 
import android.content.Intent; 
import android.os.Handler; 
import android.os.IBinder; 
import android.util.Log; 

public class MyService extends Service { 

    private static String TAG = "MyService"; 
    private Handler handler; 
    private Runnable runnable; 
    private final int runTime = 5000; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     Log.i(TAG, "onCreate"); 

     handler = new Handler(); 
     runnable = new Runnable() { 
      @Override 
      public void run() { 

       handler.postDelayed(runnable, runTime); 
      } 
     }; 
     handler.post(runnable); 
    } 

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

    @Override 
    public void onDestroy() { 
     if (handler != null) { 
      handler.removeCallbacks(runnable); 
     } 
     super.onDestroy(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     return START_STICKY; 
    } 

    @SuppressWarnings("deprecation") 
    @Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 
     Log.i(TAG, "onStart"); 
    } 

} 

Definire questo servizio in File manifesto del progetto:

Aggiungi al di sotto di tag nel Manifest di file:

<service android:enabled="true" android:name="com.my.packagename.MyService" /> 

Fatto

+7

Quanto migliora le prestazioni quando lascio attività e servizi nello stesso pacchetto? Mai sentito prima. – OneWorld

+0

Forse intendevano le prestazioni in un senso molto vago, non sulla velocità della corsa? –

2

mi piace per renderlo più dinamico

Class<?> serviceMonitor = MyService.class; 


private void startMyService() { context.startService(new Intent(context, serviceMonitor)); } 
private void stopMyService() { context.stopService(new Intent(context, serviceMonitor)); } 

non dimenticare il manifesto

<service android:enabled="true" android:name=".MyService.class" /> 
-2

ACTIVITA: startService(new Intent(this,ChatService.class));

Manifest -

<service 
    android:name=.ChatService" 
    android:enabled="true" 
    android:process=":ChatProcess"/> 
Problemi correlati