Android BroadcastReceiver dentro de la actividad

Solo estoy probando este pequeño proyecto de muestra, todo lo que hace: la actividad uno tiene un botón que envía una transmisión. La actividad dos muestra un brindis cuando se recibe. Debajo está el código, la transmisión nunca se recibe. ¿Qué hago mal?

Enviando la transmisión

public class SendBroadcast extends Activity { public static String BROADCAST_ACTION = "com.unitedcoders.android.broadcasttest.SHOWTOAST"; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } public void sendBroadcast(View v){ Intent broadcast = new Intent(); broadcast.setAction(BROADCAST_ACTION); sendBroadcast(broadcast); } } 

Recibiéndolo

 public class ToastDisplay extends Activity { private BroadcastReceiver receiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT); } }; @Override protected void onResume() { IntentFilter filter = new IntentFilter(); filter.addAction(SendBroadcast.BROADCAST_ACTION); registerReceiver(receiver, filter); super.onResume(); } @Override protected void onPause() { unregisterReceiver(receiver); super.onPause(); } } 

Manifiesto

              

¿Qué hago mal?

El código fuente de ToastDisplay está bien (el mío es similar y funciona), pero solo recibirá algo, si está actualmente en primer plano (registras el receptor en onResume). Pero no puede recibir nada si se muestra una actividad diferente (en este caso, la actividad SendBroadcast).

En su lugar, es probable que desee iniciar la ToastDisplay de la actividad de la primera actividad.

BroadcastReceiver y Activity tienen sentido en un caso de uso diferente. En mi aplicación , necesito recibir notificaciones de un servicio de seguimiento GPS de fondo y mostrarlas en la actividad (si la actividad está en primer plano ).

No es necesario registrar el receptor en el manifiesto . Sería incluso dañino en mi caso de uso: mi receptor manipula la IU de la actividad y la IU no estaría disponible durante la recepción de recepción si la actividad no se muestra actualmente. En su lugar, registro y elimino el registro de la actividad en onResume y onPause como se describe en la documentación de BroadcastReceiver :

Puede registrar dinámicamente una instancia de esta clase con Context.registerReceiver () o publicar de forma estática una implementación a través de la etiqueta en su AndroidManifest.xml.

  Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT); 

hace el brindis, pero no lo muestra.

Tienes que hacer Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show();

Extiende la clase ToastDisplay con BroadcastReceiver y registra el receptor en el archivo de manifiesto, y no registras tu receptor de difusión en onResume ().

       

si desea registrarse en la actividad, regístrese en el método onCreate (), por ejemplo:

 onCreate(){ sentSmsBroadcastCome = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "SMS SENT!!", Toast.LENGTH_SHORT).show(); } }; IntentFilter filterSend = new IntentFilter(); filterSend.addAction("m.sent"); registerReceiver(sentSmsBroadcastCome, filterSend); } 

Necesita definir el receptor como una clase en el manifiesto y recibirá la intención:

       

Y no es necesario crear la clase manualmente dentro de ToastDisplay.

En el código que proporcionó, debe estar dentro de la actividad ToastDisplay para recibir realmente el Intento.

¡Creo que tu problema es que envías la transmisión antes de que comience la otra actividad! entonces la otra actividad no recibirá nada.

  1. La mejor práctica para probar el código es enviar transmisiones desde un hilo o desde un servicio para que la actividad se abra y se registre el receptor y el proceso en segundo plano envíe un mensaje.
  2. Inicie la actividad ToastDisplay desde la actividad del remitente (no lo probé, pero probablemente funcione)

Olvidaste escribir .show () al final, que se usa para mostrar el mensaje de brindis.

 Toast.makeText(getApplicationContext(), "received", Toast.LENGTH_SHORT).show(); 

Es un error común que el progtwigdor lo haga, pero estoy seguro de que después de esto no volverá a repetir el error …: D

También debe registrar el receptor en onCreate (), así:

 IntentFilter filter = new IntentFilter(); filter.addAction("csinald.meg"); registerReceiver(receiver, filter);