¿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:
- ¿Cómo mantengo un Servicio vivo indefinidamente?
- ¿Cómo detener el servicio de otra actividad en Android?
- El sistema Android eliminó mi servicio cuando borro todas las aplicaciones recientes
- ServiceConnection :: onServiceConnected no se llama aunque Context :: bindService devuelve true?
- ¿Cómo puedo activar automáticamente el inicio automático de mis aplicaciones en el menú de seguridad Xiaomi Mi4i?
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)); } }
- Preferencia en el oyente de cambio
- ¿Necesita ayuda para descargar imágenes de fondo en Android?
- ¿Abre la aplicación de Android enviando un mensaje de texto?
- Mi BroadcastReceiver no está recibiendo la intención BOOT_COMPLETED después de mis botas N1
- Servicio de Android para mostrar brindis
- Cómo mantener mi servicio de aplicación sigue funcionando incluso si la aplicación está cerrada desde el administrador de tareas en MI teléfono
- Una forma correcta de depurar un servicio en Android Studio?
- Singleton se destruye
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)
- El método getResources () y el contexto no está definido para el tipo
- GetErrorDialog se deprecia. ¿Cuál es la función actualizada, y cómo puedo usarla?