为什么AppWidgetProvider.onUpdate在添加新的小部件实例时调用了所有小部件实例?

时间:2012-12-13 22:36:35

标签: android android-widget android-appwidget

我注意到每当我将同一AppWidget的新实例添加到主屏幕时,使用所有的ID调用相应的AppWidgetProvider onUpdate方法appWidgetIds中的实例。

reference明确指出:

  

EXTRA_APPWIDGET_IDS要更新的appWidgetIds。这可能是全部   为此提供程序创建的AppWidgets,或仅仅是一个子集。系统   尝试为尽可能少的AppWidget实例发送更新。

这种行为是故意的吗?

有没有办法强制onUpdate仅使用适当的ID进行调用?

是否有办法区分受影响的实例与其他实例?

1 个答案:

答案 0 :(得分:1)

创建小部件有两个选项: 第一个选项是不使用配置活动,然后所有小部件的行为都相似,并且它们都可以立即更新而不会有区别。 第二个是使用配置活动。在那里,您可以通过以下方式获取刚刚从调用的配置活动创建的窗口小部件ID:

Intent intent = getIntent();
Bundle extras = intent.getExtras();
int appWidgetId = extras.getInt(AppWidgetManager.EXTRA_APPWIDGET_ID, AppWidgetManager.INVALID_APPWIDGET_ID);

您可以在sqlite中保存此窗口小部件ID,例如,在配置步骤中定义的此窗口小部件上的其他信息。

所以对于你的问题:

  

这种行为是故意的吗?

我认为答案是''是'。因为在没有配置步骤的情况下创建的窗口小部件应该表现相似,并且onUpdateupdatePeriodMillis中的AppWidgetProviderInfo属性定义的间隔调用onRecieve

  

有没有办法强制只使用适当的ID调用onUpdate?

没有。 from doc我可以知道这种选择不存在。

  

是否有办法区分受影响的实例与其他实例?

是的,您可以决定何时以及更新哪个确切的小部件。您可以通过在小部件提供程序类中使用onRecieve来实现此目的:

  • 使用配置活动并保留每个小部件ID。 或者在窗口小部件中设置onClick事件的挂起意图,并将此意图中的窗口小部件ID传递给活动,然后将其保留。这个想法 - 保存小部件ID,以便稍后能够区分它们。
  • 从您的应用程序(活动,服务,警报管理器......)发送包含您要更新的窗口小部件ID的广播。
  • {{1}}将捕获广播,将获取小部件ID,然后您可以使用小部件提供程序类中的具体小部件。