【问题标题】:How to unregister BroadcastReceiver如何注销广播接收器
【发布时间】:2011-11-18 08:05:17
【问题描述】:

我的应用程序使用广播接收器以这种方式获取短信:

SmsBR.java

public class SmsBR extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[])bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];

            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            if (messages.length > 0)
                //doSomething();
            }
        }
    }
}

Manifest.xml

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".Activity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter> 
    </activity>

    <receiver android:name=".SmsBR">
        <intent-filter>
            <action android:name="android.provider.Telephony.SMS_RECEIVED"></action>
        </intent-filter>
    </receiver>
</application>    

这样,SmsBR 始终处于开启状态。我想在服务启动时注册它(onCreate())并在服务被销毁时取消注册(onDestroy())。我该怎么做?

【问题讨论】:

    标签: android broadcastreceiver


    【解决方案1】:

    编辑:

    对于活动:

    为了在您的应用中注册您的广播接收器,首先,从您的 AndroidManifest.xml 文件中删除 &lt;receiver&gt; 标记。然后,在您的onResume() 中拨打registerReceiver(BroadcastReceiver receiver, IntentFilter filter)。在onPause() 中使用unregisterReceiver(BroadcastReceiver receiver) 取消注册广播接收器。

    对于服务:

    从清单文件中删除接收者标签。然后,您可以在onCreate() 中使用相同的方法注册您的广播接收器,并在onDestroy() 中取消注册。

    编辑:示例代码:

    public class MyActivity extends Activity {
      private final BroadcastReceiver mybroadcast = new SmsBR();
    
      public void onResume() {
        super.onResume();
    
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(mybroadcast, filter);
      }
    
      public void onPause() {
        super.onPause();
    
        unregisterReceiver(mybroadcast);
      }
    }
    

    【讨论】:

    • 所以我必须使用SmsBR 的实例并(取消)注册它?我应该为收到的短信使用哪个 IntentFilter?
    • 是的,没错。使用 SmsBR 的实例,最好将其设为 final,然后注册/注销它。我已经为您添加了示例代码。关于 IntentFilter,使用与清单文件中几乎相同的过滤器。
    • @WindsurferOak 嗨,发现这篇文章很有帮助。我也有一个扩展广播接收器的类,需要注销它。 “registerReceiver(mybroadcast, filter);”出现错误CLASS_NAME 类型的方法未定义”你能建议吗?
    • android中广播接收器需要注销吗?
    • 如果我不注销广播接收器会怎样?手机重启后它还会保持活跃吗?
    【解决方案2】:

    onDestroy() 不保证被调用。当您从 Activty 启动 Activity 时,将调用 onPause()onStop() 方法而不是 onDestroy()

    onDestroy() 在您按下返回按钮或调用 finish() 方法时调用。

    因此,广播接收器应在onStart()onResume() 中注册,并在onPause()onStop() 中注销接收器。

    如果您在onDestroy() 方法中注销接收器,可能会导致 App 内存泄漏

    【讨论】:

    【解决方案3】:

    首先从清单中删除接收者标签, 然后: 服务:

    @Override
    public void onCreate() {
    
    
        myReceiver = new SmsBR();
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.intent.action.SMS_RECEIVED");// add any actions you want
        registerReceiver(myReceiver , filter);
    
     }
    
    @Override
    public void onDestroy() {
        super.onDestroy();
        if (myReceiver != null)
            unregisterReceiver(myReceiver);
    }
    

    对于活动:

    public class MyActivity extends Activity {
      private final BroadcastReceiver mybroadcast = new SmsBR();
    
      public void onResume() {
        super.onResume();
    
        IntentFilter filter = new IntentFilter();
        filter.addAction("android.provider.Telephony.SMS_RECEIVED");
        registerReceiver(mybroadcast, filter);
      }
    
      public void onPause() {
        super.onPause();
    
        if (mybroadcast!= null)
           unregisterReceiver(mybroadcast);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多