Java 如何从AppWidgetProvider注销BroadcastReceiver?

Java 如何从AppWidgetProvider注销BroadcastReceiver?,java,android,broadcastreceiver,android-broadcast,android-appwidget,Java,Android,Broadcastreceiver,Android Broadcast,Android Appwidget,我正在AppWidgetProvider onUpdate()方法中声明broadcastReceiver。广播接收器将侦听连接更改 IntentFilter intentFilter = new IntentFilter(connectivityChange); context.getApplicationContext().registerReceiver(mReceiver, intentFilter); 是否每次启动onUpdate()方法时都会创建一个新的broadcastRecei

我正在AppWidgetProvider onUpdate()方法中声明broadcastReceiver。广播接收器将侦听连接更改

IntentFilter intentFilter = new IntentFilter(connectivityChange);
context.getApplicationContext().registerReceiver(mReceiver, intentFilter);
是否每次启动onUpdate()方法时都会创建一个新的broadcastReceiver

如果是这样,我如何取消注册以前的广播,这样我就没有几十个广播接收器了

context.getApplicationContext().unregisterReceiver(mReceiver);
不工作,因为AppWidgetProvider会丢失mReceiver的实例

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

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

下面是我计划如何注销在OneEnabled中创建的broadcastReceiver。我将在注册时向broadcastReceiver添加intent过滤器:ACTION_APPWIDGET_DISABLED。在自定义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,但如果您在OneEnabled()中动态注册receiver,您的AppWidgetProvider实例将很快生效,因此您将不会在一段时间后收到任何连接更改的实际回调。你可以找到更好的选择