向应用小部件发送更新广播

6

我有一个带有配置活动的应用程序小部件,并且当在活动中点击“确定”按钮时,我想触发对小部件的更新。 我编写了以下代码:

            Intent initialUpdateIntent=new Intent(AppWidgetManager.
                    ACTION_APPWIDGET_UPDATE);
            initialUpdateIntent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID,
                    widgetID);
            sendBroadcast(initialUpdateIntent);

但是由于某些原因,onUpdate函数没有被调用!有人知道问题可能是什么吗? 谢谢。

3个回答

22

请尝试以下方法:

public static void updateWidgets(Context context) {
    Intent intent = new Intent(context.getApplicationContext(), DayActivitiesAppWidget.class);
    intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
    // Use an array and EXTRA_APPWIDGET_IDS instead of AppWidgetManager.EXTRA_APPWIDGET_ID,
    // since it seems the onUpdate() is only fired on that:
    AppWidgetManager widgetManager = AppWidgetManager.getInstance(context);
    int[] ids = widgetManager.getAppWidgetIds(new ComponentName(context, DayActivitiesAppWidget.class));

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
        widgetManager.notifyAppWidgetViewDataChanged(ids, android.R.id.list);
    }

    intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, ids);
    context.sendBroadcast(intent);
}

用你的AppWidgetProvider类替换DayActivitiesAppWidget,这样你就可以更新所有小部件实例,然后你可以跟踪解决更新单个小部件实例的问题。


1
这个答案很完美,应该被接受为最佳答案。 - Luzian

1
你是否尝试在onReceive中捕获广播消息?
@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    String strAction = intent.getAction();
    if (AppWidgetManager.ACTION_APPWIDGET_UPDATE.equals(strAction)) {
        /* Do update */
    }
}

否则,我认为最好定义自己的消息,而不是使用ACTION_APPWIDGET_UPDATE来清楚地更新小部件视图的逻辑,类似于在1.在清单文件中声明意图名称:
<action android:name="com.yourdomain.youapp.SETTING_UPDATE" />

2.定义意图名称:

public static final String SETTING_UPDATE = "com.yourdomain.youapp.SETTING_UPDATE";

3. 在 onReceive 中处理:

@Override
public void onReceive(Context context, Intent intent) {
    super.onReceive(context, intent);
    String strAction = intent.getAction();
    if (SETTING_UPDATE.equals(strAction)) {
        /* Do update setting */
    }
}

希望它有所帮助 ^^


我尝试了这个但不起作用,我已经发布了一个问题。既然你似乎对小部件有很好的掌握,你考虑看看它吗?这个问题已提供50声望奖励。谢谢。 - Jakob Harteg

0
只是为了澄清上面@forcewill的回答:不要使用。
Intent intent = new Intent("any custom action string");

使用常见的意图声明方式:
Intent intent = new Intent(context, 'your_widget_provider'.class);
        intent.setAction("put action string here");
        intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, appWidgetIds);
        sendBroadcast(intent);

这样发送广播即使没有将动作字符串添加到清单中也能正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接