配置后未调用Widget onUpdate

时间:2017-08-23 16:22:05

标签: android

我想创建一个具有两个小部件大小(4x2和4x4)的应用 为此,我创建了两个接收器:

    <receiver android:name=".widgets.CloudWidgetProviderLarge" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_large" />
    </receiver>

    <receiver android:name=".widgets.CloudWidgetProviderMedium" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
        </intent-filter>
        <meta-data
            android:name="android.appwidget.provider"
            android:resource="@xml/widget_medium" />
    </receiver>

一个配置活动:

<activity android:name=".widgets.WidgetConfigurationActivity">
    <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_CONFIGURE"/>
    </intent-filter>
</activity>

两个widgetProviders继承自我的抽象WidgetBaseProvider,只实现不同的部分。

我的问题如下:
具体WidgetProvider类的onUpdate方法在配置活动启动时调用,但在配置完成时不调用。因此,在完成配置时不会更新小部件。

到目前为止我在WidgetConfigurationActivity中尝试过的内容:
这不会导致更新。不知道它有什么问题:

val appWidgetManager = AppWidgetManager.getInstance(this)
val views = RemoteViews(this.packageName, R.layout.widget_newscloud)
appWidgetManager.updateAppWidget(widgetData.widgetId, views)
val result = Intent().putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, widgetData.widgetId)
setResult(Activity.RESULT_OK, result)
finish()

这很有效但很明显只适用于一种小部件类型:

val providerLarge = CloudWidgetProviderLarge()
providerLarge.onUpdate(this, appWidgetManager, intArrayOf(widgetId))

1 个答案:

答案 0 :(得分:0)

遇到这个问题后,我不得不做一些研究。

我首先观察到config活动完成后未调用onUpdate。 然后我找到了答案。 https://stackoverflow.com/a/12236443/2052088 但是我发现这并不能100%地解决它,然后我发现这个答案https://stackoverflow.com/a/44516844/2052088完成了解决方案。

两者结合:

Intent intent = new Intent(this, YourWidgetProvider.class);
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
int[] ids = AppWidgetManager.getInstance(this)
        .getAppWidgetIds(new ComponentName(this, YourWidgetProvider.class));
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
intent.setFlags(Intent.FLAG_RECEIVER_FOREGROUND);
sendBroadcast(intent);

我知道已经过去两年了,但是希望它能对某人有所帮助。