最近、送信された SMS の状態を確認する方法について質問したところ、BroadcastReceivers
SMS の送信/配信されたブロードキャストをリッスンするための 2 つの「匿名内部」(用語が間違っている場合は修正してください) を登録したコード スニペットが返されました。これらの受信者は、アプリケーションが送信したばかりの SMS に関するデータを受信することのみを要求されたので、永続的にリッスンする必要はありませんでした。
すぐに「まあ、使い終わったら登録解除しなきゃ」と思ったのですが、これでよろしいでしょうか?登録解除コードが含まれていなかったので、投稿者にこれを尋ねましたが、返事がありませんでした。コードは、多数の Android 開発サイトに表示されているため、私が望むことを行うためのかなり標準的な方法のようです。ここにあります:
//---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);
コードは正常に動作します。
さらに、アプリの外部で発生する SMS 送信/配信イベントの通知を受けません。たとえば、これらが登録された後に SMS を送信できますが、メッセージBroadcastReceivers
は表示されません。Toast
だから、私は2つの質問があります:
- これらの登録を解除する必要があり
BroadcastReceivers
ますか? - そうでない場合、なぜですか?