🚀 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
Constraintsdo WorkManager. Isso evita que seu código tente acessar a rede quando o aparelho estiver em Modo Avião, economizando processamento e evitando erros.