如何从 AppWidgetProvider 注销 BroadcastReceiver?

How to unregister BroadcastReceiver from AppWidgetProvider?

我在我的 AppWidgetProvider onUpdate() 方法中声明了一个 broadcastReceiver。广播接收器将监听连接变化。

IntentFilter intentFilter = new IntentFilter(connectivityChange);
context.getApplicationContext().registerReceiver(mReceiver, intentFilter);

是否每次我的 onUpdate() 方法启动时都会创建一个新的 broadcastReceiver?

如果是,如何取消注册之前的广播,这样我就没有几十个broadcastReceivers了?

context.getApplicationContext().unregisterReceiver(mReceiver);

不起作用,因为 AppWidgetProvider 丢失了 mReceiver 的实例。

编辑:我无法在清单中声明接收器,因为连接更改操作在最近的 Android API 级别的清单中被禁用,所以我必须以编程方式注册它

解决方法: 回答。是的,在onUpdate()中注册一个BroadcastReceiver,每次都会注册一个新的。我通过在 OnEnabled() 中创建广播接收器解决了创建太多广播接收器的问题,因为该代码仅在创建第一个小部件时运行。

下面是我打算取消注册我在 onEnabled 中创建的 broadcastReceiver 的方法。我会在注册时将意图 filter:ACTION_APPWIDGET_DISABLED 添加到 broadcastReceiver 中。在自定义 broadcastReceiver 的 OnReceive() 方法中,我将执行:

@Override
public void onReceive(Context context, Intent intent){
    if(intent.getAction().equals("ACTION_APPWIDGET_DISABLED"){
        context.unregisterReceiver(this);
    }
    else{
        ...
        //Rest of my method
    {

{

在 AppWidgetProvider 中监听连接变化真的是个坏主意,因为他的生命周期与 BroadcastReceiver 相同。 AppWidgetProvider 是类固醇的 BroadcastReceiver,但如果您在 onEnabled() 中动态注册接收器,您的 AppWidgetProvider 实例将很快生效,因此您将不会在一段时间后收到连接更改的任何实际回调。您可以找到更好的选择 .