如何向多个 WidgetProvider 广播意图
How to broadcast intent to multiple WidgetProviders
我有 2 个小部件,每个小部件都有自己的 WidgetProvider。这是 class 层次结构:
AppWidgetProvider
|
CommonWidgetProvider
| |
WidgetAProvider WidgetBProvider
两个小部件都有一个更新小部件的按钮,但无论您单击哪个小部件,我都想更新所有小部件(WidgetA 和 WidgetB)。
我像这样广播更新意图(在 WidgetA 中):
不用担心 EXTRA_APPWIDGET_IDS
只包含当前小部件的 ID - 我稍后会在 Provider
中检索所有小部件的 ID
// setup click on update icon
Intent intent = new Intent(data.context, WidgetAProvider.class); // how can I broadcast to both A AND B? Now it will broadcast only to A.
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {data.widgetId});
PendingIntent pendingIntent = PendingIntent.getBroadcast(data.context,
data.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.widgetUpdateContainer, pendingIntent);
如何向两个 WidgetProvider 广播此更新?
不要使用 PendingIntent
直接发送广播,因为这样您总是必须明确定位 AppWidgetProvider
之一。
相反,使用 PendingIntent
启动一个 IntentService
向使用某个 IntentFilter
的每个 BroadcastReceiver
发送广播。您可以使用签名权限禁止第三方 BroadcastReceiver
接收您的广播(参见示例 this post)
我有 2 个小部件,每个小部件都有自己的 WidgetProvider。这是 class 层次结构:
AppWidgetProvider
|
CommonWidgetProvider
| |
WidgetAProvider WidgetBProvider
两个小部件都有一个更新小部件的按钮,但无论您单击哪个小部件,我都想更新所有小部件(WidgetA 和 WidgetB)。
我像这样广播更新意图(在 WidgetA 中):
不用担心 EXTRA_APPWIDGET_IDS
只包含当前小部件的 ID - 我稍后会在 Provider
// setup click on update icon
Intent intent = new Intent(data.context, WidgetAProvider.class); // how can I broadcast to both A AND B? Now it will broadcast only to A.
intent.setAction(AppWidgetManager.ACTION_APPWIDGET_UPDATE);
intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_IDS, new int[] {data.widgetId});
PendingIntent pendingIntent = PendingIntent.getBroadcast(data.context,
data.widgetId, intent, PendingIntent.FLAG_UPDATE_CURRENT);
remoteViews.setOnClickPendingIntent(R.id.widgetUpdateContainer, pendingIntent);
如何向两个 WidgetProvider 广播此更新?
不要使用 PendingIntent
直接发送广播,因为这样您总是必须明确定位 AppWidgetProvider
之一。
相反,使用 PendingIntent
启动一个 IntentService
向使用某个 IntentFilter
的每个 BroadcastReceiver
发送广播。您可以使用签名权限禁止第三方 BroadcastReceiver
接收您的广播(参见示例 this post)