Implementação de um aviso de inicialização usando registro estático

Abordagem recomendada: O receptor deve lidar apenas com acionamentos leves, como por exemplo:

  1. Exibir uma notificação.
  2. Iniciar um Serviço em segundo plano.
  3. 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 registerReceiver no código, geralmente dentro do método onCreate de 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.xml usando 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 configurar exported="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 sistema BOOT_COMPLETED.

3. Observações importantes

Nunca coloque lógica demorada dentro de onReceive()! O método onReceive do 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:

  1. Exibir uma notificação.
  2. Iniciar um Serviço em segundo plano.
  3. 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

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *