android - 我是否需要注销 'anonymous' BroadcastReceiver

标签 android sms broadcastreceiver anonymous-inner-class

我最近问了一个关于检查已发送短信状态的问题,给出的答案是注册了两个“匿名内部”的代码 fragment (如果不正确,请更正我的术语)BroadcastReceivers收听短信发送/传送的广播。这些接收器只需要接收有关我的应用程序刚刚发送的 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 发送/传递事件的通知。例如。我可以在这些 BroadcastReceivers 注册后发送 SMS,并且看不到任何 Toast 消息。

所以,我有两个问题:

  1. 我需要注销这些 BroadcastReceivers 吗?
  2. 如果不是,为什么不呢?

最佳答案

只需将您的 BroadcastReceiver 保存到一个实例中,这样您就可以注销它 ;-)

只需将这一行从:

registerReceiver(new BroadcastReceiver(){

到:

BroadcastReceiver smsReceiver=new BroadcastReceiver(){...}
registerReceiver(smsReceiver);

稍后你可以执行:

unregisterReceiver(smsReceiver);

请记住将 smsReceiver 保存为类成员。

关于android - 我是否需要注销 'anonymous' BroadcastReceiver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10919060/

相关文章:

android - 将构建类型 ("debug"/"release") 传递给 ndk-build

android - 将标签值设置为图像按钮

ios - MFMessageComposeViewController canSendText 类在模拟器上返回 YES

android - 如何在android中安排稍后发送的短信?

android - 尝试使用没有过滤器的广播接收器

java - 当 JSONArray 大于 261​​ 时应用程序崩溃

Android 获取有关安装或删除的应用程序的广播

android - 如何从日历中获取下周的日期

android - 如何在 Lollipop 之前的设备上使用 Material design ProgressBar?

javascript - 如何从 UIWebView 获取数据传递到 Objective-c IOS 中的 native 应用程序