Abordagem recomendada: O receptor deve lidar apenas com acionamentos leves, como por exemplo:
- Exibir uma notificação.
- Iniciar um Serviço em segundo plano.
- Abrir uma Activity. Delegate a lógica de negócios complexa para um Serviço processar; não a escreva diretamente em
onReceive.
Implementação de um aviso de inicialização usando registro estático
Esta seção contrasta com a anterior sobre registro dinâmico e explica o registro estático de receptores de broadcast para receber uma transmissão do sistema ao finalizar a inicialização e exibir uma mensagem Toast.
1. Diferenças principais: Registro dinâmico vs. estático
- Registro dinâmico: Registrado via
registerReceiverno código, geralmente dentro do métodoonCreatede uma Activity. O aplicativo deve ser aberto pelo menos uma vez para receber transmissões; ao fechá-lo, ele para de recebê-las. O registro e a destruição podem ser controlados manualmente, o que oferece muita flexibilidade. - Registro estático: Declarado no
AndroidManifest.xmlusando a tag<receiver>. Não é necessário que o aplicativo tenha sido aberto antes; após a inicialização do sistema, o receptor é ativado automaticamente para ouvir transmissões do sistema.
2. Passos completos
① Criar a classe do receptor BootCompleteReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "Inicialização do sistema concluída", Toast.LENGTH_LONG).show();
}
}
- Criação: No Android Studio, clique com o botão direito no pacote → New → Other → Broadcast Receiver.
- Descrição dos parâmetros:
Enabled: Indica se o receptor está ativado (marque esta opção).Exported: Indica se aceita transmissões do sistema de fora do aplicativo (marque esta opção, pois precisamos receber a transmissão de inicialização do sistema, que é uma transmissão externa).
Definir
exported="false"no manifest, como visto em alguns materiais de curso, está incorreto. Para receber transmissões do sistema, é necessário configurarexported="true".
② Adicionar permissões no AndroidManifest.xml
<!-- Permissão para receber a transmissão de inicialização concluída -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
③ Registrar estaticamente o receiver + intent-filter dentro de <application>
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- Ação de inicialização concluída -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
intent-filter: Filtro que declara qual tipo de transmissão este receptor escuta. Aqui, monitoramos a transmissão do sistemaBOOT_COMPLETED.
3. Observações importantes
Nunca coloque lógica demorada dentro de onReceive()! O método
onReceivedo receptor executa na thread principal e tem um tempo de execução muito limitado (cerca de 10 segundos). Realizar tarefas pesadas fará o sistema lançar um erro ANR (Application Not Responding), causando o fechamento inesperado do aplicativo.
Abordagem recomendada: O receptor deve lidar apenas com acionamentos leves, como por exemplo:
- Exibir uma notificação.
- Iniciar um Serviço em segundo plano.
- Abrir uma Activity. Delegate a lógica de negócios complexa para um Serviço processar; não a escreva diretamente em
onReceive.
Implementação de um aviso de inicialização usando registro estático