Esta sección contrasta con la anterior sobre registro dinámico y explica el registro estático de receptores de difusión (Broadcast Receivers) para recibir una emisión del sistema al terminar el arranque y mostrar un mensaje Toast.
1. Diferencias clave: Registro dinámico vs. estático
- Registro dinámico: Se registra mediante
registerReceiveren el código, normalmente dentro del métodoonCreatede una Activity. La aplicación debe haberse iniciado al menos una vez para recibir difusiones; al cerrarla, deja de recibirlas. El registro y la destrucción se controlan manualmente, lo que ofrece mucha flexibilidad. - Registro estático: Se declara en el
AndroidManifest.xmlusando la etiqueta<receiver>. No es necesario que la aplicación se haya iniciado antes; una vez que el sistema arranca, despierta automáticamente al receptor para escuchar difusiones del sistema.
2. Pasos completos
① Crear la clase del receptor BootCompleteReceiver
public class BootCompleteReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "El sistema ha terminado de arrancar", Toast.LENGTH_LONG).show();
}
}
Lenguaje del código: PHP (php)
- Cómo crearlo: En Android Studio, haz clic derecho en el paquete → New → Other → Broadcast Receiver.
- Descripción de parámetros:
Enabled: Indica si el receptor está habilitado (marcar esta casilla).Exported: Indica si acepta difusiones del sistema desde fuera de la aplicación (marcar esta casilla, ya que necesitamos recibir la difusión de arranque del sistema, que es una difusión externa).
Establecer
exported="false"en el manifest, como aparece en algunos materiales de curso, es incorrecto. Para recibir difusiones del sistema, se debe configurarexported="true".
② Añadir permisos en AndroidManifest.xml
<!-- Permiso para recibir la difusión de arranque completado -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
Lenguaje del código: HTML, XML (xml)
③ Registrar estáticamente el receiver + intent-filter dentro de <application>
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<!-- Acción de arranque completado -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
Lenguaje del código: HTML, XML (xml)
intent-filter: Filtro que declara qué tipo de difusión escucha este receptor. Aquí se monitoriza la difusión del sistemaBOOT_COMPLETED.
3. Notas importantes
¡Nunca incluyas lógica que consuma mucho tiempo en onReceive()! El método
onReceivedel receptor se ejecuta en el hilo principal y tiene un tiempo de ejecución muy limitado (unos 10 segundos). Si realizas tareas pesadas, el sistema lanzará un error ANR (Application Not Responding) y la aplicación se cerrará de forma inesperada.
Enfoque recomendado: El receptor solo debe encargarse de disparadores ligeros, como por ejemplo:
- Mostrar una notificación.
- Iniciar un Servicio en segundo plano.
- Lanzar una Activity. Delega la lógica de negocio compleja a un Servicio para su procesamiento; no la escribas directamente en
onReceive.
Implementación de un aviso de inicio mediante registro estático