web-dev-qa-db-fra.com

Problème lié au widget: BroadcastQueue: exécution en arrière-plan non autorisée: intention de réception

Mon widget d'application ne fonctionne plus après la mise à niveau de targetSDk vers 28. 

  • Il fonctionne parfaitement sur les anciens périphériques TargetDK.

Je reçois l'erreur suivante:

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

androidmanifest.xml contenu du fichier est donné ci-dessous- 

       <!-- 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>

Et mon code de classe reviever (

 @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);
        }
    }
}

Où le fournisseur de widgets d'horloge étend AppWidgetProvider. 

activité de l'horloge mondiale

  private static void sendWidgetRefresh(Context context) {
        // send update broadcast to widget
        Intent broadcast = new Intent(ClockWidgetProvider.WIDGET_DATA_CHANGED_ACTION);
        context.sendBroadcast(broadcast);
    }

projet lien pour référence. A suivi des publications précédentes mais n'a pas fonctionné. 

Oreo - Services de widgets et récepteur de radiodiffusion: interdiction de démarrer le service Intention

5
Biswajit Das

Le problème réside dans la diffusion implicite que vous effectuez dans sendWidgetRefresh . Vous pouvez contourner l'interdiction en définissant un nom de composant dans votre intention.

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);
}
2
HeyAlex