Middle
O que é um serviço em segundo plano (serviço em primeiro plano) no Android?
sobes.tech IA
Resposta da IA
O serviço em primeiro plano (foreground service) é um tipo de serviço no Android que possui prioridade elevada e é visível ao utilizador. Executa tarefas que são perceptíveis ao utilizador e não devem ser interrompidas para poupar bateria ou memória.
Características principais:
- Mostra uma notificação constante na área de notificações. O utilizador deve poder ver que o serviço está em execução e potencialmente interagir com ele.
- O sistema tem menos probabilidades de terminar um serviço em primeiro plano em comparação com um serviço em segundo plano ou um thread, devido à sua alta prioridade.
- Requer permissão especial
FOREGROUND_SERVICE. - É utilizado para tarefas como reprodução de música, rastreamento de localização, sincronização de dados em tempo real.
Ciclo de vida:
- Inicia com
startForegroundService(). - Dentro de 5 segundos, é necessário chamar
startForeground(notificationId, notification)para colocar o serviço em primeiro plano. Caso contrário, o sistema pode parar o serviço e lançarForegroundServiceDidNotStartInTimeException. - Termina com
stopSelf()oustopService()de outro componente, ou de forma forçada pelo utilizador através da notificação. Ao parar, é necessário chamarstopForeground(bool removeNotification)para remover a notificação.
Exemplo de início:
// Obter permissão
ActivityCompat.requestPermissions(
this,
arrayOf(Manifest.permission.FOREGROUND_SERVICE),
REQUEST_CODE_FOREGROUND_SERVICE
)
// No callback após obter permissão ou se já tiver
val serviceIntent = Intent(this, MyForegroundService::class.java)
ContextCompat.startForegroundService(this, serviceIntent)
Dentro do serviço:
// MyForegroundService.kt
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
val notification: Notification = createNotification() // Método para criar a notificação
startForeground(NOTIFICATION_ID, notification)
// Aqui começa a execução da tarefa do serviço
return START_STICKY // Ou outro flag adequado
}
override fun onDestroy() {
stopForeground(true) // Remover notificação ao parar
// Limpeza de recursos
super.onDestroy()
}