从广播接收器更新Android小部件

8

我有一个小部件,当action 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);
            }
        }
    }

以下是关于我的小部件的代码:

这是我的小部件的代码:

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);,小部件中的更新方法也不会被执行。有人知道为什么吗?

1个回答

19

看起来 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方法吗?还是其他什么操作? - Ankit Srivastava
请告诉我这三行代码的目的。 - Ankit Srivastava
AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context.getApplicationContext()); ComponentName thisWidget = new ComponentName(context.getApplicationContext(), ExampleAppWidgetProvider.class); int[] appWidgetIds = appWidgetManager.getAppWidgetIds(thisWidget); - Ankit Srivastava
1
你需要获取这些变量,以便将它们用作 onUpdate(context, appWidgetManager, appWidgetIds) 方法的参数。 - Buda Gavril
现在肯定有更好的方法来做这件事,但我似乎找不到它。 :-) - A. L. Flanagan

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