with never keep implement how example create alive android service broadcastreceiver broadcast intentservice

android - never - ¿Por qué LocalBroadcastManager no funcionaría en lugar de Context.registerReceiver?



how to implement a service in android (3)

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.

Anular el registro:

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

Emisión:

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

Tuve que implementar una función en esta aplicación que consiste en una Activity y un Service trabajan en segundo plano (implementa el Service , no el servicio de IntentService ).

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

Si no necesita enviar transmisiones a través de las aplicaciones, considere usar esta clase con LocalBroadcastManager lugar de las instalaciones más generales que se describen a continuación.

Literalmente perdí un día para descubrir el problema por el cual no funcionaría para mí: solo funciona si uso Context.sendBroadcast() . y Context.registerReceiver() lugar de los métodos LocalBroadcastManager .

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

EDITAR:

Después de escribir esta pregunta, fui más allá en el problema. LocalBroadcastManager funciona a través de Singleton, como deberíamos llamar LocalBroadcastManager.getInstance(this).method() . Registraba 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? (perdón por la larga publicación)

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 usado LocalBroadcastManager, pero parece que tienes 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 Contexto no está relacionada con hilos. De hecho, tanto el Servicio como la Actividad son subclases (indirectas) de Contexto, ¡así que son sus propios Contextos!
Es por eso que puedes usar "esto" como contexto.

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


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