Mon widget d'application ne fonctionne plus après la mise à niveau de targetSDk vers 28.
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é.
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);
}