5

アプリ ウィジェットに関するインターネット/本でいくつかの例を読みました。ウィジェットを更新する通常の例は、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);    
}

ループ内の各ウィジェットを更新します。

しかし今、アプリ ウィジェットを実装する必要がonReceive(Context context, Intent intent)あります。これは、int[] appWidgetIds が渡されていないため、BroadcastReceiver メソッドで更新されます。したがって、次のようなコードを実装しました。

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);

ウィジェットを 1 つずつ更新するのではなく、実際にはすべてのウィジェットが一度に更新されました。思い通りに動いたのに、なぜ以前のようにすべてのウィジェットを 1 つずつ更新する必要がないのか、私は混乱しました。

2つの方法の違いは何ですか?

から別のブロードキャスト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 に答える