telcel samsung que puedo porque por para mensajes mensaje mandar leerlos fotos error enviar descargar borren borran autodestruyen archivo aplicacion admitido adjunto android android-intent broadcastreceiver

android - samsung - Usar un receptor de difusión/transmisión para enviar mensajes de un servicio a una actividad



porque no puedo enviar mensajes multimedia samsung galaxy (4)

Para transmitir un intento:

Intent intent = new Intent("com.yourcompany.testIntent"); intent.putExtra("value","test"); sendBroadcast(intent);

Para recibir el mismo intento de uso:

IntentFilter filter = new IntentFilter("com.yourcompany.testIntent"); BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String value = intent.getExtras().getString("value"); } }; registerReceiver(receiver, filter);

Así que entiendo (creo) sobre los intentos de transmisión y recibir mensajes para ellos.

Entonces, mi problema / lo que no puedo resolver es cómo enviar un mensaje desde el método onReceive de un receptor a una actividad. Digamos que tengo un receptor como tal:

public class ReceiveMessages extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equalsIgnoreCase(TheService.DOWNLOADED)){ // send message to activity } } }

¿Cómo enviaría un mensaje a una actividad?

¿Tendría que crear una instancia del receptor en la actividad a la que quiero enviar mensajes y monitorearla de alguna manera? ¿O que? Entiendo el concepto, pero no realmente la aplicación.

Cualquier ayuda sería absolutamente increíble, gracias.

Tom


Posiblemente no sea relevante en el momento de la pregunta, pero ahora existe LocalBroadcastManager en el paquete de soporte de Android.

Funciona más o menos de la misma manera que las transmisiones normales, pero todas las "conversaciones" son locales a la aplicación en la que se está ejecutando.

Ventajas:

  • Sabes que los datos que estás transmitiendo no saldrán de tu aplicación, por lo que no debes preocuparte por filtrar información privada.
  • No es posible que otras aplicaciones envíen estas transmisiones a su aplicación, por lo que no debe preocuparse por tener agujeros de seguridad que puedan explotar.
  • Es más eficiente que enviar una transmisión global a través del sistema.

Ejemplo:

Intent i = new Intent("my.local.intent"); LocalBroadcastManager.getInstance(context).sendBroadcast(i);

y para recibir

receiver = new MyBroadcastReceiverToHandleLocalBroadcast(); IntentFilter i = new IntentFilter(); i.addAction("my.local.intent"); LocalBroadcastManager.getInstance(context).registerReceiver(receiver, i);


Sin ánimo de ofender, pero tu pregunta sigue siendo malditamente vaga. Por lo tanto, voy a delinear todo un lío de escenarios y espero que uno de ellos llegue a cualquier problema que creas tener.

Escenario A: solo la actividad

Si solo necesita recibir la transmisión cuando tiene una actividad en primer plano, haga que la actividad registre el BroadcastReceiver usando registerReceiver() . Como @MisterSquonk indicó, registraría el receptor en onResume() y lo onPause() en onPause() .

Escenario B: Actividad si está en primer plano, Else Otro; Transmisión ordenada

Si desea que la actividad en primer plano maneje la transmisión, pero desea que suceda algo más si esa actividad no está en primer plano (por ejemplo, generar una Notification ), y la transmisión es una transmisión ordenada (por ejemplo, SMS entrantes), entonces usted seguiría utilizando la solución del Escenario A, pero con un IntentFilter mayor prioridad (ver setPriority() ). Además, registraría un BroadcastReceiver través de un elemento <receiver> en el manifiesto, con un <intent-filter> de menor prioridad para la misma transmisión. En el BroadcastReceiver la actividad, llame a abortBroadcast() para consumir el evento y evitar que llegue a su BroadcastReceiver registrado en manifiesto.

Escenario C: Actividad si está en primer plano, Else Otro; Transmisión regular

Si el Escenario B casi se ajusta, pero la transmisión que está escuchando no es una transmisión ordenada, deberá comenzar con el Escenario B. Sin embargo, haga que la transmisión que ambos receptores tienen en sus respectivos filtros sea suya, utilizando un canal privado cadena de acción como @MisterSquonk sugirió. Además, tenga otro BroadcastReceiver registrado en el manifiesto, cuyo <intent-filter> es para la transmisión real que está escuchando. Ese receptor simplemente llamaría a sendOrderedBroadcast() para enviar la transmisión ordenada que los otros receptores están escuchando.

Escenario D: actividad sin importar el primer plano

Si alguna actividad tuya necesita saber sobre la transmisión, y no importa si está en primer plano o no, debes reconsiderar lo que quieres decir con eso. Generalmente, esto significa que la transmisión afecta su modelo de datos de alguna manera, en cuyo caso su preocupación no debe ser dejar que las actividades sepan, sino actualizar su modelo de datos, y usar su ya existente "que las actividades sepan sobre el cambio de modelo de datos "lógica maneja el resto.

Sin embargo, si está convencido de que esto no forma parte de su modelo de datos, puede implementar el Escenario B o el Escenario C, además de incluir cierta información en un miembro de datos estáticos. Sus actividades pueden examinar ese miembro de datos estáticos en onResume() para recoger la información sobre la transmisión cuando vuelven al primer plano.

Si está pensando "pero, ¿qué pasa si mi proceso finaliza entre la transmisión y la otra actividad que se pone en primer plano?", Entonces su transmisión realmente está actualizando su modelo de datos, según el párrafo inicial de este escenario.

Si está pensando "pero quiero actualizar una actividad que está haciendo el trabajo en segundo plano", entonces la actividad en cuestión se rompe. Las actividades nunca deben estar haciendo el trabajo en segundo plano. Ese trabajo debe ser delegado a algún tipo de servicio, y hay un conjunto completo de escenarios relacionados para obtener una transmisión al servicio.


EDITADO Ejemplos de código corregido para registrar / anular el registro de BroadcastReceiver y también eliminar declaración de manifiesto.

Defina ReceiveMessages como una clase interna dentro de la Activity que necesita escuchar los mensajes del Service .

Luego, declare variables de clase como ...

ReceiveMessages myReceiver = null; Boolean myReceiverIsRegistered = false;

En onCreate() use myReceiver = new ReceiveMessages();

Luego en onResume() ...

if (!myReceiverIsRegistered) { registerReceiver(myReceiver, new IntentFilter("com.mycompany.myapp.SOME_MESSAGE")); myReceiverIsRegistered = true; }

... y en onPause() ...

if (myReceiverIsRegistered) { unregisterReceiver(myReceiver); myReceiverIsRegistered = false; }

En el Service crea y transmite el Intent ...

Intent i = new Intent("com.mycompany.myapp.SOME_MESSAGE"); sendBroadcast(i);

Y eso es todo. Haga que la "acción" sea única para su paquete / aplicación, es decir, com.mycompany... como en mi ejemplo. Esto ayuda a evitar una situación en la que otras aplicaciones o componentes del sistema intenten procesarla.