2010-02-01 17 views
23

Actualmente tengo un servicio que funciona bien cuando lo inicio pero cuando trato de detenerlo usando el método stopService no se llama a su método onDestroy.El servicio no se detiene cuando se llama al método stopService

Este es el código que utilizo para tratar de detener el servicio

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! "); 

     } 
}); 

Estoy en lo cierto al pensar que cuando se utiliza stopService llama al método OnDestroy del Servicio? Cuando presiono el botón de detener la exploración, no se llama al método onDestroy() en mi Servicio.

¿Hay algo más que me falta que deba poner para detener el servicio?

EDIT: añadir onServiceConnected() se llama cuando stopService se ejecuta en lugar de onServiceDisconnected(), ¿por qué habría que estar pasando?

EDIT: Para añadir más información que se refiere Encuadernación

me llame bindService en el onCreate() método y luego tengo el método releaseBind() desenlaza el Servicio.

Este es el código para ese método:

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

así que supongo que la desunión no es mi problema?

Respuesta

42

voy a adivinar que su tener una llamada a un método para releaseBind() significa que previamente hayas llamado bindService() sobre este servicio y que está llamando releaseBind()unbindService(). Si mi suposición es incorrecta, ignore esta respuesta.


Un servicio se apagará después de que todas las llamadas bindService() han tenido sus correspondientes unbindService() llamadas. Si no hay clientes vinculados, entonces el servicio también necesitará stopService() si y solo si alguien llamó al startService() en el servicio.

Por lo tanto, hay algunas posibilidades:

  1. Usted clientes todavía se han unido (por ejemplo, otras actividades), en cuyo caso no se puede detener el servicio hasta que se desatan
  2. Dado que tanto unbindService() y stopService() son asíncronas, algo podría estar pasando estropearse con el tiempo, en cuyo caso se puede conseguir mejor suerte si se llama a partir de sus stopService()ServiceConnection 's onServiceDisconnected() método

Además, tenga en cuenta que el tiempo exacto de destrucción del servicio depende de Android y puede no ser inmediato. Entonces, por ejemplo, si confía en onDestroy() para hacer que su servicio deje de realizar algún trabajo, considere usar otro activador para eso (por ejemplo, actividad llamando a un método stopDoingStuff() a través de la interfaz del enlace de servicio).

+1

He editado mi pregunta original para incluir información sobre mi vinculante, tengo que atar y luego compromiso.Por –

+2

Ummm, que el código está totalmente en mal estado y es casi seguramente contribuyendo a su problema. 'bindService()' y 'unbindService()' son asíncronos y se garantiza que fallarán en la forma en que los está usando. Desafortunadamente, no tengo idea de lo que estás tratando de lograr aquí, así que no tengo una buena manera de aconsejarte más. – CommonsWare

+0

Es solo una interfaz de usuario de dos botones, uno para iniciar el servicio y otro para detenerlo. He tomado la declaración if de mi método releaseBind() dejando solo unBindService (this); Parece que esto cancela el registro del Servicio, ya que cuando lo hago clic por segunda vez, aparece el error "Servicio no registrado". Sin embargo, stopService todavía no parece llamar al método onDestroy() en mi Servicio, los servicios en segundo plano aún funcionan –

10

¿Están cerradas todas sus fijaciones?

A service can be used in two ways. Los dos modos no son enteramente separada. Puede enlazar a un servicio que se inició con startService(). Por ejemplo, un servicio de música de fondo podría iniciarse llamando al startService() con un objeto Intento que identifica la música que se reproducirá. Sólo más tarde, posiblemente cuando el usuario quiere ejercer algún control sobre el jugador u obtener información sobre la canción actual, sería una actividad establecer una conexión con el servicio llamando bindService(). En casos como éste , stopService() no realmente detener el servicio hasta que la última unión está cerrado

.

+0

Yeh solo lo ato una vez y luego invoco releaseBind() para desvincularlo –

4

muchachos lo siento por la respuesta tardía, pero hasta donde sé, he detenido con éxito el servicio en este código: aquí puede consultar un link.

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; 
} 
} 

y en la clase de servicios:

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"); 

} 
} 
Cuestiones relacionadas