Un ejemplo – Recibir difusiones del sistema
I. Conceptos básicos de las difusiones (Broadcast)
1. Qué son las difusiones del sistema
- Android trae integradas numerosas difusiones de nivel de sistema, para notificar los cambios de estado del sistema.
- Difusiones del sistema habituales:
- Batería baja / variación del nivel de batería
- Arranque finalizado (
BOOT_COMPLETED) - Cambio del estado de red (
CONNECTIVITY_CHANGE) - Cambio del modo avión
- Cambio de hora / zona horaria
2. Función del receptor de difusiones
- La aplicación registra un receptor de difusiones para escuchar las difusiones que le interesan.
- Cuando llega una difusión, el sistema invoca automáticamente el método
onReceive()del receptor. - Escribe la lógica de negocio dentro del método
onReceive().
II. Dos métodos de registro de difusiones
| Elemento de comparación | Registro dinámico (registro por código) | Registro estático (registro en Manifest) |
|---|---|---|
| Lugar de registro | Dentro de componentes como Activity / Service | AndroidManifest.xml |
| Ciclo de vida | Vinculado al componente donde se registra | Independiente de los componentes; puede recibir difusiones incluso si la app no se ha iniciado |
| Flexibilidad | Alta, se puede registrar o anular el registro en cualquier momento | Baja, queda definido al instalar la aplicación |
| Casos de uso | Difusiones que requieren conocer el ciclo de vida del componente | Difusiones globales, ejecución al arranque, etc. |
| Restricciones en versiones nuevas | Sin restricciones especiales | Android 8.0+ impone muchas limitaciones a las difusiones implícitas |
Importante: No se permite el registro estático para la difusión
CONNECTIVITY_CHANGE(cambio de red) en Android 7.0 y superior. Es obligatorio usar el registro dinámico.
III. Crear un receptor de difusiones
Pasos básicos
- Crea una nueva clase que herede de
BroadcastReceiver - Sobrescribe el método
onReceive(Context context, Intent intent) - Procesa la lógica de la difusión recibida dentro de
onReceive()
Código
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// Procesar la lógica de la difusión
}
}Lenguaje del código: PHP (php)
IV. Flujo completo del registro dinámico
1. Definir variables miembro
private NetworkChangeReceiver networkChangeReceiver;
private IntentFilter intentFilter;Lenguaje del código: PHP (php)
2. Registrar dentro de onCreate()
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkChangeReceiver = new NetworkChangeReceiver();
intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(networkChangeReceiver, intentFilter);
}Lenguaje del código: JavaScript (javascript)
3. Anular el registro en onDestroy() (¡Obligatorio!)
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}Lenguaje del código: CSS (css)
4. Definir la clase interna del receptor
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "La red ha cambiado", Toast.LENGTH_LONG).show();
}
}Lenguaje del código: JavaScript (javascript)