【问题标题】:Widget onUpdate not called after Configuration配置后未调用小部件 onUpdate
【发布时间】:2017-08-23 16:22:05
【问题描述】:

我想创建一个具有两种小部件尺寸(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))

【问题讨论】:

  • 你解决了吗?
  • 不,我没有解决。

标签: android


【解决方案1】:

在我自己遇到这个之后,我不得不做一些研究。

我首先观察到在配置活动完成后没有调用 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);

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

【讨论】:

    猜你喜欢
    • 2017-06-27
    • 2012-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多