当前位置: 首页 > 知识库问答 >
问题:

小部件问题:BroadcastQueue:不允许后台执行:接收意图

钦德佑
2023-03-14

我的应用程序小部件在升级到targetSDk到28后停止工作。

  • 它可以在旧的targetsdk设备上完美地工作。
W/BroadcastQueue: Background execution not allowed: receiving Intent { act=ch.corten.aha.worldclock.WIDGET_DATA_CHANGED flg=0x10 } to ch.corten.aha.worldclock/.WorldClockWidgetProvider
W/BroadcastQueue: Background execution not allowed: receiving Intent { act=ch.corten.aha.worldclock.WIDGET_DATA_CHANGED flg=0x10 } to ch.corten.aha.worldclock/.WeatherWidgetProvider
       <!-- clock widget -->
    <receiver
        android:name=".WorldClockWidgetProvider"
        android:exported="false"
        android:label="@string/clock_widget_name" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
        </intent-filter>
        <intent-filter>
            <action android:name="ch.corten.aha.worldclock.WIDGET_DATA_CHANGED" />
        </intent-filter>
        <intent-filter>
            <action android:name="ch.corten.aha.worldclock.CLOCK_TICK" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/world_clock_appwidget_info" />
    </receiver>
<receiver
        android:name=".WeatherWidgetProvider"
        android:enabled="@bool/enable_weather_widget"
        android:exported="false"
        android:label="@string/weather_widget_name" >
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_DISABLED" />
        </intent-filter>
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_ENABLED" />
        </intent-filter>
        <intent-filter>
            <action android:name="ch.corten.aha.worldclock.WIDGET_DATA_CHANGED" />
        </intent-filter>
        <intent-filter>
            <action android:name="ch.corten.aha.worldclock.CLOCK_TICK" />
        </intent-filter>

        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/weather_appwidget_info" />
    </receiver>
 @Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    if (WIDGET_DATA_CHANGED_ACTION.equals(intent.getAction())
            || CLOCK_TICK_ACTION.equals(intent.getAction())) {
        PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
        if (pm.isScreenOn()) {
            onClockTick(context);
        }
    }
}
  private static void sendWidgetRefresh(Context context) {
        // send update broadcast to widget
        Intent broadcast = new Intent(ClockWidgetProvider.WIDGET_DATA_CHANGED_ACTION);
        context.sendBroadcast(broadcast);
    }

项目链接供参考。跟随以前的帖子,但没有工作。

Oreo-widget服务和广播接收器:不允许启动服务意图

共有1个答案

羊舌子瑜
2023-03-14

问题出在SendWidgetRefresh中进行的隐式广播中。您可以通过在意图中定义组件名称来突破禁令。

private static void sendWidgetRefresh(Context context) {
    // send update broadcast to widget
    Intent broadcast = new Intent(ClockWidgetProvider.WIDGET_DATA_CHANGED_ACTION);
    ComponentName componentName = new ComponentName(context, WorldClockWidgetProvider.class);
    broadcast.setComponent(componentName);
    context.sendBroadcast(broadcast);
}
 类似资料:
  • 我的小部件应用程序运行良好的所有android版本,除了8奥利奥。我得到一条消息。 CommonsWare有一个有趣的博客,但我不完全明白为什么它适用于我的情况。https://commonsware.com/blog/2017/04/11/android-o-implicit-broadcast-ban.html TestWidgetReceiver.java manifest.xml:

  • 我读过关于Android Oreo后台执行限制的文章,它明确指出广播不受影响,但我无法让它在Android Oreo上工作。 首先,我是在SDK27上编译的。其次,我在清单文件中声明了接收者: 然后是接收器的实现,也可以简单到: 在运行时注册广播意图,让它工作(在模拟器上,从adb shell激发意图),但我不确定这是否是正确的方法: 这个有什么已知的bug吗?

  • 我有一个监控wifi连接的小部件,所以我启动了一项服务来启动广播接收器来检测网络变化。除了我退出主应用程序外,一切都正常:服务停止。 因此,我在小部件中启动了一个报警管理器,它几乎每分钟都会唤醒一次,并检查主应用程序是否已退出。如果是这种情况,我尝试重新启动我的wifi监控服务,但这次它崩溃了,并显示以下消息: 不允许开启服务Intent{cmp=包。CallbackNetworkWidgetSe

  • 问题内容: 我被错误卡住了,这里的第42行是,请帮我解决这个问题,我在这个问题上待了几个小时。 这是我的代码: 问题答案: 一个对象只能有一个active对象,因此在执行时,第一个ResultSet()被关闭。 创建两个对象,一个用于,另一个用于。 引用以下内容的javadoc : 默认情况下,每个对象只能同时打开一个对象。因此,如果一个对象的读取与另一对象的读取交错,则每个对象必须已由不同的对象

  • 问题内容: 我对让Docker能够访问外部文件感兴趣,但是我不希望将它们作为卷包含在内。我需要访问的文件会随着时间变化,这意味着我将需要反复重新安装,除非我只能安装一个目录,而且该目录中的任何内容也会被安装。 我只需要允许将软件程序推送到容器中,以“在”我的本地系统上运行,该软件程序可以访问我的本地系统上的文件。 忠告?除了添加需要作为卷处理的文件之外,还有其他方法吗? 问题答案: 我用以下命令解