programacion - Android BroadcastReceiver dentro de la actividad
manual de programacion android pdf (7)
Solo estoy probando este pequeño proyecto de muestra, todo lo que hace: la actividad uno tiene un botón que envía una difusión. La actividad dos muestra un brindis cuando se recibe. A continuación se muestra el código, la emisió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);
}
}
Recibiendolo
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
<application android:icon="@drawable/icon" android:label="@string/app_name">
<activity android:name=".SendBroadcast" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".ToastDisplay">
<intent-filter>
<action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"></action>
</intent-filter>
</activity>
</application>
¿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 (registra 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 startActivity ToastDisplay desde la primera actividad?
BroadcastReceiver y Activity tienen sentido en un caso de uso diferente. En mi solicitud , necesito recibir notificaciones de un servicio de rastreo GPS en segundo plano y mostrarlas en la actividad (si la actividad está en primer plano ).
No hay necesidad de registrar el receptor en el manifiesto . Incluso sería perjudicial en mi caso de uso: mi receptor manipula la interfaz de usuario de la actividad y la interfaz de usuario no estará disponible durante onReciba si la actividad no se muestra actualmente. En su lugar, registro y anulo el registro del receptor para 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 estáticamente una implementación a través de la etiqueta en su AndroidManifest.xml.
Creo que tu problema es que envías la transmisión antes de que comience la otra actividad. Así que la otra actividad no recibirá nada.
- La mejor práctica para probar su código es enviar una transmisión desde un hilo o desde un servicio para que la actividad se abra y se registre en el receptor y el proceso en segundo plano envíe un mensaje.
- iniciar la actividad ToastDisplay desde la actividad del remitente (no probé eso, pero es probable que funcione)
Debe definir el receptor como una clase en el manifiesto y recibirá la intención:
<application
....
<receiver android:name=".ToastReceiver">
<intent-filter>
<action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/>
</intent-filter>
</receiver>
</application>
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 el Intent.
Extiende la clase ToastDisplay con BroadcastReceiver y registra el receptor en el archivo de manifiesto, y no registra tu receptor de difusión en onResume ().
<application
....
<receiver android:name=".ToastDisplay">
<intent-filter>
<action android:name="com.unitedcoders.android.broadcasttest.SHOWTOAST"/>
</intent-filter>
</receiver>
</application>
Si desea registrarse en la actividad, entonces 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);
}
También tienes que registrar el receptor en onCreate (), así:
IntentFilter filter = new IntentFilter();
filter.addAction("csinald.meg");
registerReceiver(receiver, filter);
Te olvidas de 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 hace el programador, pero estoy seguro de que después de esto no volverá a repetir el error ...: D
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();