Sobes.tech
Middle

Qual é o ciclo de vida dos serviços no Android?

sobes.tech IA

Resposta da IA

O serviço não possui interface de utilizador e funciona em segundo plano. O seu ciclo de vida é gerido por três métodos principais:

  • onCreate(): É chamado pela primeira vez quando o serviço é criado. Aqui realiza-se a inicialização.
  • onStartCommand() / método chamado ao ligar (por exemplo, onBind()): onStartCommand() é chamado ao iniciar o serviço com startService(). Retorna uma bandeira que indica como o sistema deve restaurar o serviço se for terminado. onBind() é chamado ao ligar um cliente ao serviço com bindService().
  • onDestroy(): É chamado quando o serviço é destruído. Aqui libertam-se todos os recursos.

Existem dois tipos de serviços que afetam o ciclo de vida:

  • Serviço iniciado (Started Service): Iniciado por startService(). Funciona até ser explicitamente parado com stopSelf() ou stopService(). O sistema tentará reiniciá-lo após a sua destruição se onStartCommand() devolveu a bandeira adequada.
  • Serviço ligado (Bound Service): Iniciado por bindService(). Existe enquanto pelo menos um cliente ativo estiver ligado. Quando todos os clientes se desligam, o serviço é destruído. onBind() devolve uma implementação de IBinder, usada para interagir com o serviço.

Diagrama do ciclo de vida:

        Start Service --+--> onStartCommand() --+--> Em execução
                        |                         |
        Bind Service ---+--> onBind() -----------+--> Ligado
                        |
        onCreate() -----+
                        |
                        +--> onRebind()
                        |
        onDestroy() <---+-------------------------+---- Desligado <--- unbindService()
                                                 |
                                                 +---- Parado <--- stopSelf() / stopService()

Pontos-chave:

  • onCreate() é chamado apenas uma vez.
  • onStartCommand() pode ser chamado várias vezes se startService() for chamado repetidamente.
  • O serviço funciona no hilo principal da interface de utilizador por padrão. Operações longas devem ser feitas num hilo separado ou usando IntentService.
  • Serviços ligados têm um ciclo de vida mais complexo, dependente do estado dos clientes.

Exemplo de onStartCommand():

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    // Executar alguma ação
    // Por exemplo, iniciar um trabalho em segundo plano
    
    // Retornar a bandeira que determina o comportamento do sistema ao destruir o serviço
    return START_STICKY; // O serviço será restaurado se for terminado
}

Exemplo de onBind():

private final IBinder binder = new LocalBinder();

public class LocalBinder extends Binder {
    MyService getService() {
        // Retorna a instância do serviço para os clientes
        return MyService.this;
    }
}

@Nullable
@Override
public IBinder onBind(Intent intent) {
    return binder;
}

@Override
public boolean onUnbind(Intent intent) {
    // É chamado quando todos os clientes se desligam
    return super.onUnbind(intent);
}