Android onCreate ou onStartCommand para iniciar o serviço

105

Normalmente, quando crio um serviço Android, implemento o onCreatemétodo, mas em meu último projeto isso não funciona. Tentei implementar onStartCommande parece funcionar.

A questão é: quando tenho que implementar um serviço, qual método é necessário? Quais métodos devo implementar? onCreate, onStartCommandou ambos? E qual é o papel de cada um?

GVillani82
fonte
onCreateé sempre chamado independentemente
IgorGanapolsky

Respostas:

189

onCreate()é chamado quando o Serviceobjeto é instanciado (ou seja: quando o serviço é criado ). Você deve fazer coisas neste método que você precisa fazer apenas uma vez (ou seja: inicializar algumas variáveis, etc.). onCreate()só será chamado uma vez por objeto instanciado .

Você só precisa implementar onCreate()se realmente quiser / precisar inicializar algo apenas uma vez .

onStartCommand()é chamado sempre que um cliente inicia o serviço usando startService(Intent intent). Isso significa que onStartCommand()pode ser chamado várias vezes. Você deve fazer as coisas neste método que são necessárias cada vez que um cliente solicita algo de seu serviço. Isso depende muito do que seu serviço faz e como ele se comunica com os clientes (e vice-versa).

Se você não implementar onStartCommand(), não será capaz de obter nenhuma informação do Intentque o cliente passa onStartCommand()e seu serviço pode não ser capaz de fazer nenhum trabalho útil.

David Wasser
fonte
6
Podem existir duas instâncias do mesmo serviço em um aplicativo?
jacktrades de
1
@jacktrades Teoricamente e de acordo com a documentação: Não. No entanto, parece haver algum bug no Android que, de fato, em certas circunstâncias, ele criará várias instâncias de um Serviço. No entanto, como eu disse, esse é um bug, e não fomos capazes de reproduzi-lo de maneira confiável à vontade. Porque perguntas?
David Wasser
3
@Mr_and_Mrs_D Não há bugs oficiais relatados até onde eu sei. No entanto, existem vários relatos sobre isso e tenho um aplicativo onde sei que está acontecendo. Não consegui reduzir o problema a algo pequeno e passível de repetição, portanto, não registrei um bug sozinho. A documentação não declara explicitamente que os serviços são singletons, mas é muito claro que é isso que se pretende. Veja a documentação de 'startService () `: afirma claramente que se o serviço ainda não estiver em execução, ele será criado e iniciado, se estiver em execução, continuará em execução
David Wasser
6
@Diffy Quando você chama startService(), se o serviço não estiver em execução, o Android criará uma instância da classe de serviço (este é um objeto de serviço) e, em seguida, chamará onCreate()esse objeto. Em seguida, chamará onStartCommand()esse objeto. Se, algum tempo depois, você ligar novamente startService(), se o serviço ainda estiver em execução, o Android não criará um novo objeto de serviço. Em vez disso, ele apenas chamará onStartCommand()o objeto de serviço existente. Está claro?
David Wasser
1
Eu te amo! (y) funcionou como mágica (y) explicação muito simples e boa
Hilton Khadka
11

O serviço se comporta da mesma forma que a atividade Tudo o que você quiser associateuma vez com um serviço irá entrar onCreatecomo a inicialização

e sempre que servicefor chamado usando startService . onStartCommandserá chamado. e você pode passar qualquer ação a ser executada. como para um reprodutor de música, você pode reproduzir, pausar, parar de usar a ação

E você faz qualquer operation in serviceum enviando uma ação e recebendo-a noonStartCommand

onCreate trabalhar como um construtor.

Editar resumidamente

onCreate()liga apenas na primeira vez que você inicia um, Serviceenquanto onStartCommand()liga sempre que liga para o startServicenovamente. Ele permite que você defina uma ação como reproduzir, parar, pausar a música.

public void onStartCommand()
{
     if(intent.getAction.equals("any.play")
     {
        //play song
     }
     else if(intent.getAction.equals("any.stop")
     {}
}
Zar E Ahmer
fonte
Portanto, quando eu chamo um serviço usando startService (intent), onCreate () não será chamado? Tenho uma dúvida em entender o que é um 'objeto de serviço' porque sempre iniciei um serviço por startSevice (intent).
Diffy
instanciou corretamente o objeto de serviço ou Provavelmente você não tem o serviço em seu manifesto
Zar E Ahmer
iniciar serviço como startService (new Intent (this, ServiceName.class));
Zar E Ahmer
Mas esse método é chamado de instanciar o serviço? Onde está o objeto de serviço então?
Diffy
é uma maneira de chamar Activity and Service usando a intenção é responsável por abrir Activity and Service no Android. O que você deseja fazer com o objeto de serviço, também pode fazê-lo com a intenção. quero dizer, passando dados para o serviço
Zar E Ahmer