🚀 5.4 Serviços em Background e Notificações

Para tarefas periódicas que devem ocorrer mesmo quando o app não está visível, o Android disponibiliza o componente Service. No entanto, para garantir a eficiência da bateria e persistência entre reinicializações, a recomendação atual é o uso do WorkManager.

Entendendo o Service

Um Service é um componente que executa operações de longa duração em primeiro plano (foreground) ou plano de fundo (background).

CAUTION

Limitações de Background: Desde o Android 8.0 (API 26), o sistema impõe restrições severas a serviços em background para economizar bateria. Se seu serviço precisa rodar por muito tempo, ele deve ser um Foreground Service enviando uma notificação persistente ao usuário.

Agendamento Moderno com WorkManager

O WorkManager substitui com vantagens o uso manual de Threads e ScheduledThreadPoolExecutor para tarefas periódicas:

// Definindo a Tarefa (Worker)
public class NotificacaoWorker extends Worker {
    public NotificacaoWorker(@NonNull Context context, @NonNull WorkerParameters params) {
        super(context, params);
    }
 
    @NonNull
    @Override
public Result doWork() {
        // Lógica de busca no Twitter ou Sincronização
        return Result.success();
    }
}
 
// Agendando a execução periódica (ex: cada 15 minutos)
var constrains = new Constraints.Builder()
    .setRequiredNetworkType(NetworkType.CONNECTED)
    .build();
 
var workRequest = new PeriodicWorkRequest.Builder(NotificacaoWorker.class, 15, TimeUnit.MINUTES)
    .setConstraints(constrains)
    .build();
 
WorkManager.getInstance(context).enqueue(workRequest);

Notificações e Canais (API 26+)

Para exibir alertas na barra de status, é obrigatório criar um Notification Channel:

private void criarCanalNotificacao() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        var channel = new NotificationChannel(
            "MENCOES_TWITTER", 
            "Menções Twitter", 
            NotificationManager.IMPORTANCE_DEFAULT
        );
        var manager = getSystemService(NotificationManager.class);
        manager.createNotificationChannel(channel);
    }
}

IMPORTANT

Por que WorkManager? Ele garante que a tarefa seja executada mesmo que o app seja fechado ou o dispositivo reiniciado, escolhendo o melhor momento (ex: quando há Wi-Fi ou o celular está carregando) para otimizar a bateria.

TIP

Ao lidar com conectividade, utilize sempre as Constraints do WorkManager. Isso evita que seu código tente acessar a rede quando o aparelho estiver em Modo Avião, economizando processamento e evitando erros.


⬅️ Capítulo Anterior | Próximo Capítulo ➡️