我最近問了一個關於檢查已發送短信狀態的問題,給出的答案是一個代碼片段,它註冊了兩個「匿名內部」(請糾正我的術語,如果它不正確)BroadcastReceivers
收聽SMS發送/傳送的廣播。這些接收者只需要接收我剛剛發送的短信的數據,因此不需要永久收聽。我需要註銷'anonymous'BroadcastReceiver
我的直接想法是「好的,我需要在他們結束後取消註冊他們」,但這是正確的嗎?我問海報,因爲他沒有包含任何註銷代碼,但沒有回覆。該代碼似乎是一個非常標準的做我想做的事情,因爲它出現在衆多的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發送/傳遞事件的通知。例如。在這些BroadcastReceivers
已註冊之後,我可以發送短信,但沒有看到任何Toast
消息。
所以,我有兩個問題:
- 我需要註銷這些
BroadcastReceivers
? - 如果不是,爲什麼不呢?
你爲什麼認爲它會崩潰? – barry
更新了我的答案。 –
那麼,代碼是在不同的BroadcastReceiver(由AlarmManager喚醒),所以我沒有任何生命週期方法來做我的註銷。如果需要,我會在onReceive()的結尾處註銷註冊 – barry