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 comstartService(). 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 combindService().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 comstopSelf()oustopService(). O sistema tentará reiniciá-lo após a sua destruição seonStartCommand()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 deIBinder, 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 sestartService()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);
}