【问题标题】:android update widget from broadcast receiver来自广播接收器的 android 更新小部件
【发布时间】:2013-09-01 00:16:19
【问题描述】:

我有一个小部件,当android.media.RINGER_MODE_CHANGED 发生操作时,我必须更新该小部件。我有以下广播接收器:

public void onReceive(Context context, Intent intent) {
        AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
        ComponentName thisWidget = new ComponentName(context.getApplicationContext(), ExampleAppWidgetProvider.class);
        int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
        if (appWidgetIds != null && appWidgetIds.length > 0) {
            for (int widgetId : appWidgetIds) {
                RemoteViews remoteViews = new RemoteViews(context
                        .getApplicationContext().getPackageName(),
                        R.layout.widget1);
                appWidgetManager.updateAppWidget(widgetId, remoteViews);
            }
        }
    }

我的小部件的这个 si 代码

public class ExampleAppWidgetProvider extends AppWidgetProvider {
    DateFormat df = new SimpleDateFormat("hh:mm:ss");

    public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
        final int N = appWidgetIds.length;
        for (int i = 0; i < N; i++) {
            int appWidgetId = appWidgetIds[i];
            //my pudate widget code
            appWidgetManager.updateAppWidget(appWidgetId, views);
        }
    }
}

<receiver android:name=".ExampleAppWidgetProvider" android:label="demo widget">
  <intent-filter>
        <action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
  </intent-filter>
  <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget1_info" />
</receiver>

所以我的问题是即使执行了来自我的广播接收器的指令appWidgetManager.updateAppWidget(widgetId, remoteViews);,也不会执行小部件内的更新方法。有人知道为什么吗?

【问题讨论】:

    标签: android widget broadcastreceiver


    【解决方案1】:

    似乎 AppWidgetProvider 扩展了 BroadcastReceiver 所以这是我的代码:

    public class ExampleAppWidgetProvider extends AppWidgetProvider {
        DateFormat df = new SimpleDateFormat("hh:mm:ss");
    
        public void onUpdate(Context context, AppWidgetManager appWidgetManager, int[] appWidgetIds) {
            //my update code here
        }
    
        @Override
        public void onReceive(Context context, Intent intent) {
            AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext());
            ComponentName thisWidget = new ComponentName(context.getApplicationContext(), ExampleAppWidgetProvider.class);
            int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
            if (appWidgetIds != null && appWidgetIds.length > 0) {
                onUpdate(context, appWidgetManager, appWidgetIds);
            }
        }
    }
    
    <receiver android:name=".ExampleAppWidgetProvider" android:label="demo widget">
        <intent-filter>
            <action android:name="android.appwidget.action.APPWIDGET_UPDATE"/>
        </intent-filter>
        <intent-filter>
            <action android:name="android.media.RINGER_MODE_CHANGED"/>
        </intent-filter>
        <meta-data android:name="android.appwidget.provider" android:resource="@xml/widget1_info"/>
    </receiver>
    

    【讨论】:

    • 这段代码会做什么?请解释一下?它会在每次收到广播时调用onupdate方法吗?还是别的什么?
    • 请告诉我这三行的用途
    • AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext()); ComponentName thisWidget = new ComponentName(context.getApplicationContext(), ExampleAppWidgetProvider.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget);
    • 你需要获取这些变量作为onUpdate(context, appWidgetManager, appWidgetIds)方法的参数;
    • 现在必须有更好的方法来做到这一点,但我似乎找不到它。 :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多