servicio - java android service
stopSelf() vs stopSelf(int) vs stopService(IntenciĆ³n) (7)
Cuál es la diferencia al llamar
stopSelf()
, stopSelf(int)
o stopService(new Intent(this,MyServiceClass.class))
dentro de onStartCommand()
?
por ejemplo, si comienzo los mismos servicios dos veces de esta manera:
...
Intent myIntent1 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent1.putExtra("test", 1);
Intent myIntent2 = new Intent(AndroidAlarmService.this, MyAlarmService.class);
myIntent2.putExtra("test", 2);
startService(myIntent1);
startService(myIntent2);
...
E implemente onStartCommand de esta forma:
public int onStartCommand(Intent intent, int flags, int startId)
{
Toast.makeText(this, "onStartCommand called "+intent.getIntExtra("test", 0), Toast.LENGTH_LONG).show();
stopService(new Intent(this,MyAlarmService.class));
return START_NOT_STICKY;
}
Obtengo exactamente el mismo comportamiento con los tres métodos, es decir, en Destroy solo se llamará después de que onStartCommand se ejecute dos veces.
stopSelf () = Detener el servicio, si se inició previamente.
stopSelf (int startId) = Versión anterior de stopSelfResult (int) que no devuelve un resultado.
stopSelfResult (int startId) = Detener el servicio si la hora más reciente en que se inició fue startId. Devuelve el resultado booleano.
Aquí hay una descripción simplificada:
stopSelf()
se utiliza para detener siempre el servicio actual.stopSelf(int startId)
también se usa para detener el servicio actual, pero solo si startId fue el ID especificado la última vez que se inició el servicio.stopService(Intent service)
se utiliza para detener servicios, pero desde fuera del servicio se debe detener.
Espero que esto ayude:
Un servicio iniciado debe administrar su propio ciclo de vida. Es decir, el sistema no detiene ni destruye el servicio a menos que deba recuperar la memoria del sistema y el servicio continúe ejecutándose después de que onStartCommand () regrese. Entonces, el servicio debe detenerse llamando a stopSelf () u otro componente puede detenerlo llamando a stopService ().
Una vez que se solicita detenerse en stopSelf () o stopService (), el sistema destruye el servicio lo antes posible.
Sin embargo, si su servicio maneja varias solicitudes simultáneamente a onStartCommand (), no debe detener el servicio cuando termine de procesar una solicitud de inicio, ya que puede haber recibido una nueva solicitud de inicio (deteniéndose al final de la primera) la solicitud terminaría la segunda). Para evitar este problema, puede usar stopSelf (int) para asegurarse de que su solicitud para detener el servicio siempre esté basada en la solicitud de inicio más reciente.
Es decir, cuando llama a stopSelf (int), pasa el ID de la solicitud de inicio (el startId entregado a onStartCommand ()) al que corresponde su solicitud de detención. Entonces, si el servicio recibió una nueva solicitud de inicio antes de poder llamar a stopSelf (int), entonces la identificación no coincidirá y el servicio no se detendrá.
Hay dos sabores de stopSelf()
. Uno toma un parámetro startId
, para indicar que ha completado el trabajo en un comando específico, por lo que el servicio debería detenerse de manera oportunista si no hay otros comandos pendientes.
La funcionalidad central de los 3 métodos es la misma y es por eso que tienen nombres similares. Hay muy pequeñas diferencias entre ellos.
- público final void stopSelf ()
Clase : pertenece a la clase android.app.Service
Llamado desde : este método está destinado a recibir llamadas desde el interior del servicio únicamente.
Comportamiento : el servicio se detendrá. onDestroy()
estado llamado.
- público final void stopSelf (int startId)
Clase : pertenece a la clase android.app.Service
Llamado desde : este método está destinado a recibir llamadas desde el interior del servicio únicamente.
Comportamiento : hay un método de la versión anterior stopSelfResult (int startId). Este método es una versión más nueva de ese método. El servicio se detendrá solo si la hora más reciente en que se inició fue startId. onDestroy()
estado llamado.
Puede ser que este método le resulte útil solo en el caso en que haya iniciado 2-3 instancias del mismo servicio pero desee detenerlas en un orden que haya recibido con la lista inicial almacenada con usted. Debe tener mucho cuidado al usar este método.
- public abstract boolean stopService (Servicio de atención)
Clase : Esto pertenece a la clase android.content.Context
Llamado desde : Este método está destinado a recibir llamadas desde fuera del servicio, aunque puede llamar desde adentro.
Comportamiento : si el servicio no se está ejecutando, no sucede nada. De lo contrario, se detiene. Tenga en cuenta que las llamadas a startService () no se cuentan; esto detiene el servicio sin importar cuántas veces se haya iniciado. onDestroy()
estado llamado.
stopService () se llama desde la clase desde donde se inicia el servicio. stopSelf () se llama dentro de la clase de servicio en ejecución para detener el Servicio
stopSelf (int) - que se utiliza para detener el servicio de inicio más reciente basado en onStartCommand (Intent i, int f, int startid) ''s int startid.
stopSelf () - que es llamado por el servicio en sí, cuando la tarea se ha completado.
stopService (Intención) - que se llama explícitamente desde una actividad para detener el servicio.