如何从AppWidgetProvider中注销BroadcastReceiver?

时间:2018-06-29 08:54:03

标签: java android broadcastreceiver android-broadcast android-appwidget

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

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

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

如果是这样,我如何注销先前的广播,以使我没有几十个广播接收器?

context.getApplicationContext().unregisterReceiver(mReceiver);

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

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

2 个答案:

答案 0 :(得分:0)

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

这是我计划注销在onEnabled中创建的broadcastReceiver的方式。注册时,我会将意图过滤器: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
    {

{

答案 1 :(得分:0)

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