2010-02-01 10 views
23

Attualmente ho un servizio che funziona correttamente quando lo avvio ma quando provo a fermarlo usando il metodo stopService il suo metodo onDestroy non viene chiamato.Il servizio non si interrompe quando viene chiamato il metodo stopService

Ecco il codice che uso per cercare di fermare il Servizio

stop_Scan_Button = (Button) findViewById (R.id.stopScanButton);

stop_Scan_Button.setOnClickListener(new View.OnClickListener(){ 
    public void onClick(View v){ 
     Log.d("DEBUGSERVICE", "Stop Button pressed"); 
     Intent service = new Intent(CiceroEngine. CICERO_SERVICE); 
     releaseBind(); 
     Log.d("Stop_Scan_Button", "Service: " + service.toString()); 
     stopService(service); 
     Log.d("Stop_Scan_Button", "Service should stop! "); 

     } 
}); 

Ho ragione nel pensare che quando stopService viene utilizzato chiama il metodo onDestroy del Servizio? Quando premo il tasto stop scan, il metodo onDestroy() nel mio servizio non viene chiamato.

C'è qualcos'altro che mi manca che dovrei inserire per interrompere il servizio?

MODIFICA: per aggiungere onServiceConnected() viene chiamato quando stopService viene eseguito anziché onServiceDisconnected(), perché ciò accadrebbe?

EDIT: Per aggiungere ulteriori informazioni riguarda Binding

io chiamo bindService nel onCreate() e poi ho il metodo releaseBind() non associare il Servizio.

Qui è il codice per quel metodo:

public void releaseBind(){ 
    unbindService(this); 
    } 

quindi suppongo che la non vincolante non è il mio problema?

risposta

42

ho intenzione di indovinare che il vostro avendo una chiamata di metodo per releaseBind() significa che in precedenza chiamato bindService() su questo servizio e che releaseBind() sta chiamando unbindService(). Se la mia ipotesi non è corretta, si prega di ignorare questa risposta.


Un servizio verrà chiuso dopo tutte le chiamate bindService() hanno avuto i loro corrispondenti unbindService() chiamate. Se non ci sono client associati, il servizio avrà anche bisogno di stopService() se e solo se qualcuno ha chiamato il servizio startService().

Quindi, ci sono alcune possibilità qui:

  1. È clienti hanno ancora legati (per esempio, altre attività), nel qual caso non è possibile arrestare il servizio fino a quando non rimuovi l'assegnazione di
  2. Dato che sia unbindService() e stopService() sono asincroni, qualcosa potrebbe andare in tilt con i tempi, nel qual caso si può ottenere una migliore fortuna se si chiama dal tuo stopService()ServiceConnection 's onServiceDisconnected() metodo

Inoltre, tenere presente che il tempo esatto in cui il servizio viene distrutto dipende da Android e potrebbe non essere immediato. Pertanto, ad esempio, se si sta facendo affidamento su onDestroy() per impedire al servizio di interrompere il lavoro, si consiglia di utilizzare un altro trigger per tale attività (ad es. Attività che chiama un metodo stopDoingStuff() tramite l'interfaccia del raccoglitore di servizi).

+1

Ho modificato la mia domanda iniziale per includere informazioni circa il mio legame, io ho vincolante e quindi non vincolante –

+2

Ummm, che il codice è totalmente incasinato ed è quasi certamente contribuendo al tuo problema. 'bindService()' e 'unbindService()' sono asincroni e sono garantiti fallire nel modo in cui li si sta usando. Sfortunatamente, non ho idea di cosa stai cercando di realizzare qui, quindi non ho un buon modo di consigliarti ulteriormente. – CommonsWare

+0

È solo un'interfaccia utente a due pulsanti, uno per avviare il servizio e uno per arrestarlo. ho preso l'istruzione if fuori del mio metodo releaseBind() lasciando solo unBindService (questo); Sembra annullare la registrazione del servizio poiché quando faccio clic su di esso una seconda volta viene visualizzato l'errore "Servizio non registrato". Tuttavia, StopService ancora non sembra chiamare il metodo OnDestroy() nel mio servizio, i servizi in background funzionano ancora –

10

Tutti i tuoi attacchi sono chiusi?

A service can be used in two ways. Le due modalità non sono del tutto separato. È possibile eseguire il binding a un servizio avviato con startService(). Ad esempio, un servizio di musica di sfondo potrebbe essere avviato chiamando StartService() con un oggetto Intent che identifica la musica da riprodurre. Solo più tardi, forse quando l'utente vuole esercitare un certo controllo su il giocatore o ottenere informazioni sul il brano corrente, sarebbe un'attività stabilire una connessione al servizio chiamando bindService(). In casi simili, StopService() non effettivamente arrestare il servizio finché l'ultimo legame è chiusa

.

+0

Sì, lo leggo solo una volta e poi richiamo releaseBind() per disassociare –

4

hai ragazzi mi dispiace per la risposta in ritardo, ma per quanto ne so ho avuto successo con il servizio stop in questo codice: è possibile controllare uno link qui.

public void onClick(View src) { 
switch (src.getId()) { 
case R.id.buttonStart: 
    Log.d(TAG, "onClick: starting srvice"); 
    startService(new Intent(this, MyService.class)); 
    break; 
case R.id.buttonStop: 
    Log.d(TAG, "onClick: stopping srvice"); 
    stopService(new Intent(this, MyService.class)); 
    break; 
} 
} 

e nei servizi di classe:

public class MyService extends Service { 
     private static final String TAG = "MyService"; 


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

@Override 
public void onCreate() { 
    Toast.makeText(this, "My Service Created", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onCreate"); 


} 

@Override 
public void onDestroy() { 
    Toast.makeText(this, "My Service Stopped", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onDestroy"); 

} 

@Override 
public void onStart(Intent intent, int startid) { 
    Toast.makeText(this, "My Service Started", Toast.LENGTH_LONG).show(); 
    Log.d(TAG, "onStart"); 

} 
} 
Problemi correlati