Hace poco hice una pregunta sobre la comprobación del estado de un SMS enviado y la respuesta fue un fragmento de código que registró dos 'anónimos internos' (corrija mi terminología si es incorrecta) BroadcastReceivers
para escuchar transmisiones enviadas/entregadas por SMS. Estos receptores solo tenían que recibir datos sobre el SMS que acababa de enviar mi aplicación, por lo que no estaban obligados a escuchar de forma permanente.Necesito cancelar el registro de BroadcastReceiver 'anónimo'
Mi pensamiento inmediato fue "bueno, tendré que cancelar el registro después de que haya terminado con ellos", pero ¿es esto correcto? Le pregunté al póster esto porque no había incluido ningún código para anular el registro, pero no obtuve respuesta. El código parece ser una forma bastante estándar de hacer lo que quiero, ya que aparece en numerosos sitios de desarrollo de Android. Aquí está:
//---sends an SMS message to another device---
private void sendSMS(String phoneNumber, String message)
{
String SENT = "SMS_SENT";
String DELIVERED = "SMS_DELIVERED";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
PendingIntent deliveredPI = PendingIntent.getBroadcast(this, 0,
new Intent(DELIVERED), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
//---when the SMS has been delivered---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS delivered",
Toast.LENGTH_SHORT).show();
break;
case Activity.RESULT_CANCELED:
Toast.makeText(getBaseContext(), "SMS not delivered",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(DELIVERED));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(phoneNumber, null, message, sentPI, deliveredPI);
El código funciona bien.
Además, no recibe ninguna notificación de ningún evento enviado/entregado por SMS que ocurra fuera de mi aplicación. P.ej. Puedo enviar un SMS después de que se hayan registrado estos BroadcastReceivers
y no vea ningún mensaje Toast
.
lo tanto, tengo dos preguntas:
- Qué necesito para anular el registro de estos
BroadcastReceivers
? - Si no, ¿por qué no?
¿Por qué crees que debería bloquearse? – barry
Actualización de mi respuesta. –
Bueno, el código está en un BroadcastReceiver diferente (despertado por AlarmManager) por lo que no tengo ningún método de ciclo de vida para hacer mi anulación de registro. Me gustaría poner el anulando el registro al final de onReceive() si es necesario – barry