¿Por qué no funciona LocalBroadcastManager en lugar de Context.registerReceiver?

Tuve que implementar una característica de esta aplicación que consiste en una Activity y un Service trabajo en el fondo (que implementa el Service , no IntentService ).

Pasé por algunos tutoriales en Internet que se supone que funcionan, y todos ellos utilizan LocalBroadcastManager , que por cierto es el recomendado por Android:

Si no necesita enviar emisiones a través de aplicaciones, considere utilizar esta clase con LocalBroadcastManager lugar de las instalaciones más generales descritas a continuación.

Literalmente perdí un día para averiguar el problema por qué no funcionaría para mí: sólo funciona si utilizo Context.sendBroadcast() . Y Context.registerReceiver() lugar de los métodos LocalBroadcastManager .

Ahora mi aplicación está funcionando, pero siento que estoy en contra de las mejores prácticas, y no sé por qué. ¿Alguna idea de por qué podría estar sucediendo?

EDITAR:

Después de escribir esta pregunta fui más lejos en el problema. LocalBroadcastManager funciona a través de Singleton, como deberíamos llamar a LocalBroadcastManager.getInstance(this).method() . He registrado ambas instancias (en la Activity y en el Service ) y tienen diferentes direcciones de memoria. Ahora llegué a otra pregunta, ¿no debería un Service tener el mismo Context que la Activity que lo llamó? De este artículo un servicio se ejecuta en el hilo principal, por lo tanto, creo que el Context sería el mismo.

¿Alguna idea sobre eso? (Lo siento por el largo post)

Muestras de código:

MyService

 public class MyService extends Service { ... // When an event is triggered, sends a broadcast Intent myIntent = new Intent(MainActivity.MY_INTENT); myIntent.putExtra("myMsg","msg"); sendBroadcast(myIntent); // Previously I was trying: // LocalBroadcastManager.getInstance(getApplicationContext()).sendBroadcast(myIntent); } 

Mi actividad

 public class MainActivity { ... private BroadcastReceiver messageReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent Log.d("onReceive", "received!"); // TODO something } }; @Override protected void onResume() { super.onResume(); registerReceiver(messageReceiver, new IntentFilter(MY_INTENT)); // Previously I was trying: // LocalBroadcastManager.getInstance(getApplicationContext()).registerReceiver(messageReceiver, new IntentFilter(MY_INTENT)); } } 

Nunca he utilizado LocalBroadcastManager, pero suena como si tuvieras que registrar tu receptor allí (es decir, lbm.registerReceiver(...) , no mycontext.registerReceiver(...) ). ¿Estás haciendo eso?

Ahora llegué a otra pregunta, ¿no debería un Servicio tener el mismo Contexto que la Actividad que lo llamó? De este artículo un servicio se ejecuta en el hilo principal, por lo tanto, creo que el contexto sería el mismo.

La clase Context no está relacionada con los subprocesos. De hecho, tanto el Servicio como la Actividad son subclases (indirectas) de Contexto, por lo que son sus propios Contextos!
Es por eso que puedes usar "esto" como Contexto.

Sin embargo, independientemente del contexto que envíe a LocalBroadcastManager.getInstance() , debería obtener exactamente la misma instancia de LBM . No puedo pensar en ninguna razón que no lo haría – excepto si está ejecutando la actividad y el servicio en diferentes procesos?

Declaración:

 private BroadcastReceiver receiver; 

Inicialización:

 receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { //todo } }; 

Registro:

 LocalBroadcastManager.getInstance(context).registerReceiver(receiver, new IntentFilter("RECEIVER_FILTER")); 

context puede ser cualquier tipo de Context , puede utilizar el contexto de la aplicación.

Cancelar el registro:

 LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver); 

Emisión:

 Intent intent = new Intent("RECEIVER_FILTER"); intent.putExtra("EXTRA", someExtra); LocalBroadcastManager.getInstance(context).sendBroadcast(intent); 

Compruebe si su Servicio y Actividad se ejecutan en un proceso diferente, LocalBroadcastManager no se puede aplicar en proceso diferente. (Debería verlo en el archivo AndroidManifest.xml)

  • Android - Servicio periódico de fondo - Asesoramiento
  • Android - Iniciar un servicio con información adicional a través de put / getExtra
  • ¿Cómo mantener una aplicación Android funcionando indefinidamente?
  • Notificaciones diarias a ciertas horas
  • Android geofencing cuando se mata la aplicación
  • Android: Cómo enviar la solicitud http a través del servicio cada 10 segundos
  • ¿Cómo puedo eliminar una notificación de primer plano en Android Lollipop?
  • Android Service Exchange siempre se bloquea
  • Análisis de fondo wifi en Android
  • El servicio no se inicia de nuevo después de que la aplicación kill incluso utilice START_STICKY en algún dispositivo
  • AlarmManager y BroadcastReceiver en lugar de servicio - ¿es eso malo? (Se acabó el tiempo)
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.