2009-12-11 11 views
36

Inizio un servizio in un'attività, quindi desidero che il servizio si interrompa dopo un po '.Come interrompere il servizio da solo?

Ho chiamato stopSelf() nel servizio ma non funziona.

come rendere il servizio si arresta? Grazie!!!

+7

Dal momento che la risposta è "chiamata stopSelf()", che si sta per bisogno di fornire dettagli molto di più per quanto riguarda "lo doens't lavoro". – CommonsWare

+0

hanno bisogno di più contenuti che "non funziona" " – footy

+1

Come una risposta? Sentitevi liberi di contrassegnarlo * accettato * :) –

risposta

4

Se con "non funziona" si intende che il processo non viene ucciso, quindi è così che funziona Android. Il System.exit(0) o Process.killProcess(Process.myPid()) terminerà il processo. Ma non è il modo Android di fare le cose.

HTH

51

Dicendo "non funziona", immagino vuoi dire che il onDestroy() -Metodo del servizio non viene richiamato.

Ho avuto lo stesso problema, perché I bound un po 'di ServiceConnection al Servizio stesso utilizzando la bandiera BIND_AUTO_CREATE. Questo fa sì che il servizio sia mantenuto attivo fino a quando ogni connessione è unbound.

Una volta che cambio di utilizzare nessun flag (zero), non ho avuto problemi ad uccidere il servizio da solo (stopSelf()).

codice Esempio:

final Context appContext = context.getApplicationContext(); 
final Intent intent = new Intent(appContext, MusicService.class); 
appContext.startService(intent); 
ServiceConnection connection = new ServiceConnection() { 
    // ... 
}; 
appContext.bindService(intent, connection, 0); 

Uccidere il servizio (non di processo):

this.stopSelf(); 

Speranza che ha aiutato.

5

dal momento che non ha ancora pubblicare il codice, non posso sapere esattamente cosa si sta facendo, ma è necessario dichiarare ciò che si sta fermando:

this.stopSelf(); 

come in:

public class BatchUploadGpsData extends Service { 
    @Override 
    public void onCreate() { 
     Log.d("testingStopSelf", "here i am, rockin like a hurricane. onCreate service"); 
     this.stopSelf(); 
    } 
+3

Correggetemi se sbaglio, ma non mi fermerei() senza che il "questo" funzioni altrettanto bene? –

+0

@AbrahamPhilip 'questo è esplicito, ma non posso dire se è assolutamente necessario. si prega di verificare se possibile. tks. –

+1

Non è necessario, ma non fa male aggiungerlo per chiarezza –

14

Chiamando stopSelf(), il servizio si ferma.

Assicurati che nessun thread sia in esecuzione in background e ti fa sentire che il servizio non è stato interrotto.

Aggiungere istruzioni di stampa all'interno del thread.

Spero che questo aiuti.

0

Ho appena avuto lo stesso problema. Nel mio caso, ho un singleton service manager che uso per comunicare con il servizio. Nel gestore del servizio viene avviato in questo modo:

context.bindService(new Intent(context, MyService.class), serviceConnection, Context.BIND_AUTO_CREATE); 

Rimuovendo Context.BIND_AUTO_CREATE come suggerito da Alik Elzin, sono stato in grado di fermare il servizio utilizzando this.stopSelf() e di avere OnDestroy() chiamato quando lo fai. Questo problema è che dopo non sono stato in grado di riavviare il servizio dal manager utilizzando il comando precedente.

Infine ho risolto questo problema utilizzando una richiamata dal servizio che indica al responsabile di interrompere il servizio. In questo modo il manager è sempre in carica quando si tratta di avviare/interrompere il servizio e tutto sembra funzionare correttamente.Non so se ci sono controindicazioni nel farlo in questo modo.

Il codice è davvero semplice. Creare una richiamata nel servizio e impostarlo nel gestore come questo nella tua classe di connessione:

private ServiceConnection mServiceConnection = new ServiceConnection() { 
    public void onServiceConnected(ComponentName className, IBinder service) { 
     myService = ((MyService.LocalBinder)service).getService(); 

     myService.setCallback(new MyService.MyServiceCallback() { 
      @Override 
      public void onStop() { 
       stopService(); 
      } 
     }); 
    } 

    public void onServiceDisconnected(ComponentName className) { 
     myService = null; 
    } 
}; 

e arrestare il servizio:

public void stopService() 
{ 
    if(mServiceConnection != null){ 
     try { 
      mContext.unbindService(mServiceConnection); 
     } catch (Exception e) {} 
    } 

    mContext.stopService(new Intent(mContext, BleDiscoveryService.class)); 
} 

Nel servizio, è sufficiente chiamare myCallback.onStop() quando si bisogno di fermarlo

2
stopForeground(true); 
      stopSelf(); 
0

Un altro errore non menzionato qui è quello di lanciare un'eccezione come NPE. Un giorno ho dovuto interrompere InputMethodService e questo hack è stato utile.

0

di lasciare il vostro servizio per fermarsi .. creare una classe BroadcastReceiver .. Nel vostro servizio chiamare il ricevitore come questo ..

Nel servizio

sendBroadcast(new Intent("MyReceiver")); 

In Broadcast Receiver

public class MyReceiver extends BroadcastReceiver { 

    @Override 
    public void onReceive(Context context, Intent intent) { 

     context.stopService(new Intent(context,NotificationService.class)); 
    } 
} 

Manifest f ile

<receiver 
     android:name="MyReceiver" 
     android:enabled="true" 
     android:exported="true"> 
     <intent-filter> 
      <action android:name="MyReceiver"/> 
     </intent-filter> 
    </receiver> 
0

se si utilizza separata Thread nel vostro servizio, dopo l'arresto servizio chiamando stopSelf() o stopService() il Thread continua a funzionare. se volete smettere di Thread u dovrebbero chiamare Thread.interrupted() nel Thread (potrebbe causare un Exception)

Problemi correlati