Sobes.tech
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:

  1. Inicia com startForegroundService().
  2. 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çar ForegroundServiceDidNotStartInTimeException.
  3. Termina com stopSelf() ou stopService() de outro componente, ou de forma forçada pelo utilizador através da notificação. Ao parar, é necessário chamar stopForeground(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()
}