2011-10-24 10 views
7

Estoy escribiendo un receptor de difusión simple. He registrado receptores tanto en el manifiesto como en el código anterior. Para mis propósitos, este es un receptor simple que no necesita hacer nada elegante.¿Es mejor práctica de código registrar un receptor en manifiesto o en código?

¿Hay alguna razón para elegir un método sobre el otro en este caso? ¿Registrar el receptor en el manifiesto es más eficiente (se ejecuta más rápido)? ¿O son los dos básicamente lo mismo?

Pregunto porque la aplicación que estoy escribiendo debe ser muy eficiente, y no he podido encontrar buena información sobre la diferencia práctica entre los dos métodos. Intento seguir lo que sea que sea la mejor práctica de codificación.

Cheers

Respuesta

8

Bueno, en realidad son diferentes. Pareces pensar que es casi lo mismo. Cuando registra un receptor en el código, debe anular el registro cuando la aplicación se destruya (en realidad, cuando Activity o Service lo registran, se destruye). Por otro lado, cuando lo declaras en el manifiesto, lo haces disponible incluso si tu aplicación no se está ejecutando.

Simplemente pregúntese: ¿cuál de los dos enfoques se ajusta mejor a sus necesidades?

+0

interesante. Gracias. Todavía suenan muy similares a mí, no es demasiado difícil controlar cuándo registrar/anular el registro del receptor. Además, si está ejecutando el receptor en un servicio, funcionará si la aplicación no se está ejecutando. ¿Está diciendo que si esto no fuera un servicio, el receptor funcionaría si la aplicación no se ejecuta si se implementa en el manifiesto? Eso no está bien. – Dave

+0

Solo una aclaración ... si se está ejecutando un servicio: la aplicación ** está ** ejecutándose. – Cristian

+0

aha Acabo de tener un momento de clic. Gracias Cristian! – Dave

2

No puedo hablar de la eficacia de la implementación de una sobre la otra (mi intuición me dice que es demasiado cercana como para importar), pero por razones insinuantes en la respuesta de Cristian, registrar y anular el registro programáticamente podría tu aplicación es más eficiente.

Si se registra en el manifiesto, su receptor de emisión siempre se despertará por cualquier intento que coincida con sus filtros. Si se registra mediante programación, solo puede permitir que su receptor se active en determinados momentos, y puede controlar qué intentos despertarán su receptor y en qué momento.

Si realmente está preocupado por despertar el receptor a veces que no tiene que ser así, hágalo programáticamente en el código. Deberá tener más cuidado de anular el registro siempre, y asegurarse de que su receptor esté registrado en todo momento como espera, pero si lo hace correctamente, puede evitar despertar su receptor innecesariamente, y así ahorrar algo de eficiencia. .

+0

Me gusta la idea de tener el control adicional de cuando el receptor está activo o no. Gracias. – Dave

0

Depende del escenario.

Cuándo utilizar el método para registrar

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

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

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

Ejemplos de la primera categoría son aplicaciones que necesitan trabajar tan pronto como el dispositivo se arranca o que debe 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 BroadcastReceiver en el archivo Manifest.

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

También hay algunos eventos que ni siquiera está permitido registrar estáticamente. Un ejemplo de esto es el evento Intent.ACTION_TIME_TICK que se transmite cada minuto. Lo cual es una decisión acertada porque un receptor estático podría drenar innecesariamente la batería.

0

En pocas palabras

registro dinámico - Su aplicación espera que suceda algo de inmediato, mientras que la aplicación se está ejecutando

registro estático - Usted aplicación está esperando que pase algo en el largo plazo. Y puesto que no se puede garantizar que su aplicación se ejecuta cuando ocurre se puede pedir educadamente el sistema androide para que le notifique cuando lo hace

Ambos tendrían la misma ejecución más allá de ese punto

+0

¡Bienvenido a Stack Overflow! Siéntase libre de realizar una [visita] (// stackoverflow.com/tour) del sitio, y si necesita ayuda adicional con el sitio, verifique [this] (// stackoverflow.com/help). Ah, y si alguna vez se encuentra con problemas que la página de ayuda no cubre, no dude en preguntar en [meta] (// meta.stackoverflow.com/). –

+0

Además, tenga en cuenta que esta pregunta tiene casi 6 años, y si se publicara ahora, se migraría rápidamente a [SoftwareEngineering.SE] (https://softwareengineering.stackexchange.com/). Lo he rechazado por este motivo, pero no se lo tome como algo personal. :-) –

+0

Oh, ¿debería haber intentado mover la pregunta? ¿O simplemente no responden a viejas preguntas sin importar qué? – cagney

Cuestiones relacionadas