🚀 5.6 Reagindo a Eventos do Sistema (BroadcastReceiver)

O BroadcastReceiver é o componente que permite ao seu aplicativo “ouvir” e reagir a eventos do sistema ou de outros apps, mesmo quando não está em execução. Um exemplo clássico é iniciar um serviço de sincronização assim que o celular termina de ligar.

O Evento de Inicialização (BOOT_COMPLETED)

Para que o BoaViagem recupere o agendamento de tarefas após o dispositivo ser reiniciado, precisamos capturar o evento BOOT_COMPLETED.

1. Declaração no Manifesto

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
 
<receiver android:name=".receiver.StartupReceiver" android:exported="false">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED" />
    </intent-filter>
</receiver>

2. Implementação do Receiver (Java 17)

No Android moderno, o BroadcastReceiver deve ser o mais rápido possível. Em vez de iniciar um Service pesado, ele deve disparar um WorkManager:

public class StartupReceiver extends BroadcastReceiver {
    @Override
public void onReceive(Context context, Intent intent) {
        if (Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) {
            // Reagenda as tarefas de sincronização usando WorkManager
            var workRequest = new OneTimeWorkRequest.Builder(SincronizacaoWorker.class).build();
            WorkManager.getInstance(context).enqueue(workRequest);
        }
    }
}

CAUTION

Restrições de Background (Android 8.0+): Você não pode mais iniciar um serviço de background comum (startService) diretamente de um BroadcastReceiver. O sistema lançará uma exceção. Utilize sempre o WorkManager ou inicie um Foreground Service se a tarefa for crítica e visível.

5.7 Conclusão do Módulo

Neste módulo, conectamos nosso aplicativo ao mundo:

  1. Fundamentos de Rede: Entendemos o padrão REST e o formato JSON.
  2. Retrofit: Simplificamos o consumo de APIs com interfaces e GSON.
  3. Concorrência: Substituímos a obsoleta AsyncTask por Executors e WorkManager.
  4. Notificações: Implementamos canais de segurança e PendingIntents imutáveis.
  5. Broadcasts: Aprendemos a reagir a eventos do sistema de forma eficiente.

No próximo módulo, aprenderemos a fundo como manter os dados locais e remotos sempre em harmonia!


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