5

我在互联网/书籍中阅读了一些关于 App Widget 的示例,更新小部件的正常示例是onUpdate(Context context, AppWidgetManager appWidgetManager,int[] appWidgetIds)AppWidgetProvider 的方法,如下所示:

final int N = appWidgetIds.length;
for (int i=0; i<N; i++) {
 int appWidgetId = appWidgetIds[i];
 RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidget_layout);
 updateViews.setTextViewText(R.id.mytext, "updated text");

 appWidgetManager.updateAppWidget(appWidgetId, updateViews);    
}

它循环更新每个小部件。

但是现在,我必须实现一个 App Widget,它在 BroadcastReceiveronReceive(Context context, Intent intent)方法中更新,因为没有传入 int[] appWidgetIds。所以我实现了这样的代码:

RemoteViews updateViews = new RemoteViews(context.getPackageName(), R.layout.mywidget_layout);
updateViews.setTextViewText(R.id.mytext, "updated text");

ComponentName myComponentName = new ComponentName(context, AndroidBatteryWidgetProvider.class);
AppWidgetManager manager = AppWidgetManager.getInstance(context);
manager.updateAppWidget(myComponentName, updateViews);

它没有逐个更新小部件,但实际上所有小部件都一次更新。即使它按我的意愿工作,但我对为什么不需要像以前一样一个一个地更新所有小部件感到困惑。

两种方法有什么区别?

我可以发送另一个广播BroadcastReceiver.onReceive()来触发AppWidgetProvider.onUpdate()吗?怎么做?

4

1 回答 1

0

这是同一件事。使用 ComponentName 更新会像您的第一个代码块一样遍历所有 id。

您可以在此处的 Android 代码中看到它:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.0.4_r1.2/com/android/server/AppWidgetService.java#AppWidgetService.updateAppWidgetProvider%28android。 content.ComponentName%2Candroid.widget.RemoteViews%29

于 2012-06-08T11:36:01.490 回答