2012-01-05 14 views
22

¿Es posible registrar dinámicamente un receptor de difusión en un fragmento para detectar los cambios de estado de conectividad? ¿Si es así, cómo? Si no, ¿cuáles son algunas soluciones para los fragmentos?Receptor de difusión dinámica en el fragmento

EDITAR: Para registrar un BroadcastReceiver necesita un contexto. Dado que los fragmentos viven dentro de las actividades, probablemente la mejor forma de obtener un contexto es simplemente usar getActivity(). Sin embargo, como explica gnorsilva a continuación, hay ciertos casos especiales a los que hay que prestarle atención.

+0

Podrías dejar que la actividad del host manejar la transmisión y comunicarse con el fragmento – Neil

+0

¿No podría eso la actividad y el fragmento? una de las ventajas de los fragmentos es que puedes reutilizarlos en otras actividades. esto reduciría tu habilidad para hacerlo. Tengo el mismo problema en una de mis aplicaciones y es lo mismo con todo lo que requiere un contexto. Terminé usando una clase base de actividad que encapsulaba la funcionalidad que el fragmento necesita. no los desacopla por completo, pero facilita el mantenimiento. – FunkSoulBrother

Respuesta

30

user853583 sugerencia es buena, pero si es necesario tener acceso a un contexto dentro de un fragmento que debe utilizar getActivity().getApplicationContext()

Debe evitar el paso de una actividad como un contexto siempre que sea posible como esto puede generar pérdidas de memoria: algunos objetos se aferrarán a esa actividad una vez que se haya llamado a onDestroy() y no se recolectará basura.

Una vez dicho esto, hay casos en que sí es necesario para pasar una actividad como contexto - por ejemplo: para adaptadores de la lista

Dos cosas mas sin embargo:

  • debido a un fragmento se une y desprendido de una actividad, algunas veces getActivity() regresa null - se le puede llamar de forma segura dentro de ciertos métodos de ciclo de vida donde se sabe que una actividad está vivo, por ejemplo: onResume()

  • si su fragmento no hace r ETAIN su decir instancia se destruye en el cambio de orientación, asegúrese de cancelar el registro de su receptor en su fragmento, por ejemplo, en el interior onPause() o onDestroy()

+0

Tenga en cuenta que si utiliza setDebugUnregister (verdadero) para un receptor de difusión, se mantendrá una referencia a su fragmento durante todo el ciclo de vida de la aplicación. Esto puede provocar una pérdida aparente de memoria, especialmente durante el uso intensivo :) – greg7gkb

3

Por lo que puedo ver, no hay forma de registrar un BroadcastReceiver en un fragmento. ¿Para qué necesitas ese receptor de difusión? Una buena solución es la que se menciona here

+2

Según la pregunta original, debe escuchar las emisiones enviadas por el sistema; en este caso, las transmisiones de conectividad se envían cuando se conecta wifi. – Theo

1

Puede registrar un receptor de radiodifusión como esto:. getActivity() registerReceiver (. ..

Cuestiones relacionadas