Android onCreate o onStartCommand para iniciar el servicio

105

Por lo general, cuando creo un servicio de Android implemento el onCreatemétodo, pero en mi último proyecto esto no funciona. Intenté implementarlo onStartCommandy esto parece funcionar.

La pregunta es: cuando tengo que implementar un servicio, ¿qué método se requiere? ¿Qué métodos tengo que implementar? onCreate, onStartCommando ambos? ¿Y cuál es el papel de cada uno?

GVillani82
fuente
onCreatesiempre se llama independientemente
IgorGanapolsky

Respuestas:

189

onCreate()se llama cuando Servicese crea una instancia del objeto (es decir, cuando se crea el servicio ). Debe hacer cosas en este método que necesita hacer solo una vez (es decir, inicializar algunas variables, etc.). onCreate()solo se llamará una vez por cada objeto instanciado .

Solo necesita implementar onCreate()si realmente desea / necesita inicializar algo solo una vez .

onStartCommand()se llama cada vez que un cliente inicia el servicio utilizando startService(Intent intent). Esto significa que se onStartCommand()pueden llamar varias veces. Debe hacer las cosas en este método que sean necesarias cada vez que un cliente solicite algo de su servicio. Esto depende mucho de lo que haga su servicio y cómo se comunica con los clientes (y viceversa).

Si no lo implementa onStartCommand(), no podrá obtener ninguna información de la Intentque el cliente pasa onStartCommand()y es posible que su servicio no pueda realizar ningún trabajo útil.

David Wasser
fuente
6
¿Pueden existir dos instancias del mismo servicio dentro de una aplicación?
jacktrades
1
@jacktrades Teóricamente y de acuerdo con la documentación: No. Sin embargo, parece haber algún error en Android donde de hecho, en ciertas circunstancias, creará múltiples instancias de un Servicio. Sin embargo, como dije, esto es un error y no hemos podido reproducirlo de manera confiable a voluntad. ¿Porque lo preguntas?
David Wasser
3
@Mr_and_Mrs_D No hay errores oficiales reportados hasta donde yo sé. Sin embargo, hay varios informes de que esto está sucediendo y tengo una aplicación donde sé que está sucediendo. No he podido reducir el problema a algo pequeño y repetible, por lo que no he presentado un error. La documentación no establece explícitamente que los servicios sean singleton, pero está muy claro que eso es lo que se pretende. Mire los documentos de 'startService () `: establece claramente que si el servicio no se está ejecutando, se creará e iniciará, si está en ejecución, seguirá funcionando
David Wasser
6
@Diffy Cuando llame startService(), si el servicio no se está ejecutando, Android creará una instancia de la clase de servicio (este es un objeto de servicio) y luego llamará onCreate()a ese objeto. Luego llamará onStartCommand()a ese objeto. Si, algún tiempo después, vuelve a llamar startService(), si el servicio aún se está ejecutando, Android no creará un nuevo objeto de servicio. En su lugar, solo llamará onStartCommand()al objeto de servicio existente. ¿Está claro?
David Wasser
1
¡Te quiero! (y) funcionó como magia (y) explicación muy simple y buena
Hilton Khadka
11

El servicio se comporta igual que la actividad. Lo que sea que desee associateuna vez con un servicio entrará onCreatecomo inicialización

y cada vez que servicese llama a mediante startService . onStartCommandsera llamado. y puedes pasar cualquier acción a realizar. como para un reproductor de música, puede reproducir, pausar, dejar de usar la acción

Y lo haces operation in serviceenviando una acción y recibiéndola enonStartCommand

onCreate trabajar como un constructor.

Editar en breve

onCreate()llama solo la primera vez que inicia una, Servicemientras que onStartCommand()llama cada vez que startServicevuelve a llamar . Te permite establecer una acción como reproducir, detener, pausar la música.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
AndroidGeek
fuente
Entonces, cuando llamo a un servicio usando startService (intent), ¿no se llamará a onCreate ()? Tengo una duda de entender qué es un 'objeto de servicio' porque siempre he iniciado un servicio por startSevice (intención).
Diffy
¿Ha creado correctamente una instancia del objeto de servicio o probablemente no tiene el servicio en su manifiesto?
AndroidGeek
iniciar servicio como startService (nuevo Intención (esto, ServiceName.class));
AndroidGeek
Pero, ¿este método se llama instanciar el servicio? ¿Dónde está entonces el objeto de servicio?
Diffy
es una forma de llamar a Actividad y Servicio usando la intención es responsable de abrir Actividad y Servicio en Android. Lo que quiera hacer con el objeto del servicio también puede hacerlo con intención. me refiero a pasar datos al servicio
AndroidGeek