【问题标题】:Sending an update broadcast to an app widget向应用小部件发送更新广播
【发布时间】:2020-11-24 04:33:55
【问题描述】:

我有一个带有配置活动的应用小部件,我想在单击活动中的“确定”按钮时触发小部件的更新。我写了这段代码:

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

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

【问题讨论】:

    标签: android android-intent


    【解决方案1】:

    尝试以下方法:

    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,这样您就可以更新所有小部件实例,然后您可以跟踪更新单个小部件实例的问题。

    【讨论】:

    • 这个答案很完美,应该是公认的答案。
    【解决方案2】:

    您是否尝试在 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 */
        }
    }
    

    否则,IMO 最好定义您自己的消息,而不是使用 ACTION_APPWIDGET_UPDATE 来明确小部件更新视图的逻辑,例如,在 1.Declare Intent name in Manifest 文件中:

    <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代表赏金。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多