detener el servicio en android

79

Aquí probé un programa de servicio simple. El servicio de inicio funciona bien y genera Toast, pero el servicio de detención no. El código de este sencillo servicio es el siguiente:

public class MailService extends Service {
    @Override
    public IBinder onBind(Intent arg0) {
        // TODO Auto-generated method stub
        return null;
    }
    public void onCreate(){
        super.onCreate();
        Toast.makeText(this, "Service Started", Toast.LENGTH_SHORT).show();
    }
    public void onDestroyed(){
        Toast.makeText(this, "Service Destroyed", Toast.LENGTH_SHORT).show();
        super.onDestroy();
    }
}

El código de la Actividad desde donde se llama este Servicio es el siguiente:

public class ServiceTest extends Activity{
    private Button start,stop;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.service_test);

        start=(Button)findViewById(R.id.btnStart);
        stop=(Button)findViewById(R.id.btnStop);

        start.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                startService(new Intent(ServiceTest.this,MailService.class));
            }
        });
        stop.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                stopService(new Intent(ServiceTest.this,MailService.class));
            }
        });
    }
}

Ayúdame a detener el servicio con ese botón de parada que genera tostadas en el método onDestroy (). Ya he visto muchas publicaciones relacionadas con el problema de detener el servicio aquí, pero no satisfactorias, por lo que publicando una nueva pregunta. Espero una respuesta satisfactoria.

Ravi Bhatt
fuente
6
No stopService(serviceIntent)funciona?
Chris Cashwell
"Además, tenga en cuenta que el momento exacto en que se destruye el servicio depende de Android y puede que no sea inmediato". De: stackoverflow.com/questions/2176375/android-service-wont-stop/…
bigstones
1
@chris: Creo que el método stopService (serviceIntent) que implementé anteriormente no funcionó porque Toast en onDestroy () no se produjo al hacer clic en el botón de detener.
Ravi Bhatt
@bigstone: ¿significa que mi método stopService () y onDestroy () funciona correctamente pero no inmediatamente cuando presiono el botón detener?
Ravi Bhatt
@Ravi: sí. Android puede decidir que hay suficientes recursos para mantener el servicio en la memoria, de modo que esté listo si se necesita nuevamente.
bigstones

Respuestas:

49
onDestroyed()

es un nombre incorrecto para

onDestroy()  

¿Cometió un error solo en esta pregunta o también en su código?

kreker
fuente
Sí, más tarde hice mi código desde cero y funcionó bien. Cualquier sí puede ser ese problema en mi código anterior que otros y yo tampoco notamos. De todas formas gracias :) Como también ayuda a otros también.
Ravi Bhatt
2
@RaviBhatt Entonces, ¿ha logrado detener un servicio? En caso afirmativo, ¿puede compartir cómo se hace?
suraj
3
@suraj Si ha referido mi código de lo que necesita hacer, haga una intención en Activity like intent = new Intent(ServiceTest.this,MailService.class) y use la misma intención para iniciar y detener el servicio como startService (intent) y stopService (intent).
Ravi Bhatt
11
Es por eso que siempre debes usar la @Overrideanotación.
Pavel
16

Este código funciona para mí: verifique este enlace
Este es mi código cuando paro y comienzo el servicio en actividad

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 clase de servicio:

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

    player = MediaPlayer.create(this, R.raw.braincandy);
    player.setLooping(false); // Set looping
}

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

¡FELIZ CODIFICACIÓN!

dondondon
fuente
¿Cómo manejar esto durante una excepción dentro del servicio? Dudo que se llame a onDestory () entonces.
Srihari Karanth
14

Para detener el servicio debemos utilizar el método stopService():

  Intent myService = new Intent(MainActivity.this, BackgroundSoundService.class);
  //startService(myService);
  stopService(myService);

entonces el método onDestroy()en el servicio se llama:

  @Override
    public void onDestroy() {

        Log.i(TAG, "onCreate() , service stopped...");
    }

Aquí hay un ejemplo completo que incluye cómo detener el servicio.

Jorgesys
fuente