true studio start sendbroadcast exported example android broadcastreceiver android-lifecycle

studio - sendbroadcast android example



Diferencia principal entre el registro manifiesto y programático de BroadcastReceiver (3)

Estoy tratando de entender las principales diferencias entre registrar un BroadcastReceiver en el Manifiesto y registrarlo programáticamente ...

Básicamente, mi comprensión es la siguiente (apreciaría que alguien corrigiera mis puntos si me falta algo).

  • Registrado en Manifiesto:

    1. El sistema operativo mágicamente buscará y creará una instancia de su clase si es necesario, llamando al método onReceive (), independientemente del estado de ejecución de su aplicación.
    2. Su recepción solo se llamará una vez por transmisión (es decir, puede considerar que registrarse en el manifiesto es como registrar su ''clase'' para recibir la transmisión - y la transmisión crea una instancia de su clase según sea necesario) (??)
  • Registrado programáticamente:

    1. registrarse en el código significa que está registrando instancias de su clase para recibir mensajes de difusión (es decir, si su código es un poco descuidado, y logra registrarse varias veces, terminará con varias instancias de BroadcastReceiver, todas con el nombre de OnReceive ()) una emisión
    2. para anular el registro, debe anular el registro de la instancia específica de BroadcastReceiver que registró anteriormente
    3. Si su aplicación es destruida por el sistema operativo, su método onReceive () no será llamado para una transmisión

Gracias


Lo tienes básicamente correcto.

Tenga en cuenta que un objeto receptor registrado de manifiesto solo se usa una vez. Se crea una nueva instancia de su BroadcastReceiver para cada transmisión. El uso principal de receptores registrados de manifiesto es para transmisiones que pueden continuar mientras su código no está en la memoria (por ejemplo, BOOT_COMPLETED , sus alarmas programadas mediante AlarmManager ).


Tu entendimiento es correcto según el mío.

Otra diferencia relevante (y oscura) es que algunos intentos específicos del sistema solo activarán su receptor si se registra mediante programación . Los receptores solo definidos en el manifiesto no serán llamados. Los ejemplos son: ACTION_SCREEN_ON , ACTION_SCREEN_ON , ACTION_BATTERY_CHANGED , ACTION_HEADSET_PLUG

Recomiendo este text que menciona varios detalles sobre Intenciones y Receptores.


Cuándo usar qué método registrar

El método a utilizar para registrar su BroadcastReceiver depende de lo que haga su aplicación con el evento del sistema. Creo que básicamente hay dos razones por las que su aplicación quiere saber acerca de los eventos de todo el sistema:

  1. Su aplicación ofrece algún tipo de servicio en torno a estos eventos.

  2. Tu aplicación quiere reaccionar amablemente a los cambios de estado.

Los ejemplos de la primera categoría son las aplicaciones que deben funcionar tan pronto como se inicia el dispositivo o que deben iniciar algún tipo de trabajo cada vez que se instala una aplicación. Battery Widget Pro o App2SD son buenos ejemplos para este tipo de aplicaciones. Para este tipo, debe registrar el BroadcastReceiver en el archivo Manifest.

Los ejemplos de la segunda categoría son eventos que indican un cambio en las circunstancias en las que su aplicación podría confiar. Digamos que su aplicación depende de una conexión Bluetooth establecida. Tienes que reaccionar a un cambio de estado, pero solo cuando tu aplicación está activa. En este caso, no es necesario un receptor de difusión registrado estáticamente. Una registrada dinámicamente sería más razonable.

También hay algunos eventos en los que ni siquiera se le permite registrarse de forma estática. Un ejemplo de esto es el evento Intent.ACTION_TIME_TICK que se emite cada minuto. Que es una decisión acertada porque un receptor estático agotaría innecesariamente la batería.