【问题标题】:How to unregister BroadcastReceiver from AppWidgetProvider?如何从 AppWidgetProvider 注销 BroadcastReceiver?
【发布时间】:2023-04-09 11:07:01
【问题描述】:

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

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

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

如果是,如何注销之前的广播,让我没有几十个broadcastReceiver?

context.getApplicationContext().unregisterReceiver(mReceiver);

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

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